散列表

    散列表又叫哈希表,它是为了减少搜索空间,但又考虑到时间上设立的。
   
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. }





原文地址:https://www.cnblogs.com/yml435/p/4655565.html