2010-07-22 191 views
2

這個問題讓我回到了我的大學時代,但是自從那些日子以來(20多年前)我還沒有編碼,我有點生疏了。選擇元素在數組中有更多重複元素C

基本上我有一個256個元素的數組。數組中可能有1個元素,即14或256.該數組包含從系統請求數據的用戶的用戶名。我正在計算列表中的重複項,以便我可以優先考慮大多數請求的用戶。所以,如果我有一個列表如:

{john, john, paul, james, john, david, charles, charles, paul, john} 

我會選擇約翰,因爲它出現了4次。 我可以迭代數組並將元素複製到另一個元素並開始計數,但一段時間後會變得複雜。正如我所說,我很生鏽。

我相信有一個簡單的方法來做到這一點。有任何想法嗎?代碼在這裏會非常有幫助。 謝謝!

編輯:

緩衝區被聲明爲:

static WCHAR userbuffer[150][128]; 

可能有多達150個用戶,並且每個用戶名是高達128個字符長。

+0

的地圖是由鍵排序,而不是價值。 – 2010-07-22 13:32:58

+1

@Guillaume Lebourgeois我想我的大腦暫時不工作:D謝謝。 – AraK 2010-07-22 13:33:46

回答

2

這是我會怎麼解決這個問題:

首先,定義一個結構來保存用戶名和頻率計數,使他們的陣列具有相同數量的元素你userbuffer陣列(在你的榜樣150)。現在

struct user { 
    WCHAR name[128]; 
    int  count; 
} users[150]; 

,遍歷userbuffer併爲每個條目,檢查,看看是否有users具有相同name的條目。如果找到匹配項,請在users中增加該條目的count。如果找不到匹配項,請將用戶名userbuffer複製到users的空白條目中,並將該用戶的count設置爲1

在處理完整個userbuffer陣列後,可以使用users陣列中的count值查看誰的請求最多。您可以手動遍歷它以查找最大值或使用qsort

這不是最有效的算法,但它是直接的,不會做任何太聰明或奇特的事情。

編輯: 要快速排序的users數組,你需要定義一個簡單的函數,快速排序可以使用排序。在這個例子中,這樣的事情應該工作:

static int compare_users(const void *p1, const void *p2) { 
    struct user *u1 = (struct user*)p1; 
    struct user *u2 = (struct user*)p2; 

    if (u1->count > u2->count) 
     return 1; 
    if (u1->count < u2->count) 
     return -1; 
    return 0; 
} 

現在,你可以通過這個功能來qsort,如:

qsort(users, 150, sizeof(struct user), compare_users); 
+0

好吧,我有結構填充正確的數據(約翰= 4,保羅= 2,詹姆斯= 1等)我正在嘗試qsort(),但我遇到了麻煩。你將如何檢查struct []。count中最大的值(如果有的話)? – 2010-07-22 18:46:51

+0

謝謝,我實際上只是通過比較計數和保存該數字和索引int來完成它,並在循環結束時對它們進行結構化和放大。謝謝您的幫助! – 2010-07-22 19:08:32

-1

按照AraK提出的使用std::map,您可以不重複地存儲您的名字,並將您的名字與一個值相關聯。

一個簡單的例子:

std::map<string, long> names; 

names["john"]++; 
names["david"]++; 

然後,您可以搜索的鍵具有最大的價值。

+0

問題被標記爲C,而不是C++ – Doomsday 2010-07-22 13:44:30

+0

由於mraleph說他有點生疏,並且沒有編碼20年,我想他可以欣賞C++的答案,並且沒有限制在C中做這個... – 2010-07-22 14:06:29

+0

感謝答案,但正如我注意到的那樣,這是在C – 2010-07-22 15:43:15

7

1 - 排序你的數組。

2 - set maxcount = 0;

3 - 迭代數組並計數直到visitNEXT用戶名。

4 - 如果count> maxcount,則設置maxcount進行計數並將名稱保存爲候選項。

5 - 循環完成後,提取候選人。

+0

是的,這在純C中相當容易,這要歸功於qsort()庫函數。更快的選項是使用散列表,但它需要更多的工作(除非使用第三方庫)。 – 2010-07-22 13:50:02

+0

好的。我在這裏感到困惑。你有一個可以做到這一點的片段嗎? – 2010-07-22 15:44:07

+0

他會不會讓用戶的最大數量。如何讓用戶優先獲得第二名? 他將不得不再次迭代。我認爲這是可以避免的。 – 2010-07-22 15:52:47

0

你的意思是「陣列上可能有1個元素,14或256」。是14和256元素數字?

如果您可以更改數組定義,我認爲最好的方法是定義 一個包含兩個字段username和numberOfRequests的結構。當用戶請求時,如果列表中存在用戶名,numberOfRequest將會增加。如果這是用戶第一次請求用戶名,則應將其添加到列表中,並且numberOfRequests將爲1.

如果您不能更改數組定義,則可以使用快速排序或其他算法對數組進行排序。在此之後很容易計算請求的數量。

但是,也許有一個圖書館具有此功能,但我懷疑你可以在標準圖書館找到一些東西!

+0

我的意思是,在任何給定的時間該數組可能會部分填充,完全或根本沒有 – 2010-07-22 14:25:32