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

问题描述 投票:0回答:1

我在优化go map时遇到了一些问题。 我想在一个字符串数组中生成一个频率表(计算不同的出现次数)。我的代码很适合小数组,但是当我开始使用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
    } 

你有什么建议我可以做些什么来优化简单计数(明显)类型的问题......?我对任何事都持开放态度。 谢谢!

go count maps
1个回答
5
投票

如果没有更多的上下文,我会转储单独的不同值数组 - 生成它需要时间,并且使用它需要嵌套循环。假设第二个阵列没有其他用途,我会使用类似的东西:

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

© www.soinside.com 2019 - 2024. All rights reserved.