散列可以用空间来换取时间,比如 :给出N个镇正整数,再给出M个正整数,问着M个数中的每个数分别数是否在N个数中出现过。
如果之间进行查询遍历,时间复杂度为O(MN),当MN很大时,显然是无法承受的。
那么就用空间复杂度对时间复杂度进行转换,即设定一个bool类数组hashtable【100010】,其中hashtable【x】=true表示正整数x在N个正整数中出现过,而hashtable【x】=false表示正整数x在N个正整数中没有出现过。显然这种做法的时间复杂度为O(N+M),代码如下:
- #include<cstdio>
- const int maxn=100010;
- int hashtable[maxn]={0};
- int main(){
- int n,m;
- scanf("%d%d",&n,&m);
- for(int i=0;i<n;i++){
- int temp;
- scanf("%d",&temp);
- hashtable[temp]++;
- }
- for(int i=0;i<m;i++){
- int temp;
- scanf("%d",&temp);
- printf("%d\n",hashtable[temp]);
- }
- return 0;
- }