哈希表简介

news2024/11/18 22:28:48

基本介绍

思路分析

代码实现

# 哈希表
# 员工信息
class Emp:
    id: int = 0
    name: str = ''
    next = None

    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __str__(self):
        return f"id={self.id}, name={self.name}"


class EmpLinkedList:
    # 头指针,指向第一个 Emp,即链表的head指向的是第一个数据节点
    head: Emp = None

    # 添加员工到链表
    # 此处假设输入的员工ID是递增的
    def add(self, emp: Emp):
        if self.head is None:
            self.head = emp
            return
        cur = self.head
        while cur.next is not None:
            cur = cur.next  # 后移
        # 找到链表的最后位置,将新员工节点添加在链表最后
        cur.next = emp

    # 遍历链表
    def list(self):
        if self.head is None:
            print("当前链表为空")
            return

        cur = self.head
        while cur is not None:
            print(" => ", cur)
            cur = cur.next  # 后移,继续遍历

    # 根据id查找员工信息
    def find_emp_by_id(self, id: int):
        if self.head is None:
            print("当前链表为空")
            return
        cur = self.head
        while cur is not None:
            if cur.id == id:
                break  # 此时 cur 指向的节点就是要查找的员工
            cur = cur.next

        return cur


class HashTab:
    def __init__(self, size):
        self.size = size
        self.emp_linkedlist = [EmpLinkedList() for i in range(size)]

    def add(self, emp: Emp):
        # 根据员工ID,得到该员工应当添加到表里的哪条链表
        linked_list_no = self.hash_func(emp.id)
        self.emp_linkedlist[linked_list_no].add(emp)

    # 根据id查找员工信息
    def find_emp_by_id(self, id: int):
        linked_list_no = self.hash_func(id)
        emp = self.emp_linkedlist[linked_list_no].find_emp_by_id(id)
        if emp:
            print("员工信息为:", emp)
        else:
            print(f"没有找到id为{id}的员工")

    # 遍历所有链表,即遍历哈希表中的所有链表
    def list(self):
        for i in range(self.size):
            print(f"第{i + 1}条链表员工信息:", end="")
            self.emp_linkedlist[i].list()

    # 散列函数,此处用最简单的取模法实现
    def hash_func(self, id):
        return id % self.size


def hash_test():
    hash_tab = HashTab(7)
    while True:
        select = None
        print("1. 添加员工信息")
        print("2. 输出全部员工信息")
        print("3. 根据id查找员工")
        print("4. 退出")

        select = int(input("请选择:"))
        if select == 1:
            id = int(input("请输入员工id:"))
            name = input("请输入员工姓名:")
            emp = Emp(id, name)
            hash_tab.add(emp)
        elif select == 2:
            hash_tab.list()
        elif select == 3:
            id = int(input("请输入员工id:"))
            hash_tab.find_emp_by_id(id)
        elif select == 4:
            break
        else:
            print("输入错误,没有该选项,请重新选择")


hash_test()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1099437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jenkins整合gerrit

背景 公司项目之前使用jenkins整合了gitlab,后面代码迁移到gerrit,所以需要修改jenkins配置。下面就简单的介绍一下jenkins如何整合gerrit。 环境 服务器:linux 环境:docker、jenkins 代码仓库:gerrit 前提 docke…

Flink的ResourceManager详解(一)

ResourceManager 总结 一、概述 1、ResourceManager 管理 Flink 集群中的计算资源,计算资源主要来自 TaskManager 组件。 2、如果集群采用 Native【本地模式】部署,则 ResourceManager 会动态地向集群资源管理器申请 Container 并启动TaskManager&…

depcheck检查项目依赖的安装情况-帮你解决各种项目运行灵异事件

depcheck检查项目缺失的依赖 depcheck介绍与安装介绍安装 depcheck使用基础使用注意 进阶使用 删除多余的依赖注意 depcheck介绍与安装 介绍 工作中,以下的场景恐怕大家都有经历过: 从代码仓库上面 clone 的项目,自己本地一运行就报错… 用…

Ruby和面向对象技术

Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言,每个对象都是一个样例或者既定类的实例以及独立对象的行为。 一、创建一个通用对象 创建一个通用对象 obj Object.new定义通用对象的行为 def obj.talk puts "I am an object"p…

MySQL远程连接

一、什么是mysq的远程连接? 1、本地连接 直接在本地使用mysqladmin命令登录 mysql -u root -p 解释如下: mysql:mysql 命令表示要启动 MySQL 客户端。-u root:-u 选项指定要使用的用户名。在这里,我们使用 root 用户名作为示例。-p:-p 选项需要用户输入密码。如果省…

Unexpected mutation of “dialogVisible“ prop.

问题记录: Vue2项目在封装element-ui的dialog组件时,eslint报错 Unexpected mutation of “dialogVisible” prop.eslintvue/no-mutating-props 大致意思是父组件传递过来的 dialogVisible 属性,不允许在子组件中修改父组件的值 解决方法&a…

qtabwidget 样式表

.QWidget{background-color: #ffffff; }/*设置TabWidget中QTabBar的样式*/ QTabWidget{background-color: #E6EBE8; } QTabBar::tab{background-color: #DEDEDE;font-family:Source Han Sans CN; /*设置tab中的文本的字体*/font-size:20pt;font-weight: normal;color:#3D3D3…

HCIP---BGP社团属性

文章目录 目录 文章目录 前言 一.BGP社团属性概述 公有社团属性 配置命令 前言 前文详细介绍了BGP的基础内容,本编将着重于BGP协议的另一个重点内容进行详解。 一.BGP社团属性概述 BGP社区属性是BGP路由协议中的一种特殊属性,可以用于指定一组AS号码&…

线程安全案例 --- 线程池

小王学习录 今日鸡汤什么是线程池为什么需要线程池1. 协程2. 线程池3. 什么是用户态和内核态使用线程池 --- java标准库1. 线程池的创建2. 工厂模式3. 线程池的使用ThreadPollExecutor类构造方法1. corePoolSize, maximumPoolSize 线程2. long keepAliveTime, TimeUnit unit 时…

paddlenlp:社交网络中多模态虚假媒体内容核查(特征篇)

初赛之特征构造 写在前面一、安装paddleOCR二、代码部分三、模型优缺点四、写在最后 写在前面 通过前面两篇文章的介绍,我们可以大致的知道模型用到的特征分为四块:qCap,qImg,captions,imgs。根据这些特征&#xff0c…

第一章 C语言程序设计Pro

考点一 C语言特点,C程序基本构成 数据类型丰富运算符丰富是一种中级语言(高级) //包含了中级和高级的特性数据类型检查不严格 //int和char通用 对下标的越界不报错 2021.下列属于计算机中高级语言的是(…

嵌入式基础——哈弗结构

文章目录 1 什么是哈弗结构?2 哈弗结构单片机的特点3 什么是改进的(Enhanced)哈弗结构?4 写在最后 1 什么是哈弗结构? 哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,如图所示: 哈佛结构是一种并行体系结构&#xf…

Consider using the `--user` option or check the permissions.

ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。: C:\\Users\\luckyli\\anaconda3\\envs\\CV\\Lib\\site-packages\\~orch\\lib\\asmjit.dll Consider using the --user option or check the permissions. 安装pytorch时遇到上述问题 通过以下…

Git Cherry Pick的使用

cherry-pick命令的基本用法 cherry-pick命令的基本语法如下&#xff1a; git cherry-pick <commit>其中&#xff0c;<commit>是要应用的提交的哈希值或分支名。该命令会将指定的提交应用到当前分支上&#xff0c;并创建一个新的提交。 使用场景 cherry-pick命令…

Jmeter-实现图片的上传和下载

图片上传 选中测试计划右键&#xff0c;添加->线程(用户)->线程组 配置线程组 上面分别是总次数&#xff0c;时间&#xff0c;循环次数&#xff0c;就是字面意思 选中你的线程组右键&#xff0c;添加->取样器->HTTP请求 配置HTTP请求 为了方便观看&#xff0c;这…

【C++基础】13. 结构体

文章目录 【 1. 结构体的定义 】【 2. 结构体成员的访问 】【 3. 结构体变量的声明 】【 4. 指向结构体的指针 】 数组与结构体&#xff1a;C/C 数组允许定义可存储相同类型数据项的变量。而结构体是 C 中另一种用户自定义的可用的数据类型&#xff0c;它允许我们存储不同类型的…

在vscode中配置git bash终端、git 源码管理

打开vscode文件->首选项->设置&#xff0c;打开设置搜索shell windows将以下配置添加到vscode中的settings.json中 注意&#xff1a; terminal.integrated.profiles.windows这个配置项是就是添加终端的terminal.integrated.defaultProfile.windows这个是配置默认选项的…

【Linux初阶】多线程3 | 线程同步,生产消费者模型(普通版、BlockingQueue版)

文章目录 ☀️一、线程同步&#x1f33b;1.条件变量&#x1f33b;2.同步概念与竞态条件&#x1f33b;3.条件变量函数&#x1f33b;4.条件变量使用规范&#x1f33b;5.代码案例 ☀️二、生产者消费者模型&#x1f33b;1.为何要使用生产者消费者模型&#x1f33b;2.生产者消费者模…

代理正向 反向代理

1.正向代理 主动发送流量 端口转发 反向代理 被动发送流量 正向代理的设置 画图 实验 利用 攻击机 外网 失控服务器 内网 外网都有 内部服务内网 使用工具 使用的恶意脚本 放到网页里 客户端 使用 网站访问 解析 一下 使用的工具 pyth…

Java学习_day01_hello java

构成 JDK JDK是java开发者工具&#xff0c;由JRE和一些开发工具组成。JRE JRE是java运行环境&#xff0c;由JVM和java核心类库组成。JVM JVM是java虚拟机&#xff0c;主要用来运行字节码。 执行过程 由IDE或文本编辑器&#xff0c;编写源代码&#xff0c;并将文件保存为*.ja…