数据结构与算法
文章平均质量分 96
以数据结构与算法为主的学习笔记
大Null
Alias:一位木带感情的码农。
因CSDN过于商业化,博主已转战Github,所有资源均已迁移至Github个人网站,具体地址请查看详细资料。
展开
-
《数据结构与算法》(二十五)- 排序算法:快速排序
目录前言1. 快速排序1.1 快速排序算法1.2 快速排序算法复杂度分析1.3 快速排序优化2. 总结前言部分内容摘自程杰的《大话数据结构》1. 快速排序 快速排序算法最早由图灵奖获得者 Tony Hoare 设计出来的,他在形式化方法理论以及 ALGOL60 编程语言的发明中都有卓越的贡献,是上世纪最伟大的计算机科学家之一。而这快速排序算法只是他众多贡献中的一个小发明而已。 更牛的是,我们现在要学习的这个快速排序算法,被列为 20 世纪十大算法之一。我们这些玩编程的人还有什么理由不去学习它原创 2021-11-24 16:28:13 · 1090 阅读 · 1 评论 -
《数据结构与算法》(二十四)- 排序算法:归并排序
目录前言1. 归并排序1.1 归并排序算法1.2 归并排序复杂度分析1.3 非递归实现归并排序2. 总结前言部分内容摘自程杰的《大话数据结构》1. 归并排序 上一篇我们讲了堆排序,因为它用到了完全二叉树,充分利用了完全二叉树的深度是 ⌊log2n⌋+1\lfloor log_2n\rfloor +1⌊log2n⌋+1 的特性,所以效率比较高。不过堆结构的设计本身是比较复杂的,老实说,能想出这样的结构就挺不容易,有没有更直接简单的办法利用完全二叉树来排序呢?当然有。 先来举一个例子。你们知道原创 2021-11-24 14:58:38 · 337 阅读 · 0 评论 -
《数据结构与算法》(二十三)- 排序算法:堆排序
目录前言1. 堆排序1.1 堆排序算法1.2 堆排序复杂度分析2. 总结前言部分内容摘自程杰的《大话数据结构》1. 堆排序 我们前面讲到简单选择排序,它在待排序的n个记录中选择一个最小的记录需要比较n-1次。本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否.则如何知道它是最小的记录。 可惜的是,这样的操作并没有把每一趟的 比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较原创 2021-11-24 13:13:49 · 679 阅读 · 0 评论 -
《数据结构与算法》(二十二)- 排序算法:希尔排序
目录1. 希尔排序1. 希尔排序 给大家出一道智力题。请问 “VII” 是什么? 嗯,很好,它是罗马数字的 7。现在我们要给它加上一笔,让它变成 8(VIII),应该是非常简单,只需要在右侧加一-竖线即可。 现在我请大家试着对罗马数字9,也就是“IX" 增加一笔,把它变成6,应该怎么做? 我这里有 3 种另类的方法可以实现它。 方法一:观察发现 “X” 其实可以看作是一个正放一个倒置两个 “V”。 因此我们,给 “IX” 中间加一条水平线,上下颠倒, 然后遮住下面部分,也就是说,我们原创 2021-11-23 18:52:18 · 666 阅读 · 0 评论 -
《数据结构与算法》(二十一)- 简单排序算法详解:冒泡、简单选择、直接插入
目录前言1. 排序的基本概念与分类1.1 排序的稳定性1.2 内排序与外排序1.3 排序用到的结构与函数2. 冒泡排序2.1 最简单排序的实现2.2 冒泡排序算法2.3 冒泡排序优化2.4 冒泡排序复杂度分析3. 简单选择排序3.1 简单选择排序算法3.2 简单选择排序复杂度分析4. 直接插入排序4.1 直接插入排序算法4.2 直接插入排序复杂度分析5. 总结前言部分内容摘自程杰的《大话数据结构》1. 排序的基本概念与分类 排序是我们生活中经常会面对的问题。同学们做操时会按照从矮到高排列;老师查原创 2021-11-17 16:50:02 · 1203 阅读 · 0 评论 -
《数据结构与算法》(二十)- 散列表查找
目录前言1. 散列表查找(哈希表)概述1.1 散列表查找定义1.2 散列表查找步骤2. 散列函数的构造方法2.1 直接定址法2.2 数字分析法2.3 平方取中法2.4 折叠法2.5 除留余数法2.6 随机数法3. 处理散列冲突的方法3.1 开放定址法3.2 再散列函数法3.3 链地址法3.4 公共溢出区法4. 散列表查找的实现4.1 散列表查找的算法实现4.2 散列表查找性能分析5. 总结前言部分内容摘自程杰的《大话数据结构》1. 散列表查找(哈希表)概述 在前面的顺序表查找中,我们曾经说过,如原创 2021-11-17 12:50:15 · 1223 阅读 · 0 评论 -
《数据结构与算法》(十九)- 多路查找树
目录前言1. 多路查找树(B树)1) 2-3树1.1) 2-3树的插入实现1.2) 2-3树的删除实现2) 2-3-4树3) B树4) B+树2. 总结前言部分内容摘自程杰的《大话数据结构》1. 多路查找树(B树) 内存一般都是由硅制的存储芯片组成,这种技术的每一个存储单位代价都要比磁存储技术昂贵两个数量级,因此基于磁盘技术的外存,容量比内存的容量至少大两个数量级。这也就是目前 PC 通常内存几个 G 而已、而硬盘却可以成百,上千 G 容量的原因。 我们前面讨论过的数据结构,处理数据都是在内原创 2021-11-16 15:13:53 · 414 阅读 · 0 评论 -
《数据结构与算法》(十八)- 平衡二叉树
目录前言1. 平衡二叉树(AVL树)1.1 平衡二叉树实现原理1.2 平衡二叉树实现算法2. 总结前言部分内容摘自程杰的《大话数据结构》1. 平衡二叉树(AVL树) 有一部德国人制作的叫《平衡》(英文名:Balance)的短片,它在 1989 年获得奥斯卡最佳短片奖。说的是在空中,悬浮着一个四方的平板,上面站立着 5 个人,同样的相貌,同样的装束,同样的面无表情。平板的中心是个看不见的支点,为了平衡,5 个人必须寻找合适的位置。原本,简单的站在中心就可以了,可是,如同我们一样,他们也好奇于这个世原创 2021-11-16 11:06:26 · 404 阅读 · 0 评论 -
《数据结构与算法》(十七)- 二叉排序树
目录前言1. 二叉排序树1.1 二叉排序树的查找操作1.2 二叉排序树的插入操作1.3 二叉排序树删除操作1.4 二叉排序树总结2. 总结前言部分内容摘自程杰的《大话数据结构》1. 二叉排序树 大家可能都听过这个故事,说有两个年轻人正在深山中行走。忽然发现远处有一只老虎要冲过来,怎么办?其中一个赶忙弯腰系鞋带,另一个奇怪地问:“你系鞋带干什么?你不可能跑得比老虎还快。” 系鞋带者说:“我有什么必要跑赢老虎呢?我只要跑得比你快就行了。” 这真是交友不慎呀!别急,如果你的朋友是系鞋带者,你怎么办原创 2021-11-15 15:31:09 · 1049 阅读 · 0 评论 -
《数据结构与算法》(十六)- “查找”详解
目录1. 查找概论2. 顺序表查找2.1 顺序表查找算法2.2 顺序表找优化3. 有序表查找3.1 折半查找3.2 插值查找1. 查找概论 只要打开电脑,就会涉及到查找技术。如炒股软件中查股票信息、硬盘文件中找照片、在光盘中搜DVD,甚至玩游戏时在内存中查找攻击力、魅力值等数据修改用来作弊等,都要涉及到查找。当然,在互联网上查找信息就更加是家常便饭。所有这些需要被查的数据所在的集合,我们给它一个统称叫查找表。 查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合。例如下图就原创 2021-11-15 15:30:13 · 814 阅读 · 0 评论 -
《数据结构与算法》(十五)- 图的应用:有向无环图
目录前言1. 拓扑排序1.1 拓扑排序介绍1.2 拓扑排序算法2. 关键路径2.1 关键路径算法的原理2.2 关键路径算法3. 总结前言部分内容摘自程杰的《大话数据结构》1. 拓扑排序1.1 拓扑排序介绍 我们会把施工过程、生产流程、软件开发、教学安排等都当成一个项目工程来对待,所有的工程都可分为若千个 “活动” 的子工程。例如下图是一张电影制作流程图,现实中可能并不完全相同,但基本表达了二个工程和若千个活动的概念。在这些活动之间,通常会受到一定的条 件约束,如其中某些活动必须在另一些活动完成原创 2021-11-11 17:15:34 · 1656 阅读 · 0 评论 -
《数据结构与算法》(十四)- 图的应用:最短路径
目录前言1. 最短路径1.1 迪杰斯特拉(Dijkstra)算法1.2 佛洛依德(Floyd)算法2. 总结前言部分内容摘自程杰的《大话数据结构》1. 最短路径 我们时常会面临着对路径选择的决策问题。例如在北京、上海、 广州等城市,因其城市面积较大,乘地铁或公交都要考虑从A点到B点,如何换乘到达?比如下图这样的地铁网图,如果不是专门去做研究,对于刚接触的人来说,都会犯迷糊。 现实中,每个人需求不同,选择方案就不尽相同。有人为了省钱,它需要的是路程最短(定价以路程长短为标准),但可能由于线路班原创 2021-11-11 14:47:18 · 994 阅读 · 0 评论 -
《数据结构与算法》(十三)- 图的应用:最小生成树
目录前言1. 最小生成树1.1 普里姆(Prim)算法1.2 克鲁斯卡尔(Kruskal)算法2. 总结前言部分内容摘自程杰的《大话数据结构》1. 最小生成树 假设你是电信的实施工程师,需要为一个镇的九个村庄架设通信网络做设计,村庄位置大致如下图,其中 v0_00~v8_88 是村庄,之间连线的数字表示村与村间的可通达的直线距离,比如 v0_00 至 v1_11 就是 10 公里(个别如 v0_00 与 v6_66,v6_66 与v8_88,v5_55 与 v7_77 未测算原创 2021-11-10 17:24:21 · 1156 阅读 · 0 评论 -
《数据结构与算法》(十二)- 图详解
目录1. 图的定义1.1 各种图的定义1.2 图的顶点与边间关系1.3 连通图的相关术语1.4 图的定义与术语总结2. 图的抽象数据类型3. 图的存储结构3.1 邻接矩阵3.2 邻接表3.3 十字链表3.4 邻接多重表1. 图的定义 在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关。这和一对父母可以有多个孩子,但每个孩子却只能有一对原创 2021-11-10 15:42:19 · 830 阅读 · 1 评论 -
《数据结构与算法》(十一)- 树、森林与二叉树的转换及哈夫曼树详解
目录1. 树、森林与二叉树之间的转换1.1 树转换为二叉树1.2. 森林转换为二叉树1.3. 二叉树转换为树1. 树、森林与二叉树之间的转换1.1 树转换为二叉树 树如下图所示。 将树转换为二叉树的步骤如下:加线。在所有兄弟结点之间加一条连线,如下图所示。去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。层次调整。以树的根结点为轴心,将整棵树顺时针旋转一定的角度, 使之结构层次分明。注意第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右原创 2021-11-09 12:34:32 · 1369 阅读 · 0 评论 -
《数据结构与算法》(十)- 二叉树详解
目录1. 二叉树简介1.1 二叉树的定义1.2 二叉树的特点1.2 特殊二叉树2. 二叉树的性质2.1 二叉树的性质12.2 二叉树的性质22.3 二叉树的性质32.4 二叉树的性质42.5 二叉树的性质53. 二叉树的存储结构3.1 二叉树顺序存储结构1. 二叉树简介1.1 二叉树的定义 现在我们来做个游戏,我在纸上已经写好了一个 100 以内的正整数数字,请大家想办法猜出我写的是哪一个?注意你们猜的数字不能超过 7 个,我的回答只会告诉你是 “大了” 或 “小了”。 这个游戏在一些电视节目中原创 2021-11-08 15:41:51 · 921 阅读 · 0 评论 -
《数据结构与算法》(九)- 树详解
目录前言1. 树1.1 树的定义1.2 结点的分类1.3 结点间的关系1.4 树的其他相关概念2. 树的抽象数据类型3. 树的存储结构3.1 双亲表示法3.2 孩子表示法3.3 孩子兄弟表示法4. 总结前言部分内容摘自程杰的《大话数据结构》1. 树1.1 树的定义 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构——“树”,考虑它的各种特性,来解决我们在编程中碰到的相关问题。树(Tree)是n (n≥0) 个结点的有限集。n原创 2021-11-02 16:30:35 · 429 阅读 · 0 评论 -
《数据结构与算法》(八)- 串详解
目录1. 串的定义2. 串的比较3. 串的抽象数据类型4. 串的存储结构4.1 串的顺序存储结构4.2 串的链式存储结构5. 朴素的模式匹配算法6. KMP模式匹配算法6.1 KMP模式匹配算法原理1. 串的定义 早先的计算机在被发明时,主要作用是做一些科学和工程的计算工作, 也就是现在我们理解的计算器,只不过它比小小计算器功能更强大、速度更快一些。 后来发现,在计算机上作非数值处理的工作越来越多,使得我们不得不需要引入对字符的处理。于是就有了字符串的概念。 比如我们现在常用的搜索引擎,当我们在文原创 2021-11-02 14:19:16 · 802 阅读 · 0 评论 -
《数据结构与算法》(七)- 队列详解
目录前言1. 队列的定义2. 队列的抽象数据类型3. 循环队列3.1 队列顺序存储的不足3.2 循环队列定义4. 队列的链式存储结构及实现4.1 队列的链式存储结构——入队操作4.2 队列的链式存储结构——出队操作5. 总结前言部分内容摘自程杰的《大话数据结构》1. 队列的定义 相信大家在用电脑时都经历过,机器有时会处于疑似死机的状态,鼠标点什么似乎都没用,双击任何快捷方式都不动弹。就当你失去耐心,打算 reset 时。突然它像酒醒了一样, 把你刚才点击的所有操作全部都按顺序执行了一遍。这其实是原创 2021-11-01 20:09:19 · 385 阅读 · 0 评论 -
《数据结构与算法》(六)- 栈详解
目录1. 栈的定义1.1 栈的定义1.2 进栈出栈变化形式2. 栈的抽象数据类型3. 栈的顺序存储结构及实现3.1 栈的顺序存储结构3.2 栈的顺序存储结构——进栈操作1. 栈的定义1.1 栈的定义 很多软件,比如Word、 Photoshop 等文档或图像编辑软件中,都有撤销(undo)的操作,也是用栈这种方式来实现的,当然不同的软件具体实现代码会有很大差异,不过原理其实都是一样的。栈( stack )是限定仅在表尾进行插入和删除操作的线性表。 我们把允许插入和删除的一端称为栈顶(top),原创 2021-10-31 18:28:22 · 1003 阅读 · 0 评论 -
《数据结构与算法》(五)- 链表详解
目录链表的定义链表的定义原创 2021-10-18 18:46:16 · 942 阅读 · 0 评论 -
《数据结构与算法》(四)- 线性表详解
目录1. 线性表的定义2. 线性表的抽象数据类型3. 线性表的顺序存储结构3.1 顺序存储定义3.2 顺序存储方式3.3 数组长度和线性表长度的区别1. 线性表的定义线性表(List):零个或多个数据元素的有限序列。线性表是一个序列,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。然后,线性表强调是有限的,元素个数也是有限的。事实上,在计算机中处理的对象都是有限的,那种无限的数列,只存在于数学的概念中。如果用数学语言来进行定义。可如原创 2021-10-13 19:38:59 · 661 阅读 · 0 评论 -
《数据结构与算法》(三)- 如何估算时间复杂度
目录1. 算法时间复杂度1.1 算法时间复杂度的定义1.2 推导大O阶方法1.3 常数阶1.4 线性阶1.5 对数阶1.6 平方阶2. 常见的时间复杂度3. 最坏情况和平均情况4. 算法空间复杂度4.1 递归情况4.2 非递归情况5. 总结1. 算法时间复杂度1.1 算法时间复杂度的定义在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大原创 2021-10-11 17:42:37 · 760 阅读 · 0 评论 -
《数据结构与算法》(二)- 算法详解
目录前言1. 数据结构与算法的关系2. 两种算法的比较3. 算法的定义4. 算法的特性4.1 输入输出4.2 有穷性4.3 确定性4.4 可行性5. 算法设计的要求5.1 正确性5.2 可读性5.3 健壮性5.4 时间效率高和存储量低6. 算法效率的度量方法6.1 事后统计法6.2 事前分析估算法7. 函数的渐进增长8. 总结前言部分内容摘自程杰的《大话数据结构》1. 数据结构与算法的关系数据结构为算法提供服务,算法围绕数据结构操作。数据结构只是静态的描述了数据元素之间的关系。高效的程序需要原创 2021-10-11 15:24:26 · 587 阅读 · 0 评论 -
《数据结构与算法》(一)- 数据结构详解
数据结构 = 逻辑结构 + 存储结构线性结构:原创 2021-10-11 11:12:34 · 223 阅读 · 0 评论