【发布时间】:2017-11-09 02:49:24
【问题描述】:
我在优化 go 地图时遇到了一些问题。
我想在字符串数组中生成一个频率表(计算不同的出现次数)。我的代码非常适合小型数组,但是当我开始使用 100k+ 结构(具有许多不同的值)时,它的性能还不够。
现在,我的方法是生成一个具有不同值的数组,比较值并增加计数器变量(映射到字符串)。
counter := make( map[string]int )
for _, distinct := range distinctStrArray{
for _, row := range StrArray{
if (row == distinct){
counter[distinct]++
}
}
}
我尝试了另一种方法,其中输入数组之前已排序(以尽量减少对地图的更改次数)。这有点快。
count:=0
for _, distinct := range distinctStrArray{
for _, row := range StrArray{
if (row == distinct){
count++
}
}
counter[distinct] += count
count= 0
}
你对我可以做些什么来优化一个简单的 count(distinct) 类型问题有什么建议吗...?我对任何事情都持开放态度。
谢谢!
【问题讨论】:
-
在第二个示例中,您在找到匹配项后继续迭代,如果输入已排序,则这是不必要的。如果
row != distinct && count > 0可以中断,因为这将是找到匹配项后的第一个不匹配项,并且如果输入已排序,则此后将不会有任何匹配项。 -
拥有两个数组的目的是什么? map 已经保证了不同的键,为什么不直接使用呢?