计算数组中的不同值-性能提示

mik:

我在优化路线图时遇到了一些问题。
我想在一个字符串数组中生成一个频率表(计数不同的事件)。我的代码非常适合小型数组,但是当我开始使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章