PTA 雜湊查詢 除留取餘法

2022-06-05 20:42:06 字數 2593 閱讀 3029

pta **聊天狂人(25 分)

給定大量手機使用者聯絡歷史,找出其中通話次數最多的聊天狂人。

輸入首先給出正整數n(≤10​5​​),為聯絡歷史條數。隨後n行,每行給出一條聯絡歷史。簡單起見,這裡只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。

在一行中給出聊天狂人的手機號碼及其通話次數,其間以空格分隔。如果這樣的人不唯一,則輸出狂人中最小的號碼及其通話次數,並且附加給出並列狂人的人數。

4

13005711862 13588625832

13505711862 13088625832

13588625832 18087925832

15005713862 13588625832

思路分析:

本題要找通話次數最多的號碼,如果這樣的號碼不唯一,就找最小的號碼,想到用雜湊表進行儲存。

**如下:

1

//本題採用除留取餘法構造雜湊函式,使用分離鍊錶法解決衝突

23 #include 4 #include 5 #include 6 #include 7

8using

namespace

std;

910 typedef char elementtype[keylength+1]; /*

*/11 typedef int index; /*

雜湊位址型別

*/12

13#define maxtablesize 1000000

1415 typedef struct lnode *ptrtolnode;

16struct

lnode17;

22typedef ptrtolnode position;

23typedef ptrtolnode list;

2425 typedef struct tblnode *hashtable; /*

雜湊表型別

*/26

struct tblnode /*

雜湊表結點定義

*/27;31

32 index hash(int k, int tablesize ) //

雜湊函式

3336

37int nextprime(int n) //

選取乙個產生衝突較少的素數,作為表長

3848

if(i*i>j)

49return

j;50

else

51 j+=2; //

素數每次加2,減少迴圈次數52}

53}54position find(hashtable h,elementtype key,index k)

5561

return

p;62}63

void

insert(hashtable h,elementtype key)

6470 index k=hash(sum,h->tablesize);

71 position p=find(h,key,k);

72if(!p)

7383

else

84 p->cnt++;85}

86 hashtable buildtable(int

m)87

100return

h;101

}102

103int

main()

104115

//cout<

int maxnum=0

;117

int ans=0

;118

for(int i=0; itablesize; i++)

119129

else

if(p->cnt==maxnum)

130135 p=p->next;

136}

137//

cout<

}139

//cout<

%s %d

",key,maxnum);

141if(ans>1

)142 printf("%d"

,ans);

143 printf("\n"

);144

return0;

145}

146147

/*148

4149

13005711862 13588625832

15013005711862 13088625832

15113588625832 18087925832

15213005711862 13588625832

153154

*/

view code

堅持不懈地努力才能成為大神!

資料結構 雜湊表(除留取餘法 鏈位址法)

include using namespace std 雜湊函式的構造方法 除留取餘法 typedef struct node node typedef struct hash table hash table 初始化雜湊表 hash table inithashtable 在雜湊表中查詢資料 no...

雜湊表除留取餘法的桶個數為什麼是質數

可先科普下質數的概念 質數,也就是素數,就是指乙個大於1的自然數,約數 因數 只有1和它自己,否則叫合數。除留取餘,就是雜湊函式將關鍵字被某個不大於雜湊表長m的數p除后所得餘數為雜湊位址。這是最常用 也最簡單的構造雜湊函式的方法。當然,也可以對關鍵字直接取模,也可以摺疊 平方取中等運算後取模。那麼問...

除2取餘法

要求 給乙個十進位制數n,求出n二進位制各個數字的和 方法 除以2取餘法,將值相加即可 include using namespace std intmain cout ans endl return0 eg 6 110,有2個1 1023 1111111111,有10個1。如果把每位的數值做標記 ...