散列(hash)是常用的算法之一,我们在写代码的时候都会有意或者无意的使用散列。
so?什么情况下会使用呢?
例如,给你两组整数,一组N个整数,一组M个整数,N,M均小于10的与5次方,查询那些数字是在N中出现过而在M中没有出现的。
最先想到是俩for循环,这种方法到N和M比较小的时候可行,但是到M,N为10000时,算法时间复杂度为O(M*N),显然是不可取的。
那么,怎么办? ——————用空间换时间
定义一个bool型数组,bool Tbale[100010],那么Table[x]=ture;表示正数x在N个整数中出现过,在写入N是即创建该表,
查询的时间复杂度是O(M),所以总的时间复杂度O(M+N)。
CODE:
#include <stdio.h>
#include<iostream>
#include <string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
bool Table[10010]={false};
int main(){
int n,m;
cin>>n>>m;//读取n和m;
int nx;
for(int i=0;i<n;i++){
cin>>nx;
Table[nx]=true;
}
int mx;
for(int i=0;i<m;i++){
cin>>mx;
if(Table[mx]=true){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}
2017/12/13学习笔记 参考《算法笔记》