线性搜索
O(N)(引入标记后效率提升数倍(第二种))
void Linear(int S[], int T[], int ns, int nt)
{
for(int i=0; i<nt; i++)
{
/*
//第一种
for(int j=0; j<ns; j++)
{
if(S[j]==T[i])
{
a.push_back(S[j]);
break;
}
}
*/
//第二种(速度快)
int j=0;
S[ns] = T[i];//标记,用于以下失败时退出循环
while(T[i]!=S[j] ) j++;
if(j!=ns) a.push_back(S[j]);
}
}
二分搜索
O(Nlog(N))
特点模板数组先排序,才可以使用二分搜索
int Binary(int S[], int T[], int ns, int nt)
{
int sum = 0;
for(int i=0; i<nt; i++)//搜索的元素来源的数组T
{
int left = 0;
int right = ns;
int mid;
while(left<right)//left为数组起始下标,right为数组末尾元素下标加一
{
mid = (left+right)/2;
if(T[i]>S[mid])
{
left = mid+1;
}
else if(T[i]<S[mid])
{
right = mid;
}
else
{
sum++;//计数T和S共有的元素的个数
break;
}
}
}
return sum;
}
散列法
O(1)
重点是哈希函数的构造,我
//哈希函数
h1(key)
return key%m
h2(key)
return 1+(key%(m-1))
h(key, i)
return (h1(key)+i*h2(key))%m
insert(T, key)//使用哈希函数插入该值,用i来解决冲突
i = 0
while true
j = h(key, i)
if T[j] == NIL
T[j] = key
return j
else
i = i+1
search(T, key)//使用哈希函数查找该值(搜索)
i = 0
while true
j = h(key, i)
if T[j] == key//找到该值
return j
else if T[j]==NIL or i>=m//该位置处为空,说明不存在该值
return NIL
else//冲突,即该位置出存的是其他值
i = i+1
STL部分
- sort默认升序排列,可以自键函数来排序。如下函数实现降序排列(>代表降序排序)
bool cmp(int x, int y){
return x>y;
}
- STL提供了binary_search、lower_bound、upper_bound。
头文件:#include<algorithm>
binary_search(A, A+n, indx)
A: 数组首地址;n: 数组元素个数;indx: 需要查找的值。
函数功能: 在数组中以二分法检索的方式查找,若在数组(要求数组元素非递减)
中查找到indx元素则返回true,若查找不到则返回值为false。
lower_bound(A, A+n, p)
:返回一个迭代器,该迭代器指向第一个不小于p值的元素,如果均小于p,该迭代器指向最后一个元素的下一个元素。对于数组,返回的是地址,可以使用lower_bound(A, A+n, p)-A
求下标。
upper_bound(A,A+n,p)
:返回一个迭代器,该迭代器指向第一个大于p值的元素,如果没有大于p的值,该迭代器指向最后一个元素的下一个元素。
参考博文:C++ STL中的Binary search(二分查找)