博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
五大查找
阅读量:7172 次
发布时间:2019-06-29

本文共 2087 字,大约阅读时间需要 6 分钟。

查找

 

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=Hk);若HST为空,则查找失败;若HST=k,则查找成功;否则,执行step2(处理冲突)。

2)       Step2 重复计算处理冲突的下一个存储地址 Dk=RDk-1),直到HST[Dk]为空,或HST[Dk]=k为止。若HST[Dk]=K,则查找成功,否则查找失败。

 

 

下面是采用哈希法存储数据并实现查找的示例。实现哈希函数用“除法取余法”,解决冲突为“开放地址法”。

  1. #include <iostream>  
  2. using namespace std;  
  3. int searchHash(int h[], int l, int key);  
  4. void insertHash(int h[], int l, int data);  
  5. int main()  
  6. {  
  7. const int hashLength = 13;//哈希表长度  
  8. int hashTable[hashLength]={0};  
  9. int m, n;  
  10. //创建hash  
  11. for (int i = 0; i < 6; i++)  
  12. {  
  13. cin>>n;  
  14. insertHash(hashTable, hashLength, n);  
  15. }  
  16. cin>>m;  
  17. int result = searchHash(hashTable,hashLength, m);  
  18. if (result != -1)  
  19. cout<<"已经在数组中找到,位置为:" << result<<endl;  
  20. else  
  21. cout<<"没有此原始"<<endl;  
  22. return 0;  
  23. }  
  24. int searchHash(int h[], int l, int key)  
  25. {  
  26. // 哈希函数  
  27. int hashAddress = key % l;  
  28. // 指定hashAdrress对应值存在但不是关键值,则用开放寻址法解决  
  29. while (h[hashAddress] != 0 && h[hashAddress] != key)  
  30. {  
  31. hashAddress = (++hashAddress) % l;  
  32. }  
  33. // 查找到了开放单元,表示查找失败  
  34. if (h[hashAddress] == 0)  
  35. return -1;  
  36. return hashAddress;  
  37. }  
  38. // 数据插入Hash表  
  39. void insertHash(int h[], int l, int data)  
  40. {  
  41. // 哈希函数  
  42. int hashAddress = data % l;  
  43. // 如果key存在,则说明已经被别人占用,此时必须解决冲突  
  44. while (h[hashAddress] != 0)  
  45. {  
  46. // 用开放寻址法找到  
  47. hashAddress = (++hashAddress) % l;  
  48. }  
  49. // 将data存入字典中  
  50. h[hashAddress] = data;  
  51. }  

 

4.索引查找:

5.二叉排序树:

满足:若根节点有左子树,则左子树的所有节点都比根节点小。

若根节点有右子树,则右子树的所有节点都比根节点大。

 

转载于:https://www.cnblogs.com/biggan/p/7382335.html

你可能感兴趣的文章
Linux的安装以及部署一
查看>>
python之if测试
查看>>
mvn常用命令
查看>>
电脑操作的“奇技淫巧”
查看>>
软件外包项目管理指引
查看>>
遍历DOM树,each()遍历
查看>>
设计模式 3.4 Prototype(原型)-对象创建模式
查看>>
手势UIGestureRecognizer
查看>>
mongo 手册阅读笔记
查看>>
js获取当前日期、前一天、后一天的日期的例子
查看>>
viewport ——视区概念
查看>>
解决FusionCharts联动的中文乱码.
查看>>
山东理工ACM【1135】C/C++经典程序训练5---图形打印问题
查看>>
利用MAC 上的Safari调试iOS 的webView程序
查看>>
情商的管理
查看>>
html的meta标签的charset应该用UTF-8还是utf-8?
查看>>
由浅入深理解java集合(一)——集合框架 Collection、Map
查看>>
CSS强制英文、中文换行与不换行 强制英文换行
查看>>
.net向android的转型(1)
查看>>
页面跳转到Area区域连接
查看>>