当前位置:   article > 正文

哈希表(hash_table) 哈希存储 算法相关知识 稳定性 时间复杂度

哈希表(hash_table) 哈希存储 算法相关知识 稳定性 时间复杂度

哈希存储(散列存储)

为了快速定位数据

哈希表

哈希冲突 / 哈希矛盾

关键字不一样,但是映射之后结果一样

如何避免 哈希矛盾?

1、重新设计哈希函数,尽可能均匀散列分布在哈希表

2、开放定址法:向下寻找未存储的位置进行存放数据

3、链地址法: 将数据链表的首地址存入哈希表,只需将数据结点往链表后链接即可

  1. #include "head.h"
  2. #include "hash.h"
  3. HASH_NODE *hash_table[HASH_SIZE] = {NULL};
  4. int hash_fun(char ch)
  5. {
  6. if(ch>'a' && ch<='z')
  7. {
  8. return ch - 'a';
  9. }
  10. else if(ch > 'A' && ch <= 'Z')
  11. {
  12. return ch - 'A';
  13. }
  14. else
  15. {
  16. return HASH_SIZE - 1;
  17. }
  18. }
  19. /*建立haxi表插入数据*/
  20. int insert_hash_table(DATA_TYPE data)
  21. {
  22. HASH_NODE *pnode = malloc(sizeof(HASH_NODE));
  23. if(NULL == pnode)
  24. {
  25. perror("fail malloc");
  26. return -1;
  27. }
  28. pnode->data = data;
  29. pnode->pnext = NULL;
  30. int addr = hash_fun(data.name[0]);
  31. pnode -> pnext = hash_table[addr];
  32. hash_table[addr]= pnode;
  33. }
  34. /* 遍历 */
  35. void hash_table_for_each()
  36. {
  37. int i = 0;
  38. for( i = 0; i<HASH_SIZE;i++)
  39. {
  40. HASH_NODE *ptmp = hash_table[i];
  41. while(ptmp!=NULL)
  42. {
  43. printf("%s ",ptmp->data.name);
  44. printf("%s ",ptmp->data.tel);
  45. printf("%s ",ptmp->data.addr);
  46. printf("%d ",ptmp->data.age);
  47. ptmp = ptmp -> pnext;
  48. }
  49. printf("\n");
  50. }
  51. }
  52. /*查找*/
  53. void find_hash_table_message(char *name)
  54. {
  55. HASH_NODE *ptmp = NULL;
  56. ptmp = hash_table[hash_fun(*name)];
  57. while(strcmp(ptmp->data.name,name))
  58. {
  59. ptmp=ptmp->pnext;
  60. }
  61. printf("===========================\n");
  62. printf("%s ",ptmp->data.name);
  63. printf("%s ",ptmp->data.tel);
  64. printf("%s ",ptmp->data.addr);
  65. printf("%d ",ptmp->data.age);
  66. printf("\n===========================\n");
  67. }
  68. /*销毁*/
  69. int destory_hash_table()
  70. {
  71. int i = 0;
  72. HASH_NODE *ptmp = NULL;
  73. for(i = 0; i<HASH_SIZE;i++)
  74. {
  75. while(hash_table[i]!=NULL)
  76. {
  77. ptmp = hash_table[i];
  78. hash_table[i] = ptmp->pnext;
  79. free(ptmp);
  80. }
  81. }
  82. }

算法


解决特定问题求解步骤

算法的设计
1、正确性
        语法正确

        合法的输入能得到合理的结果

        对非法的输入,给出满足要求的规格说明;对精心选择,甚至刁难的测试都能正常运行,结果正确

2、可读性
        便于交流,阅读,理解,高内聚,低耦合

3、健壮性
        输入非法数据,能进行相应的处理,而不是产生异常

4、高效率
        时间复杂度

        执行这个算法所花时间的度量

将数据量增长和时间增长用函数表示出来,这个函数就叫做时间复杂度

一般用大O表示法:O(n) —— 时间复杂度是关于数据n的一个函数,随着n的增加,时间复杂度增长较慢的算法时间复杂度低

时间复杂度的计算规则
        1,用常数1 取代运行时间中的所有加法常数

        2,在修改后的运行函数中,只保留最高阶项。

        3,如果最高阶存在且系数不是1,则去除这个项相乘的常数。

5、低储存
         空间复杂度

    稳定性  一样的数经过排序 两个相等的数看其位置是否发生变换 未发生则稳定


        排序算法:           
    稳定  冒泡 for for if 交换  时间复杂度 O(n^2)
          
  不稳定  选择 O(n^2)
          
    稳定  插入 O(n^2)
          
  不稳定  快速 O(nlogn)
          
          二分查找 O(logn)

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号