二分法搜索与哈希表的使用
在寻找排序数组中的某一个数字的时候可以使用二分法与哈希表的方式,哈希表时间复杂度是o(1),但是空间复杂度增大了,需要把所有存入哈希表内,而二分法就比较简单了,只需要进行折半查找。
哈希表:
从头到尾遍历每个数据,存入哈希表,下表当做key,数组中的值当做value,直接搜索就能求得位置。
二分法:
比如数组M[n]中0~n-1的数据,寻找m,第一次搜索看M[(n-1)/2]与M[m]之间的大小,如果大于M[m],则到[0~(n-1)/2-1]之间寻找,此时再求两个端点位置的中间值假设是t,判断M[t]与M[m]的大小,如果小于M[m]的话,则到[t+1,(n-1)/2-1]之间寻找,........,一直确定区间,寻找中间值,总能找到我们要求得值,这样效率非常高。
代码(哈希表):
class solution
{
public:
int FindLocationOfK(vector<int> M,int k)
{
int length=M.length();
int hash[length];
for(int i=0;i<length;i++)
{
if(hash[M[i]]!=hash[M[i-1]])
{
hash[M[i]]=i;
}
}
return hash[k];
}
}
代码(二分法):
class solution
{
public:
int FindLocationOfK(vector<int> M,int k)
{
int start=M.start;
int end=M.end;
int mid=(start+end)/2;
while(M[mid]!=k)
{
if(M[mid]>k)
{
start=start;
end=mid-1;
}
else
{
start=mid+1;
end=end;
}
mid=(start+end)/2;
}
return mid;
}
}