用hash表統計文字檔案中每個單詞出現的頻率

2021-09-30 07:59:14 字數 1752 閱讀 8204

閒來無事,敲兩行**解解愁。

今天介紹一種用自已建立的hash表(hash鍊錶)來統計乙個輸入文字檔案中每個單詞出現的頻率,hash表的構造詳見《程式設計珠璣》第15章。

一、主體思路:

(1)建立乙個hash表;

--(a) hash函式:除留取餘法,h(key) = key % size;

(2)讀取文字檔案word.txt,每次讀取一行,然後分隔每個單詞,插入到hash表,插入過程中會對單詞出現次數統計;

(3)將整個hash表內容寫到乙個文字檔案result.txt中。

二、資料結構及演算法實現

(1)hash表

--(a) hash表大小(hashnumber):採用乙個大質數作為表的總容量,本例中為hashnumber29989;

#define hashnumber 29989 //雜湊表的大小,29989為質數。

#define mult 31 //hash函式的乙個乘子。

typedef struct hashnode

char * word;//單詞

int count;//出現頻率

struct hashnode *next;//指向鍊錶中具有相同hash值的下個節點

}hashnode,*hashnodeptr ;

hashnodeptr bin[hashnumber] = ;//hashnumber大小的指標陣列

作為hash表。

--(b) hash函式:將每個單詞對映為乙個小於hashnumber的正整數;

unsigned int hashindex(const char * pword)//返回hash表索引(即hash指標陣列的下標)。

--(c) 向hash表中插入單詞。

void

insertword (const

char * pword )//

在hash 表中插入單詞,如果已經存在了,則增加單詞的出現次數count 。

}p = (hashnodeptr )malloc (sizeof (hashnode ));//hash

表中不存在該單詞,建立節點。

p ->count = 1;//出現次數設定為1。

p ->word = (char *)malloc (strlen (pword )+1);

strcpy (p ->word ,pword );

p ->next = bin [index ];//將新生成的節點插入到index為下標的鍊錶中去。

bin [index ] = p ; }

(2)讀取data.txt中的單詞,並將每個單詞插入到(1)中設計好的hash表中。

void

readwordtohashtable (const

char *path )

while (null != fgets (buf ,sizeof (buf ),fp ))//資料讀完,到文字末尾了

}fclose (fp ); }

(3) 將hash表中對每個單詞的統計資訊寫入到文字檔案中。

void

writehashtable (const

char *path )

for (i =0;i

}fclose (fp ); }

(4)釋放hash表中占用的記憶體

void freehashtable()//釋放hash表所占用記憶體。}}

(5)main函式中。

intmain (void )

用python清洗文字檔案

對此,首先需要熟悉一些python基本的字串操作。在python中,字串用引號 或 來表示,並可通過類似陣列的方式進行索引,對此我們先建立乙個字串 test txt檔案csdn.com清csd.com洗csdn.com test 2 tx 我們要做的就是刪除字串中所有的 csdn.com pytho...

統計給定文字檔案中漢字的個數

漢字機內碼在計算機的表達方式的描述是,使用二個位元組,每個位元組最高位一位為1.計算機中,補碼第一位是符號位,1 表示為負數,所以 漢字機內碼的每個位元組表示的十進位制數都是負數 所以這題也就可以簡化為輸入字串判斷其中字元轉化為十進位制數是否小於零.注意 漢字是有兩個小於零的字元組成,所以在統計結果...

用MemoryStream傳遞文字檔案內容

原因 要求將服務端生成的文字檔案改為在客戶端生成。文字檔案的內容都來自服務端,原 段以stream.writeline string 方法寫入檔案。如果以string為引數傳遞到客戶端,而後使用相同方法,可以實現要求。但考慮嘗試以流為引數,傳遞文字檔案內容。思路 以不與檔案關聯的memorystre...