• 哈希表简介


    基本介绍

    思路分析

    代码实现

    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()

  • 相关阅读:
    (免费分享)基于springboot论坛bbs系统
    现货白银有哪些优势
    Java语言实现 比较两个Date日期的先后
    服务器的操作系统,你选择哪些?
    selenium python 入门教程
    leetcode:169. 多数元素(同归于尽消杀法)
    【Python】正则表达式判断是否存在连续相同的两个字符,连续两个字符一模一样
    Java下打印直角三角型(另一个方向)
    前端路由与历史
    【Linux】缓冲区/回车换行
  • 原文地址:https://blog.csdn.net/2301_77659011/article/details/133848217