• 哈希表简介


    基本介绍

    思路分析

    代码实现

    1. # 哈希表
    2. # 员工信息
    3. class Emp:
    4. id: int = 0
    5. name: str = ''
    6. next = None
    7. def __init__(self, id, name):
    8. self.id = id
    9. self.name = name
    10. def __str__(self):
    11. return f"id={self.id}, name={self.name}"
    12. class EmpLinkedList:
    13. # 头指针,指向第一个 Emp,即链表的head指向的是第一个数据节点
    14. head: Emp = None
    15. # 添加员工到链表
    16. # 此处假设输入的员工ID是递增的
    17. def add(self, emp: Emp):
    18. if self.head is None:
    19. self.head = emp
    20. return
    21. cur = self.head
    22. while cur.next is not None:
    23. cur = cur.next # 后移
    24. # 找到链表的最后位置,将新员工节点添加在链表最后
    25. cur.next = emp
    26. # 遍历链表
    27. def list(self):
    28. if self.head is None:
    29. print("当前链表为空")
    30. return
    31. cur = self.head
    32. while cur is not None:
    33. print(" => ", cur)
    34. cur = cur.next # 后移,继续遍历
    35. # 根据id查找员工信息
    36. def find_emp_by_id(self, id: int):
    37. if self.head is None:
    38. print("当前链表为空")
    39. return
    40. cur = self.head
    41. while cur is not None:
    42. if cur.id == id:
    43. break # 此时 cur 指向的节点就是要查找的员工
    44. cur = cur.next
    45. return cur
    46. class HashTab:
    47. def __init__(self, size):
    48. self.size = size
    49. self.emp_linkedlist = [EmpLinkedList() for i in range(size)]
    50. def add(self, emp: Emp):
    51. # 根据员工ID,得到该员工应当添加到表里的哪条链表
    52. linked_list_no = self.hash_func(emp.id)
    53. self.emp_linkedlist[linked_list_no].add(emp)
    54. # 根据id查找员工信息
    55. def find_emp_by_id(self, id: int):
    56. linked_list_no = self.hash_func(id)
    57. emp = self.emp_linkedlist[linked_list_no].find_emp_by_id(id)
    58. if emp:
    59. print("员工信息为:", emp)
    60. else:
    61. print(f"没有找到id为{id}的员工")
    62. # 遍历所有链表,即遍历哈希表中的所有链表
    63. def list(self):
    64. for i in range(self.size):
    65. print(f"第{i + 1}条链表员工信息:", end="")
    66. self.emp_linkedlist[i].list()
    67. # 散列函数,此处用最简单的取模法实现
    68. def hash_func(self, id):
    69. return id % self.size
    70. def hash_test():
    71. hash_tab = HashTab(7)
    72. while True:
    73. select = None
    74. print("1. 添加员工信息")
    75. print("2. 输出全部员工信息")
    76. print("3. 根据id查找员工")
    77. print("4. 退出")
    78. select = int(input("请选择:"))
    79. if select == 1:
    80. id = int(input("请输入员工id:"))
    81. name = input("请输入员工姓名:")
    82. emp = Emp(id, name)
    83. hash_tab.add(emp)
    84. elif select == 2:
    85. hash_tab.list()
    86. elif select == 3:
    87. id = int(input("请输入员工id:"))
    88. hash_tab.find_emp_by_id(id)
    89. elif select == 4:
    90. break
    91. else:
    92. print("输入错误,没有该选项,请重新选择")
    93. hash_test()

  • 相关阅读:
    [Redis-实战] 企业常用的缓存使用方案(查询、更新、击穿、穿透、雪崩) 附源码
    企业网络安全面临哪些困境?可以怎样应对?
    Typora导出的PDF目录标题自动加编号
    cpu门禁电梯卡复制测试过程
    整理了一个前端utils工具方法库
    我的知识树
    自定义命名不同类型文件,隐藏编号轻松整理,一键操作高效便捷!
    cache三种地址映像
    selenium中出现 Other element would receive the click的解决方式
    Java并发编程学习五:并发容器
  • 原文地址:https://blog.csdn.net/2301_77659011/article/details/133848217