0

需要知道有没有一种方法可以在不使用两个循环的情况下计算数组中项目的频率。这是在不知道数组大小的情况下。如果我知道数组的大小,我可以使用 switch 而不循环。但我需要更多功能。我认为修改快速排序可能会产生更好的结果。

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+=;
}

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

4

3 回答 3

1

使用地图或哈希表来实现这一点。插入键作为数组项,插入值作为频率。

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

于 2013-06-20T04:48:31.890 回答
0

我将构建一个以数组中的项目为键的映射,其值是该项目的计数。遍历数组以构建包含计数的映射。对于每个项目,查看它在地图中的计数,增加计数,然后将新计数放回地图中。

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

于 2013-06-20T04:52:10.987 回答
0

我并不是说这比使用地图或哈希表更好(尤其是当有很多重复项时,尽管在这种情况下你可以使用某些技术接近 O(n) 排序,所以这也不算太糟糕),这只是一种选择。

  • 对数组进行排序

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

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

    • 如果找到不同的元素,则存储前一个元素及其计数并将计数设置为 1

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

于 2013-06-20T14:03:13.837 回答