查找
1.顺序查找:O(n);
这种非常简单,就是过一下数组,一个一个的比,找到为止。
2.折半查找:O(NlogN)+O(logN)或者O(logN);
第一: 数组必须有序,不是有序就必须让其有序,大家也知道最快的排序也是NLogN的,所以.....呜呜。
第二: 这种查找只限于线性的顺序存储结构。
代码实现:
不需要用递归,while循环就能实现。
int BinarySearch(int a[],int key,int len)
{
int low=0,high=len-1,mid;
while(low<high)
{
mid=(low+high)/2;
if(a[mid]==key)
return a[mid];
if(a[mid]>key)
high=mid;
if(a[mid]<key)
low=mid+1;
}
return -1; //不能找到
}
Ps:线性查找分为顺序查找和折半查找。
3.哈希查找:O(1);
哈希查找是通过计算数据元素的存储地址进行查找的一种方法。O(1)的查找,即所谓的秒杀。哈希查找的本质是先将数据映射成它的哈希值。哈希查找的核心是构造一个哈希函数,它将原来直观、整洁的数据映射为看上去似乎是随机的一些整数。
哈希查找的操作步骤:
1) 用给定的哈希函数构造哈希表;
2) 根据选择的冲突处理方法解决地址冲突;
3) 在哈希表的基础上执行哈希查找。
建立哈希表操作步骤:
1) step1 取数据元素的关键字key,计算其哈希函数值(地址)。若该地址对应的存储空间还没有被占用,则将该元素存入;否则执行step2解决冲突。
2) step2 根据选择的冲突处理方法,计算关键字key的下一个存储地址。若下一个存储地址仍被占用,则继续执行step2,直到找到能用的存储地址为止。
哈希查找步骤为:
1) Step1 对给定k值,计算哈希地址 Di=H(k);若HST为空,则查找失败;若HST=k,则查找成功;否则,执行step2(处理冲突)。
2) Step2 重复计算处理冲突的下一个存储地址 Dk=R(Dk-1),直到HST[Dk]为空,或HST[Dk]=k为止。若HST[Dk]=K,则查找成功,否则查找失败。
下面是采用哈希法存储数据并实现查找的示例。实现哈希函数用“除法取余法”,解决冲突为“开放地址法”。
- #include <iostream>
- using namespace std;
- int searchHash(int h[], int l, int key);
- void insertHash(int h[], int l, int data);
- int main()
- {
- const int hashLength = 13;//哈希表长度
- int hashTable[hashLength]={0};
- int m, n;
- //创建hash
- for (int i = 0; i < 6; i++)
- {
- cin>>n;
- insertHash(hashTable, hashLength, n);
- }
- cin>>m;
- int result = searchHash(hashTable,hashLength, m);
- if (result != -1)
- cout<<"已经在数组中找到,位置为:" << result<<endl;
- else
- cout<<"没有此原始"<<endl;
- return 0;
- }
- int searchHash(int h[], int l, int key)
- {
- // 哈希函数
- int hashAddress = key % l;
- // 指定hashAdrress对应值存在但不是关键值,则用开放寻址法解决
- while (h[hashAddress] != 0 && h[hashAddress] != key)
- {
- hashAddress = (++hashAddress) % l;
- }
- // 查找到了开放单元,表示查找失败
- if (h[hashAddress] == 0)
- return -1;
- return hashAddress;
- }
- // 数据插入Hash表
- void insertHash(int h[], int l, int data)
- {
- // 哈希函数
- int hashAddress = data % l;
- // 如果key存在,则说明已经被别人占用,此时必须解决冲突
- while (h[hashAddress] != 0)
- {
- // 用开放寻址法找到
- hashAddress = (++hashAddress) % l;
- }
- // 将data存入字典中
- h[hashAddress] = data;
- }
4.索引查找:
5.二叉排序树:
满足:若根节点有左子树,则左子树的所有节点都比根节点小。
若根节点有右子树,则右子树的所有节点都比根节点大。