zoukankan      html  css  js  c++  java
  • 五大查找

    查找

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

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

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

     

  • 相关阅读:
    多个EditText 监听矛盾的 解决办法 (Overstack)溢出栈
    JZ2440 裸机驱动 第5章 GPIO接口
    从头调试stm32 HID
    嵌入式GPIO接口及操作(二)
    嵌入式GPIO接口及操作(一)
    嵌入式linux网络配置
    嵌入式开发环境搭建之安装交叉编译工具链
    securecrt鼠标右键的配置
    S3C2440上LCD驱动(FrameBuffer)实例开发讲解(一)
    s3c2440串口详解
  • 原文地址:https://www.cnblogs.com/biggan/p/7382335.html
Copyright © 2011-2022 走看看