Data Structure (三)

2023-11-08

动态规划

1.区间调度问题

1.1无权区间调度问题

•任务j开始于sj,结束于fj

•如果两个任务没有重叠的时间,则两个任务互相兼容
•目标:找到最多/最大互相兼容的任务集合

贪心算法总是做出当前最优的选择。贪心算法并不总能得到最优解,但是它是最简单最容易实现的算法。

无权区间调度问题贪心算法:先将任务以某种顺序排序,再按顺序挑选互相兼容的任务。

按照结束时间排序

​​​​​​小白带你学---贪心算法(Greedy Algorithm) - 知乎 (zhihu.com)

1.2带权区间调度问题

找到权重最大且互相兼容的任务集合

动态规划

a.确定状态
b.  状态转移方程
c.  初始条件和边界情况
d. 确定计算顺序

分治

(39条消息) 算法与数据结构_Hi丶ImViper的博客-CSDN博客

高度平衡二叉树是一棵满足每个节点的左右两个子树的高度差的绝对值不超过1的二叉树。

(39条消息) 二叉树合集(六):高度平衡的二叉搜索树简介(图文解析)_Hi丶ImViper的博客-CSDN博客_高度平衡的二叉树搜索树

将有序数组转换为二叉搜索树

 从中序与后序遍历序列构造二叉树

哈希表

也叫做散列表。是根据关键字和值(Key Value)直接进行访问的数据结构。也就是说,它通过关键字 key 和一个映射函数 Hash(key) 计算出对应的值 value,然后把键值对映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做 哈希函数(散列函数),用于存放记录的数组叫做哈希表(散列表)。

•向哈希表中插入一个关键字:哈希函数决定该关键字的对应值应该存放到表中的哪个区块,并将对应值存放到该区块中。
•在哈希表中搜索一个关键字:使用相同的哈希函数从哈希表中查找对应的区块,并在特定的区块搜索该关键字对应的值。

哈希表在生活中的应用也很广泛,其中一个常见例子就是「查字典」。

哈希函数:将哈希表中元素的关键键值映射为元素存储位置的函数。

•哈希函数应该易于计算,并且尽量使计算出来的索引值均匀分布。
•哈希函数计算得到的哈希值是一个固定长度的输出值。
•如果 Hash(key1) 不等于 Hash(key2),那么 key1、key2 一定不相等。
•如果 Hash(key1) 等于 Hash(key2),那么 key1、key2 可能相等,也可能不相等(会发生哈希碰
撞)。

通常用到的哈希函数方法有:直接定址法、除留余数法、平方取中法、基数转换法、数字分析法、折叠法、随机数法、乘积法、点积法等。

1.直接定址法

Hash(key) = key 或者 Hash(key) = a * key + b,其中 a 和 b 为常数。

2.除留余数法

假设哈希表的表长为 m,取一个不大于 m 但接近或等于 m 的质数 p,利用取模运算,
将关键字转换为哈希地址。即:Hash(key) = key % p,其中 p 为不大于 m 的质数。

3.平方取中法

先通过求关键字平方值的方式扩大相近数之间的差别,然后根据表长度取关键字平方值的
中间几位数为哈希地址。

比如:Hash(key) = (key * key) // 100 % 1000,先计算平方,去除末尾的 2 位数,再取中间 3 位
数作为哈希地址。

4.基数转换法

将关键字看成另一种进制的数再转换成原来进制的数,然后选其中几位作为哈希地址

哈希冲突

不同的关键字通过同一个哈希函数可能得到同一哈希地址,即 key1 ≠ key2,而 Hash(key1) = Hash(key2),这种现象称为哈希冲突。

常用的哈希冲突解决方法主要是两类:「开放地址法」和「链地址法」。

1.开放地址法

开放地址法:指的是将哈希表中的「空地址」向处理冲突开放。当哈希表未满时,处理冲突时需要尝试另外的单元,直到找到空的单元为止。
当发生冲突时,开放地址法按照下面的方法求得后继哈希地址:H(i) = (Hash(key) + F(i)) % m,i = 1, 2, 3, ..., n (n ≤ m - 1)。
•H(i) 是在处理冲突中得到的地址序列。即在第 1 次冲突(i = 1)时经过处理得到一个新地址 H(1),
如果在 H(1) 处仍然发生冲突(i = 2)时经过处理时得到另一个新地址 H(2) …… 如此下去,直到
求得的 H(n) 不再发生冲突。
•Hash(key) 是哈希函数,m 是哈希表表长,取余目的是为了使得到的下一个地址一定落在哈希表中。
•F(i) 是冲突解决方法,取法可以有以下几种:
•线性探测法:F(i) = 1, 2, 3, ..., m - 1。
•二次探测法:F(i) = 1^2, -1^2, 2^2, -2^2, ..., n^2(n ≤ m / 2)。
•伪随机数序列:F(i) = 伪随机数序列。

2.链地址法

将具有相同哈希地址的元素(或记录)存储在同一个线性链表中。

我们假设哈希函数产生的哈希地址区间为 [0, m - 1],哈希表的表长为 m。则可以将哈希表定义为一个有 m 个头节点组成的链表指针数组 T。
•这样在插入关键字的时候,我们只需要通过哈希函数 Hash(key) 计算出对应的哈希地址 i,然后将
其以链表节点的形式插入到以 T[i] 为头节点的单链表中。在链表中插入位置可以在表头或表尾,也
可以在中间。如果每次插入位置为表头,则插入操作的时间复杂度为 O(1)。
•而在在查询关键字的时候,我们只需要通过哈希函数 Hash(key) 计算出对应的哈希地址 i,然后将
对应位置上的链表整个扫描一遍,比较链表中每个链节点的键值与查询的键值是否一致。查询操作
的时间复杂度跟链表的长度 k 成正比,也就是 O(k)。对于哈希地址比较均匀的哈希函数来说,理论上讲,k = n // m,其中 n 为关键字的个数,m 为哈希表的表长。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Data Structure (三) 的相关文章

  • git提交时忽略文件及文件夹方法

    如果要忽略的文件没有被跟踪过 可以直接在 gitnore文件中写要忽略的内容即可 gitignore内容 idea 文件夹名称 文件夹名称 子目录名称 如果要忽略的文件已经是被跟踪状态 则需要先把本地缓存删除 变成未跟踪状态 然后再提交 g
  • MyBatis-Plus框架简介

    MyBatis Plus框架简介 1 MyBatis Plus MyBatis Plus 简称 MP 是一个 MyBatis 的增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发 提高效率而生 其特性有 无侵入 只做增强不做
  • C#中 IoC 的实现

    前两天看到一个博 http www cnblogs com liuhaorain p 3747470 html 在说IoC 我觉得这个东西还是很you必要学习一下 于是就有了这个 首先 明确下IoC是什么东西 控制反转 Inversion

随机推荐

  • 性能测试重点17个疑难解答

    前言 1 如何理解性能测试的 高并发的请求下看它的响应时间与吞吐率是否满足相应的消息 2 响应时间时如何理解的 响应时间是指从发生请求到得到响应时间这一段时间的总和 简单的说 响应时间就是一次完整的http请求流程所需的时间 3 怎么区分负
  • java/Python3连接数据库(Hive、Oracle)

    Python连接Hive 一 前提准备 Python版本 3 6 4 需要下载的包 打开cmd在命令提示窗口中运行 pip install sasl pip install thrift pip install thrift sasl pi
  • justify-content (适用于父类容器上)

    设置或检索弹性盒子在主轴 横轴 上的对齐方式 当弹性盒里一行上的所有子元素都不能伸缩或已经达到其最大值时 这一属性可协助对多余的空间进行分配 当元素溢出某行时 这一属性同样会在对齐上进行控制 语法 justify content flex
  • 数据采集---json格式数据

    页面展示 智联招聘 URL https sou zhaopin com jl 801 kw 0 p 1 例 https sou zhaopin com jl 801 kw python p 1 右键 gt 查看网页源码 切片处理获得json
  • arduino笔记27:mh-sensor-series + 土壤传感器

    mh sensor series 霍尔传感器 这个型号的霍尔传感器有四zhidao个引脚 vcc 接在单片机的 5v 引脚 即单片机输出一个五伏的电压 GND 对应单片机的 GND 负极 D0 对应单片机的 D2 D12 引脚 是一个回数字
  • 打印纸张尺寸换算_各种打印纸的尺寸是多少?

    展开全部 常用打印纸尺寸为 A4 16k 297mm 210mm A5 32k 210mm 148mm A6 64k 144mm 105mm A3 8k 420mm 297mm 按照尺寸的大小 通常62616964757a686964616
  • 我说我懂多线程,面试官立马给我发了offer

    前言 只有光头才能变强 文本已收录至我的GitHub精选文章 欢迎Star https github com ZhongFuCheng3y 3y 在上周总结了一篇 工作中常用到的Java集合类 反响还不错 这周来写写Java另一个重要的知识
  • UE4资源及内存控制台命令

    UE4资源及内存控制台命令 原文地址 UE4资源及内存控制台命令 可可西 博客园 ListLoadedPackages 打印被加载的包 每个包对应一个uasset或umap文件 List of all loaded packages Nam
  • angularjs $http调用接口的方式

    angularjs http调用接口的方式 http get merchantmall merchant json success function data status headers config console log argume
  • Java8 方法积累

    Java8 方法积累 removeIf 移除集合中字段全为NULL的无意义对象 list removeIf filter gt filter getProperty1 null filter getProperty2 null stream
  • 6款免费的PDF解锁软件

    下面这些软件提供不同的选项来解锁PDF文件 如 暴力攻击 字典攻击 网络搜索 掩码攻击和键搜索攻击选项 支持可以部署的各种攻击方法 如 简单方法 复杂方法和混合方法 也可以为攻击设置不同的选项 例如 要包括的字符和数字 要扫描的密码长度等
  • Apache服务器的下载安装与配置

    最近在学习Android 需要搭建一个服务器 于是在网上查找了一些资料 主要参考博文https www cnblogs com yerenyuan p 5460336 html点击打开链接 目前官网可以下载的版本是2 4 29 分VC14和
  • Redis 管道

    目录 Redis 管道 Abstract 管道和原生批命令的比较 管道和脚本的区别 使用管道需要注意的事项 Redis 管道 Abstract Redis 客户端执行一条命令分 4 个过程 发送命令 命令排队 命令执行 返回结果 这个过程称
  • 2.4.9 Profile虚拟以太网网卡参数

    最后更新2021 07 22 参考 lt 图 242 虚拟IO设备管理界面 gt 我们来了解一下虚拟以太网网卡参数 图 244 虚拟以太网参数设置 普通设置 Adapter ID 等同于虚拟IO设备的Slot ID 槽位号 参考 lt 49
  • 在crontab中执行scrapy(解决不执行,不爬取数据的问题)

    文章来着 在crontab中执行scrapy 解决不执行 不爬取数据的问题 自我的进化 在crontab中执行scrapy会遇到命令不执行 或者执行了但是没有爬取数据的问题 这里做一下总结 先说这里遇到的问题和解决方案 spider不执行
  • 图说设计模式

    软件模式是将模式的一般概念应用于软件开发领域 即软件开发的 总体指导思路或参照样板 软件模式并非仅限于设计模式 还包括 架构模式 分析模式和过程模式等 实际上 在软件生存期的每一 个阶段都存在着一些被认同的模式 本书使用图形和代码结合的方式
  • 《CSDN 涨粉攻略》11个涨粉方法,你学会了几个?

    文章目录 前言 一 我最近的涨粉情况 二 不忘初心 三 涨粉要诀 1 社区 a 规则 b 详述 2 热榜 a 规则 b 详述 3 粉丝可见 a 规则 b 详述 4 标题 a 规则 b 详述 5 封面 a 规则 b 详述 6 一键三连 a 规
  • python中的元组(tuple)的用法

    以下内容主要摘抄博客 https blog csdn net yezonggang article details 50976664 utm medium distribute pc relevant none task blog Blog
  • 几种常见开源软件授权协议

    转载地址见图片
  • Data Structure (三)

    动态规划 1 区间调度问题 1 1无权区间调度问题 任务j开始于sj 结束于fj 如果两个任务没有重叠的时间 则两个任务互相兼容 目标 找到最多 最大互相兼容的任务集合 贪心算法总是做出当前最优的选择 贪心算法并不总能得到最优解 但是它是最