计算数组中项目的频率 - 没有两个for循环

时间:2013-06-20 04:44:06

标签: algorithm complexity-theory frequency counting

需要知道有没有办法在不使用两个循环的情况下计算数组中项目的频率。这是不知道数组的大小。如果我知道阵列的大小,我可以使用开关而不循环。但我需要比这更多才多艺。我认为修改快速排序可能会带来更好的结果。

Array[n];

TwoDArray[n][2];

第一个循环将继续使用Array [],而第二个循环是查找元素并增加二维数组中的计数。

max = 0;
for(int i=0;i<Array.length;i++){

found= false;

for(int j=0;j<TwoDArray[max].length;j++){

if(TwoDArray[j][0]==Array[i]){
TwoDArray[j][1]+=;
found = true;
break;
}
}

if(found==false){
TwoDArray[max+1][0]=Array[i];
TwoDArray[max+1][1]=1;
max+=;
}

如果您能评论或提供更好的解决方案将非常有帮助。

3 个答案:

答案 0 :(得分:1)

使用map或hash表来实现这一点。将键作为数组项插入,将值作为频率插入。

如果数组元素的范围不是太大,也可以使用数组。增加与数组元素对应的索引的值计数。

答案 1 :(得分:0)

我会构建一个由数组中的项目键入的地图,并使用一个值作为该项目的计数。一次遍历数组以构建包含计数的地图。对于每个项目,查看它在地图中的计数,增加计数,并将新计数放回地图。

map put和get操作可以是恒定的时间(例如,如果你使用具有良好散列函数和适当大小的后备存储的散列映射实现)。这意味着您可以按照与阵列中元素数量成比例的时间计算频率。

答案 2 :(得分:0)

我并不是说这比使用地图或哈希表更好(特别是当有很多重复项时,虽然在这种情况下你可以用某些技术接近O(n)排序,所以这不是太糟糕了,它只是一个替代方案。

  • 对数组进行排序

  • 使用(单个)for循环遍历排序的数组

    • 如果找到与前一个元素相同的元素,请增加当前计数

    • 如果您找到其他元素,请存储前一个元素及其计数并将计数设置为1

    • 在循环结束时,存储前一个元素及其计数