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

时间:2017-06-07 16:14:20

标签: go count maps

我在优化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
    } 

您是否有任何建议我可以采取哪些措施来优化简单的计数(不同)类型问题......?我对任何事都持开放态度 谢谢!

1 个答案:

答案 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)),这对于较大的数据集应该是一个显着的改进。但是,与任何优化一样:测试,测量,分析,优化。