
数据结构与算法
文章平均质量分 74
数据结构与算法
RealWeakCoder
csdn博客不再更新,后续搭建个人博客平台
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
博弈论之对抗搜索模板
两个基本点:零和博弈(a的目标是a的分数最大b的分数最小,b的目标是b的分数最大a的分数最小)核心算法:dfs+极大极小过程优化策略:记忆化,α-β剪枝int dfs(Status status,int role) { //返回a的最大分数,a的role为0,b的role为1 if (平局) return 0; int Max = -Inf, Min = Inf; for (auto& s : status) { if (s空间状态下可操作) { if (role == 0)原创 2021-03-18 22:03:34 · 279 阅读 · 1 评论 -
Morris遍历【时间O(n),空间O(1)的二叉树遍历】
一般来说,二叉树有两种遍历方式,一种方式是递归遍历,一种是基于栈的非递归方式。1°递归遍历,有时间复杂度O(n)O(n)O(n),空间复杂度平均O(logn)O(logn)O(logn),最坏情况下O(n)O(n)O(n)2°基于栈的非递归遍历,有时间复杂度O(n)O(n)O(n),空间复杂度O(h)O(h)O(h)而有一种巧妙的方法可以在时间复杂度为O(n),空间复杂度为O(1)的情况下实现二叉树遍历。这种方法由 J. H. Morris 在 1979 年的论文「Traversing Binar原创 2020-09-22 15:42:02 · 268 阅读 · 0 评论 -
平衡二叉树(AVL树)C++代码实现
目录平衡二叉树定义AVLAVLAVL树类的封装AVLAVLAVL树的插入操作与平衡化LLLLLL型调整RRRRRR型调整LRLRLR型调整RLRLRL型调整AVLAVLAVL树查找操作AVLAVLAVL树删除结点操作总源代码平衡二叉树定义为了使二叉排序树的平均查找长度更小,需要适当控制树高,显然,控制树高的一个有效措施就是尽量保持树的左右子树高度大致平衡,由此产生了平衡二叉树的概念。G.M.Adelson−VelskiiG.M.Adelson-VelskiiG.M.Adelson−Velskii和E.原创 2020-07-25 18:03:06 · 4073 阅读 · 7 评论 -
【算法笔记】全域哈希表
引入在一般的哈希表中,有一个显著的缺点:无论选择什么样的哈希函数,总存在一条键值输入序列,这条序列中的每一个键值都会被哈希映射到同一个槽中,导致形成的哈希表只是一条链表,效率较低。首先需要明确,这个问题的产生是由于哈希函数的确定性,如果哈希函数是不定的,则可以解决这个问题。由此引入随机性。全域哈希表定义设UUU为键值的全集,HHH为哈希函数的有限集,哈希表的槽数量为mmm,若∀x,y∈U,x≠y,∣\forall x,y\in U,x≠y,|∀x,y∈U,x=y,∣{h∣h∈H,h(x)=h(y原创 2020-07-22 13:11:20 · 494 阅读 · 0 评论 -
哈希表(散列表)之乘法哈希(散列)法
乘法哈希法对应的哈希函数h(k)=(A∗kmod 2w)rsh(w−r)h(k)=(A*k\mod 2^w )rsh(w-r)h(k)=(A∗kmod2w)rsh(w−r)www为计算机的每一个字的字节长度,即计算机位数,常见的有32位和64位AAA是一个常数,满足:AAA在二进制下的长度为www位rrr是一个与哈希表大小有关的常数,设哈希表长度为mmm,r=⌈log2m⌉r=\lceil\log_2 m\rceilr=⌈log2m⌉rshrshrsh是右移操作,在C++编程语言中的对应代码原创 2020-07-21 19:13:41 · 2522 阅读 · 0 评论 -
线性时间内找到第k小的元素:快排应用与BFPRT算法
目录问题分析快排应用BFPRT算法问题分析面对这个问题,最简单的想法是对数据进行排序,然后根据下标即可找到第k小的元素,目前已知的排序算法的最低时间复杂度为O(nlog2log2n)O(n\sqrt{\log_2 {\log_2 n}})O(nlog2log2n),但并不为人熟知。目前应用最广的排序算法的最低时间复杂度为O(nlog2n)O(n\log_2 n)O(nlog2n)。但是,作为完美主义者的程序员,需要思考,找到第k小的元素一定需要排序吗?但除了寻找最大或最小的元素之外,我们原创 2020-07-14 14:59:18 · 943 阅读 · 0 评论 -
线性时间找到第k小的元素:快排应用与BFPRT算法
问题分析面对这个问题,最简单的想法是对数据进行排序,然后根据下标即可找到第k小的元素,目前已知的排序算法的最低时间复杂度为O(nlog2log2n)O(n\sqrt{\log_2 {\log_2 n}})O(nlog2log2n),但并不为人熟知。目前应用最广的排序算法的最低时间复杂度为O(nlog2n)O(n\log_2 n)O(nlog2n)。但是,作为完美主义者的程序员,需要思考,找到第k小的元素一定需要排序吗?但除了寻找最大或最小的元素之外,我们似乎只能选择排序。那么能否只进行部分原创 2020-07-13 23:36:13 · 435 阅读 · 0 评论 -
升级版快速排序——随机化快速排序
随机化思想的引入在数据结构这门课程的学习中,我们了解到一种名为快速排序的算法,该算法时间复杂度为O(nlog2n)O(n\log_2 n)O(nlog2n),但是,在课程中,书本和老师都指出了它的一个缺点:在数据有序时的时间复杂度为O(n2)O(n^2)O(n2)为了“消除”这个缺点,随机化的思想被引入到快排中:由于数据有序,可以随机选取其中一个数将其与其他数交换,使有序的情况被破坏,从而使原有序数据的排序效率加快。普通快排的实现基本思想:将数据划分为两部分,左边的所有元素都小于右边的所有原创 2020-07-12 20:54:08 · 606 阅读 · 0 评论 -
如何计算算法时间复杂度?主定理(主方法)!
目录1° f(n)<nlogbaf(n)<n^{\log_b a}f(n)<nlogba2° f(n)=nlogbaf(n)=n^{\log_b a}f(n)=nlogba3°f(n)>nlogbaf(n)>n^{\log_b a}f(n)>nlogba应用主方法只适用于特定的递归算法,当一个递归算法中一个问题可以拆解称若干个相同的子问题,每个子问题规模大小相同时可以运用主定理求得其时间复杂度。此类递归算法有递归式T(n)=aT(nb)+f(n)T(n)=aT(\frac原创 2020-07-12 19:46:28 · 6429 阅读 · 0 评论 -
【数据结构】 实验报告13 各排序算法时间性能比较
目录一、实验目的和要求二、实验环境三、实验内容四、实验过程4.1 任务定义和问题分析4.2 数据结构的选择和概要设计五、测试及结果分析5.1 实验数据5.2 结果及分析六、实验收获八、附录(源代码)一、实验目的和要求目的:给出一组实验来比较排序算法的时间性能要求:(1)时间性能(2)实验数据应具有说服力(3)实验结果要能以清晰的形式给出,如图、表等。(4)算法所用时间必须是机器时间,也可以包括比较和交换元素的次数。(5)实验分析及其结果要能以清晰的方式来描述,如数学公式或图表等。(6)要给原创 2020-07-02 12:06:47 · 9580 阅读 · 6 评论 -
2019安徽省程序设计竞赛 D自驾游 题解
从无编程比赛经验,程序设计艺术与方法作业所迫,采用方法十分普通,还请进来的大佬莫要笑话原题描述P 省有 N 个城市,编号分别为 1…N,烦烦家住 1 号城市,N 号城市是省会。P省的交通非常发达,有 M 条有向的高速公路连接这 N 个城市,第 i 条高速公路(1<=i<=M)从城市 ui 连向城市 vi。这天,烦烦想自己开车从家前往省会城市游玩。烦烦是个做事很细致的人,为了有备无患,她决定同时开着 heroMap 和 amap 这两个不同的导航软件来帮助自己完成这次旅程。这两个导航软件原创 2020-06-11 16:48:46 · 1416 阅读 · 4 评论 -
【数据结构】实验报告12 输出有向无环图的所有拓扑序列
目录一、实验目的和要求二、实验环境三、实验内容四、实验过程4.1 任务定义和问题分析4.2 数据结构的选择和概要设计4.3 详细设计五、测试及结果分析5.1 实验数据5.2 结果及分析六、实验收获七、源代码一、实验目的和要求设计算法并实现有向无环图的所有拓扑序列。二、实验环境软件环境:visual stdio 2017硬件环境:①CPU:Intel(R)Core(TM)i7-8565U CPU @1.80Ghz②内存:8.0GB三、实验内容设计算法并实现有向无环图的所有拓扑序列。四、实验过原创 2020-06-07 11:13:47 · 3626 阅读 · 6 评论 -
Qt实现哈夫曼编码解压缩软件详解
诸位既然点开了本帖,相信对此问题已有初步了解,哈夫曼树的原理不再赘述,我们开门见山,直入主题。一、概要设计问题拆解:设计一个基于哈夫曼编码的解压缩软件,这个问题我认为可以分解为以下几个子问题:读取传入文件,进行字符权重统计将出现的字符放入哈夫曼树结点,构建哈夫曼树,获取哈夫曼编码将编码相关信息写入压缩后的文件,再将传入文件的每个字符按照哈夫曼编码转换,每8个二进制位作为一个字节传入压缩后的文件解压部分:将传入的已压缩文件进行文件流读取,获取编码信息进行还原根据这几个子问题的思路顺序,我们逐原创 2020-06-02 22:52:37 · 9105 阅读 · 30 评论 -
【数据结构】实验报告11 将二叉树后序线索化并进行后序遍历
一、实验目的和要求目的:设计并实现基于后序线索二叉树的后序遍历的非递归算法。要求:(1)创建二叉树。(2)转换为后序线索二叉树。(3)实现后序遍历的非递归算法。(4)其它要求同课后作业-01要求。二、实验环境软件环境:visual stdio 2017硬件环境:①CPU:Intel(R)Core(TM)i7-8565U CPU @1.80Ghz②内存:8.0GB三、实验内容设计并实现基于后序线索二叉树的后序遍历的非递归算法。四、实验过程4.1 任务定义和问题分析本次实验主要解决原创 2020-05-29 12:32:06 · 2289 阅读 · 0 评论 -
【数据结构】 顺序、链式存储结构的森林递归遍历、层次遍历求高度
降维问题:顺序、链式存储结构的二叉树递归遍历、层次遍历求高度全部源代码在最后一、概要设计测试数据:如图所示森林森林采用兄弟孩子链表表示法。森林的数据输入采取输入兄弟孩子链表表示法下的等价二叉树的扩展先序遍历形成的线性串的方法(原理为森林先序遍历结果与等价二叉树的先序遍历结果相同)输入数据:ABEK..F..CG..DH.I.J...L.MN...算法设计以链式存储结构为例递归遍历求高度:由于孩子兄弟链表表示法是把兄弟当儿子,所以对应二叉树的所有左子树的最大高度便是森林的高度。这样,在求原创 2020-05-23 12:26:40 · 1366 阅读 · 0 评论 -
【数据结构】 链表表示集合并实现并集、交集、差集运算功能
总源代码在最后双向链表:template<typename T>struct Node{ T data; Node* next; Node* prior;};链表集合类template<typename T>class ListSet{public: ListSet() ; ListSet(const ListSet<T>& Set); ~ListSet(); int getlength()const ;原创 2020-05-20 23:18:23 · 3550 阅读 · 0 评论 -
基于Qt实现简单计算器(可支持逻辑运算的计算器)
一、实验目的和要求设计并实现计算器。要求:在课后作业-03、课后作业-05的作业内容基础上(1)增加图形交互功能。(2)增加3个逻辑运算符 &&、||、 !,并能处理逻辑运算符和算术运算符的混合运算。(3)增加容错功能,能进行异常处理。说明:(1)其中牵涉到数据结构相关的可复用代码,可自行选择。(2)提交时间:3周至4周左右时长,具体时间节点另行通知。(3)其它要求同课后作业-01 。二、实验环境软件环境:①Qt5.9②Qr Creator 4.3原创 2020-05-18 14:47:31 · 5434 阅读 · 9 评论 -
【数据结构】 双循环链表空间逆置
要求:建立双循环列表:逆置前,正向输出:头结点地址 每个结点地址 每个结点值逆置后,正向输出头结点地址 每个结点地址 每个结点值代码:双向链表:template<typename T>struct Node{ T data; Node* next; Node* prior;};双循环列表:template<typename T>class CircleList{public: CircleList(); ~CircleList(); in原创 2020-05-13 21:10:52 · 2329 阅读 · 0 评论 -
【数据结构】 实验报告10 顺序、链式存储结构的二叉树递归遍历、层次遍历求高度
一、实验目的和要求 (源码在最后)要求:两种及以上存储结构(建议 顺序存储结构和链式存储结构各一)、两种及以上方法(建议 递归遍历和层次遍历方法各一)。分析各代码性能。抽象数据类型(二叉树)独立模块实现。其它要求同作业-01要求。二、实验环境软件环境:visual stdio 2017硬件环境:①CPU:Intel(R)Core(TM)i7-8565U CPU @1.80Ghz...原创 2020-05-05 12:19:53 · 3339 阅读 · 0 评论 -
【数据结构】 实验报告09 将递归代码转换为非递归代码
一、实验目的和要求目的:将阶乘的递归算法一步一步转换为非递归算法要求:其它要求同作业-01要求。二、实验环境软件环境:visual stdio 2017硬件环境:①CPU:Intel(R)Core(TM)i7-8565U CPU @1.80Ghz②内存:8.0GB三、实验内容(1)用递归代码实现n!求解。(2)利用转换规则(不简化) 将代码(1)转换为非递归代码。(3)简化并梳...原创 2020-04-22 21:01:25 · 987 阅读 · 0 评论 -
list中使用merge()函数报错squence not orderd
list<int>m, n;//一系列初始化操作已省略m.merge(n,less<int>());for (list<int>::iterator it = m.begin(); it != m.end(); it++) cout << *it << " ";输入如下:上述代码运行后,出现了如下报错信息:请教班级大佬后...原创 2020-04-15 17:43:38 · 762 阅读 · 0 评论 -
【数据结构】 实验报告07 线性表的合并
一、实验目的和要求目的:两个表合并成一个有序表。要求设计两种以上储存方式、两种以上处理流程方式。分析各代码性能。要求:抽象数据类型独立实现。其它要求同作业-01要求。二、实验环境软件环境:visual stdio 2017硬件环境:①CPU:Intel(R)Core(TM)i7-8565U CPU @1.80Ghz②内存:8.0GB三、实验内容设计2种不同存储方式的线性...原创 2020-04-07 20:00:15 · 4775 阅读 · 2 评论