2013-06-20 57 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

    • 在循環結束後,保存前一個元素,其計