我在优化路线图时遇到了一些问题。
我想在一个字符串数组中生成一个频率表(计数不同的事件)。我的代码非常适合小型数组,但是当我开始使用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)类型问题有任何建议吗?我对任何事情都开放。
谢谢!
没有更多上下文,我将转储不同值的单独数组-生成它需要花费时间,而使用它则需要嵌套循环。假设第二个数组没有其他用途,我将使用类似以下的方法:
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)),对于较大的数据集,这应该是一个显着的改进。但是,与任何优化一样:测试,测量,分析和优化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句