【哈希表】CodeVs1230元素查找

1、寫在前面

哈希表(Hash Table),又稱散列表,是一種能夠快速處理插入和查詢操做的數據結構。哈希表體現着函數映射的思想,它將數據與其存儲位置經過某種函數聯繫起來,其在查詢時的高效性也體如今這裏。換言之,咱們創建一個函數關係(稱之爲散列函數):data—>address,將數據和其存儲位置關聯;查詢時,咱們只須要根據咱們創建的函數關係就能經過data查詢到address。html

可見,散列函數的創建直接影響着哈希表的效率。當咱們的散列函數創建得足夠優時,哈希表在插入和查詢上的時間複雜度都能被降爲O(1)。經常使用的創建散列函數的方法有以下幾種:node

一、直接尋址法:直接取數據或數據的某種線性函數做爲散列函數;算法

二、平方取中法:對數據平方,取其中間幾位做爲散列函數;數據結構

三、摺疊法:將數據拆開成幾部分,再從新組合;ide

四、除留取餘法:用數據對一個大質數取模,將餘數做爲散列函數。 函數

本篇blog採用除留取餘法創建散列函數。spa

顯然,因爲函數是一種容許多個自變量對應同一應變量的關係,在插入和查詢時,存儲位置的衝突便不可避免。當發生衝突時,咱們一般用如下兩種方法解決:code

一、錯位法:即當正在讀入的數據與之前已經插入表中的數據衝突時,咱們從發生衝突的存儲位置開始向某個方向尋找一個空存儲位置,將當前讀入的數據插入其中;htm

二、拉鍊法:結合鏈表的思想,將全部相互發生衝突的數據拉成一條鏈。blog

哈希表的優勢很明顯,就是它在插入和查詢室常數級別的時間複雜度。然而它的缺點也很明顯,包括沒法存儲相同的元素,沒法排序,並且極佔用空間。因此想要熟練運用哈希表也不是一件容易的事情,下面咱們不妨看一道模板題。

2、題目

Description

給出n個正整數,而後有m個詢問,每一個詢問一個整數,詢問該整數是否在n個正整數中出現過。

Input Description

第一行兩個整數 n 和m。

第二行n個正整數(1<=n<= 100000)

第三行m個整數(1<=m<=100000)

Output Description

一共m行,若出現則輸出YES,不然輸出NO

Sample Input

4 2

2 1 3 4

1 9

Sample Output

YES

NO

Data Size & Hint

全部數據都不超過10^8

附上原題連接→_→|1230 元素查找|CODEVS,算法愛好者社區

3、代碼實現

 1 #include<stdio.h>
 2 #define MAX 100010
 3 #define p 10000007
 4 int n,m;
 5 struct node 
 6 {
 7     int next;
 8     int data;
 9 };
10 int st[p],cnt;
11 node tab[MAX];
12 int ans;
13 int getHashAddress(int x){return x%p;}//散列函數 
14 void insert(int x)//插入元素 
15 {
16     int address=getHashAddress(x);
17     for(int i=st[address];i;i=tab[i].next)//判斷元素是否在表中 
18         if(tab[i].data==x)return;
19     tab[++cnt].next=st[address];//拉鍊 
20     st[address]=cnt;
21     tab[cnt].data=x;
22 }
23 bool find(int x)//查詢元素 
24 {
25     int address=getHashAddress(x);
26     for(int i=st[address];i;i=tab[i].next)
27         if(tab[i].data==x)return true;
28     return false; 
29 }
30 int main()
31 {
32     scanf("%d%d",&n,&m);
33     for(int i=1;i<=n;++i)
34     {
35         int x;
36         scanf("%d",&x);
37         insert(x);
38     }
39     for(int i=1;i<=m;++i)
40     {
41         int x;
42         scanf("%d",&x);
43         if(find(x))printf("YES");
44         else       printf("NO");
45         printf("\n");
46     }
47     return 0;
48 } 
CodeVs1230 元素查找

弱弱地說一句,本蒟蒻碼字也不容易,轉載請註明出處http://www.cnblogs.com/Maki-Nishikino/p/5999356.html

相關文章
相關標籤/搜索