• Day16:hash表


    一、基础概念

    1.hash表:

            既是数据结构 又是算法   哈希法  散列表 散列法
            特点:查找效率非常高     

    2.应用:

                    编程语言的函数查找、加密解密、非对称加密    

                    任何数据   生成  固定长度的一个串  sha1  md5

    3.关键的三要素:

            ①数据范围
            ②合适的hash函数     查找数据的方式    返回数据存放地址
            ③解决冲突的办法
                   不同数据 通过第二步的hash函数返回地址相同  要区分存储

     二、代码实例:

    存储十进制整数:(可能出现的数字0-9999)
        三层数组   利用十进制数每个位上的数在 0-9之间 这种规律

    ①数据的范围:0-9999

    ②hash函数:数组下表的映射

    ③解决冲突的方法:

            最后一个节点变成一个链表去存储(依次去遍历即可.)。

     可能的冲突是,705和1705的冲突等等类似的

    1. #include
    2. #include
    3. #include
    4. //解决冲突 用链表
    5. struct Node
    6. {
    7. int data;
    8. Node* pNext;
    9. };
    10. //hash表结构
    11. struct HashTable
    12. {
    13. Node**** pArr;
    14. };
    15. //Node* arr[10][10][10];
    16. Node* createNode(int data);
    17. //初始化hash表
    18. void initHash(HashTable* pHash);
    19. //往hash表中放数据
    20. void push(HashTable* pHash, int data);
    21. //hash函数
    22. Node* findDataFromHash(HashTable* pHash, int data);
    23. int main()
    24. {
    25. HashTable hash;
    26. initHash(&hash);
    27. int n;
    28. int data;
    29. Node* pTemp;
    30. while (1)
    31. {
    32. printf("1 - 插入\n");
    33. printf("2 - 查找\n");
    34. printf("3 - 退出\n");
    35. scanf("%d", &n);
    36. switch (n)
    37. {
    38. case 1:
    39. printf("请输入插入数据:"); scanf("%d", &data);
    40. push(&hash, data);
    41. printf("插入完毕!\n");
    42. break;
    43. case 2:
    44. printf("请输入查找数据:"); scanf("%d", &data);
    45. pTemp = findDataFromHash(&hash, data);
    46. if (pTemp)
    47. {
    48. printf("找到了:%d!\n",pTemp->data);
    49. }
    50. else
    51. {
    52. printf("木有找到\n");
    53. }
    54. break;
    55. case 3:
    56. return 0;
    57. break;
    58. }
    59. }
    60. while (1);
    61. return 0;
    62. }
    63. //往hash表中放数据
    64. void push(HashTable* pHash, int data)
    65. {
    66. //1 创建节点
    67. Node* pNew = createNode(data);
    68. //2 寻址
    69. int bai = data / 100 % 10;
    70. int shi = data / 10 % 10;
    71. int ge = data % 10;
    72. Node* pTemp = pHash->pArr[bai][shi][ge];
    73. if (pTemp)
    74. {//3 解决冲突
    75. //3.1 找到最后一个节点
    76. while (pTemp->pNext) pTemp = pTemp->pNext;
    77. //3.2 新节点成为最后一个节点的下一个节点
    78. pTemp->pNext = pNew;
    79. }
    80. else
    81. {//本来为空,说明没有数据
    82. pHash->pArr[bai][shi][ge] = pNew;
    83. }
    84. }
    85. //hash函数
    86. Node* findDataFromHash(HashTable* pHash, int data)
    87. {
    88. int bai = data / 100 % 10;
    89. int shi = data / 10 % 10;
    90. int ge = data % 10;
    91. Node* pTemp = pHash->pArr[bai][shi][ge];
    92. while (pTemp)
    93. {
    94. if (data == pTemp->data) return pTemp;
    95. pTemp = pTemp->pNext;
    96. }
    97. return NULL;
    98. }
    99. //初始化hash表
    100. void initHash(HashTable* pHash)
    101. {
    102. pHash->pArr = (Node****)malloc(sizeof(Node***)* 10);//第一层
    103. for (int i = 0; i < 10; i++)
    104. {
    105. pHash->pArr[i] = (Node***)malloc(sizeof(Node**)* 10);//第二层
    106. for (int j = 0; j < 10; j++)
    107. {
    108. pHash->pArr[i][j] = (Node**)malloc(sizeof(Node*)* 10);//第三层
    109. memset(pHash->pArr[i][j], 0, sizeof(Node*)* 10);
    110. }
    111. }
    112. }
    113. Node* createNode(int data)
    114. {
    115. Node* pNew = (Node*)malloc(sizeof(Node));
    116. pNew->data = data;
    117. pNew->pNext = NULL;
    118. return pNew;
    119. }

     

  • 相关阅读:
    蛋白质宇宙
    【SSM框架】Mybatis详解08(源码自取)之动态sql详解
    vue3+te项目正式开发
    概率 | 考研 —— 复习知识点及方法 大总结
    MySQL数据库(表的CRUD基础操作(最常用))
    codeblock图形界面编程(六)基于ege库的进阶绘图
    Docker从认识到实践再到底层原理(九)|Docker Compose 容器编排
    Python 博客园备份迁移脚本
    墨水屏技术在贴片厂的创新应用探索
    码科速送同城跑腿小程序 v3.2.8+用户端+接单端 安装测试教程
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/126314462