我在优化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
}
您是否有任何建议我可以采取哪些措施来优化简单的计数(不同)类型问题......?我对任何事都持开放态度 谢谢!
答案 0 :(得分:4)
如果没有更多的上下文,我会转储不同值的单独数组 - 生成它需要时间,并且使用它需要嵌套循环。假设第二个阵列没有其他目的,我会使用类似的东西:
counter := make( map[string]int )
for _, row := range StrArray {
counter[row]++
}
如果您需要不同字符串的列表而没有用于某些单独目的的计数,您可以在以后轻松获取它:
distinctStrings := make([]string, len(counter))
i := 0
for k := range counter {
distinctStrings[i] = k
i++
}
迭代不同字符串的数组是O(n),而按键映射访问是O(log(n))。这使得你的整体从O(n ^ 2)到O(n * log(n)),这对于较大的数据集应该是一个显着的改进。但是,与任何优化一样:测试,测量,分析,优化。