五大查找

查找

 

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.二叉排序树:

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

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

 

posted on 2017-08-17 16:15  bigganbing  阅读(183)  评论(0编辑  收藏  举报