散列归纳

散列可以用空间来换取时间,比如   :给出N个镇正整数,再给出M个正整数,问着M个数中的每个数分别数是否在N个数中出现过。

如果之间进行查询遍历,时间复杂度为O(MN),当MN很大时,显然是无法承受的。

那么就用空间复杂度对时间复杂度进行转换,即设定一个bool类数组hashtable【100010】,其中hashtable【x】=true表示正整数x在N个正整数中出现过,而hashtable【x】=false表示正整数x在N个正整数中没有出现过。显然这种做法的时间复杂度为O(N+M),代码如下:

  1. #include<cstdio>  
  2. const int maxn=100010;  
  3. int hashtable[maxn]={0};  
  4. int main(){  
  5.     int n,m;  
  6.     scanf("%d%d",&n,&m);  
  7.     for(int i=0;i<n;i++){  
  8.         int temp;  
  9.         scanf("%d",&temp);  
  10.         hashtable[temp]++;  
  11.     }  
  12.     for(int i=0;i<m;i++){  
  13.         int temp;  
  14.         scanf("%d",&temp);  
  15.         printf("%d\n",hashtable[temp]);  
  16.     }  
  17.     return 0;  
  18. }  

猜你喜欢

转载自blog.csdn.net/qq_36926514/article/details/79433034