2013-06-20 24 views
0

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

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

如果您可以评论或提供更好的解决方案将是非常有益的。

+0

一些语言提供更高的结构来实现这一点,如果你能使用一个哈希表,你将不再需要2路 – DevZer0

回答

1

使用映射或散列表来实现这一点。插入键作为数组项和值作为频率。

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

0

我会构建一个由数组中项目键入的映射,其值为该项目的计数。一次传递数组来构建包含计数的映射。对于每个项目,看看它在地图上的数量,增加计数,并将新的计数放回地图。

地图放置和获取操作可以是不变的时间(例如,如果您使用具有良好散列函数和适当大小的后备存储的散列地图实现)。这意味着你可以计算与数组中元素数量成正比的频率。

0

我并不是说这比使用映射表或散列表更好(特别是当存在大量重复项时,但在这种情况下,您可以使用某些技术来接近O(n)排序,所以这是也不是太差),它只是一个选择。

  • 排序数组

  • 使用(单)for循环通过数组排序

    • 迭代如果发现相同的元素与前一个,增加当前计数

    • 如果您发现不同的元素,请存储上一个元素及其计数并将计数设置为1

    • 在循环结束后,保存前一个元素,其计