• 散列表


        散列表又叫哈希表,它是为了减少搜索空间,但又考虑到时间上设立的。
       
    http://codeplayer.org/2013/11/210 参考网页
    1. #include <stdlib.h>
    2. #include <stdio.h>
    3. #define m 17
    4. //#define HASH(k) k % m //除法散列法
    5. #define A 0.85
    6. //#define HASH(k) (int)(m * (k * A - (int)(k * A))) //乘法散列法
    7. #define c1 7
    8. #define c2 5
    9. //#define h(k, i) (HASH(k) + i) % m //线性探查
    10. //#define h(k, i) (HASH(i) + c1 * i + c2 * i * i) % m //二次探查
    11. #define h1(k) k % m
    12. #define h2(k) 1 + (k % (m - 1))
    13. #define h(k, i) (h1(k) + i * h2(k)) % m //双重散列
    14. #define DEL -65535
    15. int
    16. hash_insert(int *T, int k)
    17. {
    18. /*
    19. * 在散列表中插入一个元素,不断的探查
    20. * 以找到一个空槽可以插入,或者探查了
    21. * 整个散列表,输出错误信息并退出
    22. */
    23. int i, j;
    24. for (i = 0; i != m; i++) {
    25. j = h(k, i);
    26. if (T[j] == NULL || T[j] == DEL) {
    27. T[j] = k;
    28. return(j);
    29. }
    30. }
    31. fprintf(stderr, "hash table overflow ");
    32. exit(1);
    33. }
    34. int
    35. hash_search(int *T, int k)
    36. {
    37. /*
    38. * 在散列表中查找一个元素,不断进行
    39. * 探查,直到找到该元素,或者探查到
    40. * 了一个空槽,或者找遍了整个散列表
    41. */
    42. int i, j;
    43. for (i = 0; i != m; i++) {
    44. j = h(k, i);
    45. if (T[j] == k) {
    46. printf("found value: %d in key: %d ", k, j);
    47. return(j);
    48. } else if (T[j] == NULL) {
    49. break;
    50. }
    51. }
    52. fprintf(stderr, "can't find value: %d ", k);
    53. return(NULL);
    54. }
    55. int
    56. hash_delete(int *T, int k)
    57. {
    58. /*
    59. * 删除一个元素的时候并不将它置为NULL,
    60. * 因为这有可能会使得在查找的时候找不到
    61. * 后续的元素,查找在删除的地方就中断了。
    62. * 可以在删除的时候将其置为一个特殊的值,
    63. * 以避免这种情况。这里用的是DEL。
    64. */
    65. int i, j;
    66. for (i = 0; i != m; i++) {
    67. j = h(k, i);
    68. if (T[j] == k) {
    69. T[j] = DEL;
    70. return(0);
    71. }
    72. }
    73. fprintf(stderr, "can't find %d in hashtable ", k);
    74. exit(1);
    75. }
    76. void
    77. print_hash(int *T)
    78. {
    79. int i;
    80. printf("---------------hashtable--------------- ");
    81. for (i = 0; i < m; i++) {
    82. if (T[i] != NULL && T[i] != DEL)
    83. printf("key: %2d, value: %4d ", i, T[i]);
    84. else
    85. printf("key: %2d, value: NULL ", i);
    86. }
    87. printf("------------------end------------------ ");
    88. }
    89. int
    90. main(void)
    91. {
    92. /*
    93. * 用数组实现的简单的开放寻址法的散列表
    94. */
    95. int i;
    96. int T[m];
    97. for (i = 0; i < m; i++) {
    98. T[i] = NULL;
    99. }
    100. hash_insert(T, 28);
    101. hash_insert(T, 438);
    102. hash_insert(T, 923);
    103. hash_insert(T, 239);
    104. hash_insert(T, 29);
    105. hash_insert(T, 31);
    106. hash_insert(T, 32);
    107. hash_insert(T, 39);
    108. hash_insert(T, 2);
    109. hash_insert(T, 24);
    110. hash_insert(T, 432);
    111. print_hash(T);
    112. hash_delete(T, 239);
    113. hash_delete(T, 31);
    114. hash_delete(T, 28);
    115. printf(" after delete 239, 31, 28... ");
    116. print_hash(T);
    117. hash_search(T, 438);
    118. hash_search(T, 239);
    119. exit(0);
    120. }
    1. #include<iostream>
    2. #include<string>
    3. #define m 17
    4. #define A 0.85
    5. #define c1 7
    6. #define c2 5
    7. #define h1(k) k%m
    8. #define h2(k) 1+(k%(m-1))
    9. #define h(k,i) (h1(k) + i * h2(k)) % m //#define h(k,i) (h1(k)+i)%m //这是一个一次线性查找。
    10. #define DEL -65535
    11. int hash_insert(int *T,int k){ //插入数据,得找位置进行插入。
    12. int i,j;
    13. for(int i=0;i<m; i++){
    14. j=h(k,i);
    15. if(T[j]==NULL||T[j]==DEL){ //因为如果中间我们删了一些数据,那么我们标为DEL了,于是我们就可以再在这里插入。
    16. T[j]=k;
    17. return (j);
    18. }
    19. }
    20. if(i==m){//如果数组越界,则结束。
    21. std::cout<<"error,out of range"<<std::endl;     
    22. return DEL;
    23. }
    24. }
    25. bool hash_search(int *T,int k){ //这里我们进行查找
    26. int i=0,j;
    27. for(int i=0;i<m; i++){
    28. j=h(k,i);
    29. if(T[j]==k){ //如果找到就可以了,找不到就返回
    30. std::cout<<j<<std::endl;
    31. return true;
    32. }
    33. else if(T[j]=NULL){// 如果找到一个NULL,因为我们插入是“顺序”插入的,因此找到一个NULL,则后面也是没有了的。
    34. break;
    35. }
    36. }
    37. if(i==m||T[j]==NULL){
    38. std::cout<<"not found"<<std::endl;
    39. return false;
    40. }
    41. }
    42. bool delete_Hash(int *T,int k){
    43. int i,j;
    44. for(int i=0;i<m; i++){
    45. j=h(k,i);
    46. if(T[j]==k){
    47. T[j]=DEL; //用特殊符号进行标志,说明这里删除了一个数。
    48. return true;
    49. }
    50. }
    51. if(i==m){ //如果越界了,则说明数组完了。
    52. std::cout<<"not found"<<std::endl;
    53. return false;
    54. }
    55. }
    56. void hash_print(int *T){
    57. for(int i=0;i<m; i++){
    58. std::cout<<T[i]<<",";
    59. }
    60. std::cout<<std::endl;
    61. }
    62. int main(){
    63. int i;
    64. int T[m];
    65. for (i = 0; i < m; i++) {
    66. T[i] = NULL;
    67. }
    68. hash_insert(T, 28);
    69. hash_insert(T, 438);
    70. hash_insert(T, 923);
    71. hash_insert(T, 239);
    72. hash_insert(T, 29);
    73. hash_insert(T, 31);
    74. hash_insert(T, 32);
    75. hash_insert(T, 39);
    76. hash_insert(T, 2);
    77. hash_insert(T, 24);
    78. hash_insert(T, 432);
    79. std::cout<<hash_search(T,2)<<std::endl;
    80. hash_print(T);
    81. hash_search(T,11);
    82. }





  • 相关阅读:
    Android 导入工程文件引用包出错
    Android调用系统的打电话和发短信界面(1.将消息内容带过去2.实现群发)
    Android检查手机上是否安装了第三方软件的方法------本文以百度地图为例
    Java中的枚举使用详解
    Android 调用手机上第三方百度地图并传值给地图
    将myeclipse中不适用的插件禁用掉
    WPF DataGridTemplateColumn
    WPF Binding控件某个属性
    WPF VisualStateManager
    WPF Action
  • 原文地址:https://www.cnblogs.com/yml435/p/4655565.html
Copyright © 2020-2023  润新知