2013-12-23 58 views
3

嘿,這是我第一篇文章。我已經被分配練習用來計算c編程語言中最常用的單詞。首先我需要閱讀一個數字,告訴我需要閱讀多少個單詞。那麼我需要使用最大元素大小爲50的calloc。之後,我讀取了字符串。我最初的想法是創建一個一維數組,然後按字母順序排序,然後計算並打印出最頻繁的單詞。但經過幾個小時的研究,我發現我需要使用一個二維數組,事情失控了。我已經學習了3個月的計算機科學,這個練習似乎很難。你有沒有其他建議?例子是這樣的:找不到最頻繁的詞

10 
hello 
world 
goodbye 
world 
thanks 
for 
all 
hello 
the 
fish 

你好 到目前爲止我的代碼是

int main() 
{ 
    int i, n, j, temp; 
    int *a; 

    printf("Eisagete to plhthos twn leksewn:"); 
    scanf("%d",&n); 

    a = (int*)calloc(n,50); 
    printf("Eisagete tis %d lekseis:\n",n); 
    for(i=0 ; i < n ; i++) 
    { 
     scanf("%d",&a[i]); 
    } 

    for (i = 0 ; i < (n - 1); i++) 
    { 
    for (j = 0 ; j < n - i - 1; j++) 
    { 
     if (a[j] > a[j+1]) 
     { 
     temp = a[j]; 
     a[j] = a[j+1]; 
     a[j+1] = temp; 
     } 
    } 
    } 

不介意他們在希臘的printfs輸出,他們就在那裏,使它看起來更好。我也想指出,這個版本是用於整數,而不是爲了剛剛開始的字符串。 即時通訊正在嘗試線性搜索,但我不知道它是否會有所幫助

+0

你不能從字符串中讀取整數;嘗試添加一個atoi呼叫。 '#include '然後使用'int atoi(con​​st char * nptr);' –

+2

歡迎使用Stack Overflow。請儘快閱讀[關於]頁面。還有其他非常密切相關的問題(例如[讀取文本文件和輸出的單詞數量,不同的單詞和最常用的單詞](http://stackoverflow.com/questions/19106830/read-text-file-and-輸出數字 - 不同詞語和最頻繁的工作?rq = 1)列在'相關'),這可能會幫助你。我認爲這不是唯一的這樣的問題。 –

+0

您能否確切地說明在運行此代碼時發生了什麼?你似乎在整理整數數組,但你在哪裏計算事件? – Arkadiy

回答

2

正如您所指出的,您顯示的代碼與讀取和排序整數有關;它只與計算單詞問題鬆散相關。

你會如何計算每個數字的出現?你必須

  • 閱讀下一個數字;
  • 如果您已經擁有該號碼的計數,則爲該號碼添加一個計數;
  • 如果您之前沒有看到過該號碼,則爲其創建一個計數並將其計數設置爲1。
  • 當讀取所有數字時,您搜索整套統計數據,查找數量最多的統計數據。
    • 記錄第一個條目的數量和數量。
    • 對於每個後續條目:
    • 如果計數大於當前最大值,請記錄新的最大計數和條目。
  • 打印關於具有最大計數和該計數的數字的信息。

用單詞替換數字和一般大綱將非常相似。您可以分別爲每個字符串(不同的單詞)分配存儲空間。

隨着時間流逝,很容易計算不同單詞的數量或單詞總數。請注意,你不需要存儲所有的單詞;你只需要存儲不同的單詞。而名單前面的計數是計算機科學教育走入歧途;你不需要計數來使它工作(但是你可能必須忍受它在數據中;最簡單的事情就是忽略第一行輸入,因爲它根本沒有什麼幫助)。下一個最簡單的事情就是要注意,除非他們對你有所幫助,否則不同單詞的最大數量將是指定的數字,所以你可以預先分配你需要的所有空間。

+0

非常感謝你的回答。你的回答是非常有用的,我認爲這個選擇可能會更好。但是由於我必須在不到半個小時的時間內提交項目,所以我不能及時重寫代碼。但我會嘗試在聖誕節後使用你所說的話,因爲我不會在假期再學習。非常感謝:) – Pyrromanis

0

很簡單。將你的單詞存儲在一個二維數組中,循環遍歷它,並且每次從當前索引開始再次循環一遍,並檢查是否有相等的單詞循環。子循環結束後,檢查發生次數是否大於上次最大值。

#include <stdio.h> 

int main() 
{ 
    int i, j, occurrence=0, maximum = 0; 
    char *index_max = NULL; 
    char wl[10][10] = {"hello","world","goodbye","world","thanks","for","all","hello","the","world"}; 

    for (i=0; i<10; i++){ 
     occurrence = 0; 
     for (j=i; j<10; j++){ 
      if (!strcmp(*(wl+i), *(wl+j))){ 
       occurrence++; 
      } 
     } 
     if (occurrence>maximum){ 
      maximum = occurrence; 
      index_max = *(wl+i); 
     } 
    } 
    if (index_max != NULL){ 
     printf("The most frequent word is \"%s\" with %d occurrences.\n", index_max, maximum); 
    } 

    return 0; 
} 
+0

這是一個O(N * N)或O(N^2)算法,對於幾十個單詞可以正常工作,但即使是幾百個單詞也是災難性的,更不用說數千或數百萬字。在最壞的情況下,它應該在O(N * logN)時間內可行,我相信(N個單詞中的每一個的日誌時間查找)。 –

+0

所以有什麼更好! – rullof

+0

我在回答中簡要概括了一下。正如我所說,你得到的東西只需幾個字就行,但如果單詞列表增長,它會變得非常慢。對數時間搜索需要某種二進制搜索(可能是堆);其餘的是線性的而不是二次的。 –