数据结构与算法
文章平均质量分 74
SinHao22
渺沧海之一粟
展开
-
内部排序算法总结(下)【C++实现】
上节总结了基于交换的排序:冒泡排序和快速排序;以及基于插入的排序:简单插入排序和希尔排序。内部排序算法总结(上)【C++实现】本节总结两种基于选择的排序:选择排序和堆排序CONTENT一、 基于选择的排序1. 选择排序2. 堆排序一、 基于选择的排序1. 选择排序2. 堆排序 思想 (1)什么是堆?堆:符合以下两个条件之一的完全二叉树:每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆;每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。如下图图片来源我们用数组的方式原创 2021-05-24 22:23:14 · 129 阅读 · 1 评论 -
内部排序算法总结(上)【C++实现】
CONTENT0. 前言1. 基于交换的排序1.1 冒泡排序1.2 快速排序2. 基于插入的排序2.1 简单插入排序2.2 希尔排序0. 前言该系列更多的是为了方便以后快速复习,所以只总结排序算法的思想、动画演示、代码和时间复杂度。更详细的内容可看这篇博客,本篇中的图片和一些内容出自该博客。参考博客 排序算法种类 各排序算法时间复杂度1. 基于交换的排序1.1 冒泡排序 (1) 思想冒泡排序有三种写法:(1)一边比较一边向后两两交换,将最大值 / 最小值冒泡到最后一位;(2)原创 2021-05-23 20:07:05 · 249 阅读 · 8 评论 -
查找专题
CONTENT1. 静态查找2. 动态查找3. 哈希表1. 静态查找静态查找 vs 动态查找静态查找只做查询操作,而动态查找表还需要做插入和删除操作,如:若查找的元素不在表中,则进行插入;或删除查找到的元素。静态查找中主要想说二分查找,这是一种很简单但很高效的查找方式,但只能针对有序表,无序表不能进行二分查找。最好情况下时间复杂度为O(1)最坏情况下时间复杂度为O(logn)参考:时间复杂度推导来道leetcode例题class Solution {public: int se原创 2021-05-22 17:06:06 · 96 阅读 · 2 评论 -
图的应用——最短路径(迪杰斯特拉算法)
Content1. 什么是最短路径2. 迪杰斯特拉算法【O(n^2^)】3. 代码4. 迪杰斯特拉算法 VS 普利姆算法1. 什么是最短路径在一个带权有向图中,从某一顶点到另一顶点可能有很多条路径,最短路径即权值之和最小的那条路径。如在上图中,从顶点0到顶点5的最短路径是0-4-3-5,长度为60。2. 迪杰斯特拉算法【O(n2)】该算法用到了贪心的思想,设 v0为源点,S 为已求得的最短路径的终点集合; 则下一条最短路径。( 设其终点为 v)或者是弧 < v0, v>, 或者是中间原创 2021-05-21 11:33:34 · 2166 阅读 · 1 评论 -
图的应用——关键路径
目录1. 基本概念2. 求AOE网中关键路径的思路1. 基本概念 1.AOV网和AOE网(1)AOV网:一种有向图,图中的顶点表示活动,边表示活动之间的关系。如上图中,顶点为课程(活动),边为课程之间的优先关系。(2)AOE网:一种有向图,边表示活动,顶点表示事件,边上的权值表示活动持续的时间。如:上图中,边表示活动(买东西或运东西),权值代表活动持续的时间,顶点代表事件。我们要研究的关键路径问题就是基于AOE网的。 2. 关键路径AOE网用来估算工程的完成时间。网中只有一个原创 2021-05-20 20:03:25 · 1369 阅读 · 1 评论 -
图的应用——拓扑排序(判断有向图有无回路)
目录1. 拓扑排序的用处2. 拓扑排序的思想3. 代码实现1. 拓扑排序的用处对于有向图,我们有时候需要确保没有回路出现,如下面的例子:学生学习的课程之间的优先关系构成了一个有向图,显然,该有向图不能出现回路,毕竟哪个学生也不想一直学习某几门课程不毕业。而拓扑排序的作用,就是帮我们判断一个有向图是否有回路出现。2. 拓扑排序的思想其实拓扑排序的思想很简单:(1)在有向图中选择一个没有前驱(入度为0)的顶点输出;(2)从图中删除该顶点和所有以它为尾的弧;(3)重复(1)、(2)两步,直至全原创 2021-05-19 16:16:29 · 7385 阅读 · 2 评论 -
图的应用——如何构造最小生成树
目录1. 图的基本概念2. 什么是最小生成树?3. 普利姆算法1. 图的基本概念 1.什么是图? 图由顶点和边组成,表示为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。根据边是否有方向,可分为有向图和无向图。 2. 邻接点 两结点之间通过边相连,则互为邻接点。如在上面的无向图中,(1,3),(2,5)等都为邻接点。 3. 顶点的度 顶点的度指的是与顶点v相连的边的数目。对于无向图来讲,只有度的概念,而对于有向图来讲,可分为入度和出度。入度是指向该顶点的边的条数,出原创 2021-05-18 19:24:06 · 4710 阅读 · 0 评论 -
图的遍历方法——DFS和BFS
DFS类似于树的先序遍历,因此可以用递归实现;BFS类似于树的层次遍历,因此可以用队列实现。说明:下面代码中图的存储方式是邻接表。关于邻接表和邻接矩阵可看邻接表和邻接矩阵1.深度优先遍历( Depth First Search) 思想 从图中的某一个顶点 v0 出发,访问此顶点,然后依次从 v0 的没被访问的邻接点出发深度优先遍历图(体现了递归的思想),直至图中所有和 v0 有路径相通的顶点都被访问到;若此时图中仍有结点没有被访问,则另选图中一个未曾访问的顶点作起始点,重复上述过程。因为要原创 2021-05-18 18:48:38 · 5005 阅读 · 0 评论 -
图的存储方式——邻接矩阵和邻接表
目录1. 基本概念2. 图的存储方式2.1 邻接矩阵2.2 邻接表3.两种方式的比较1. 基本概念 1.什么是图? 图由顶点和边组成,表示为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。根据边是否有方向,可分为有向图和无向图。 2. 邻接点 两结点之间通过边相连,则互为邻接点。如在上面的无向图中,(1,3),(2,5)等都为邻接点。 3. 顶点的度 顶点的度指的是与顶点v相连的边的数目。对于无向图来讲,只有度的概念,而对于有向图来讲,可分为入度和出度。入度是指向该原创 2021-05-18 18:32:01 · 6400 阅读 · 0 评论 -
如何构造哈夫曼树
目录1.什么是哈夫曼树2.哈夫曼树的用处举例3.构造一棵哈夫曼树的思路4.哈夫曼编码实现代码1.什么是哈夫曼树设有n个权值{w1,w2,w3,…,wn},构造有n个叶子结点的二叉树,每个叶子结点带权为wi,则其中带权路径长度最小的二叉树称为赫夫曼树或最优二叉树。哈夫曼树又称最优二叉树。2.哈夫曼树的用处举例【举例一】有效减少比较次数 设有 10000 个数据, 左边的数据组织形式需要进行 31500 次比较;而右边的树进行 22000 次比较。【举例二】有效减少存储空间 哈夫曼编码:保原创 2021-05-15 20:12:39 · 26225 阅读 · 9 评论 -
二叉树的种类
种类定义示意图满二叉树从形象上来说满二叉树是一个绝对的三角形,也就是说它的最后一层全部是叶子节点,其余各层全部是非叶子节点,如果用数学公式表示那么其节点数n=2k-1其中k表示深度,也就是层数。(P.s:为什么结点数是2k-1?完全二叉树若有k层,则k-1层为满二叉树,k层所有叶子结点左边靠齐二叉搜索树又称二叉排序树,左子树结点的值均小于根结点,右子树结点的值均大于根结点,左右子树也是二叉搜索树(递归定义)二叉平衡树1. 是...原创 2021-05-15 19:48:53 · 327 阅读 · 0 评论 -
二叉树的五条性质
性质一 对任何一棵二叉树,在第i层上最多有2i-1个结点(i≥1)。 性质二 对任何一棵二叉树,深度为 k 的二叉树上至多含 2k-1 个结点(k≥1)。证明:由性质一可知,第i层最多有2i-1个结点,所以深度为k的二叉树的结点个数最多为:20+21+…+2k-1 = 2k-1 性质三 对任何一棵二叉树,若它含有n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0 = n2+1。Ps:度为结点的孩子个数,对于二叉树而言结点的度只能为0,1,2证明: 设二叉树有n个结.原创 2021-05-15 19:25:51 · 1241 阅读 · 0 评论 -
STL——string容器的push_back()和append()的区别
string中的push_back()和append()函数都是向string的结尾插入,但push_bach()只能插入单个字符char,而append可以插入string。 【举例】#include <iostream>#include <string>using namespace std;int main(){ string s1 = "I am a string"; string s2(s1); string append_s = "原创 2021-05-10 20:36:24 · 2882 阅读 · 0 评论 -
STL函数——remove函数
目录1. remove函数2. 错误用法3.remove的执行过程4. 如何真正删除1. remove函数remove是STL中的函数,和erase是有区别的:(1)erase是容器自带的成员函数,而remove是STL中的函数;(2)erase是真正的删除,而remove是虚假的删除。(下面会说明) 作用 顾名思义,该函数作用是移除容器中的元素。 参数 参数有三个:头指针、尾指针和要删除的元素。int b[] = {1,2,3,4,5,5,6};vector<int> a原创 2021-05-07 17:10:36 · 5224 阅读 · 0 评论 -
STL容器——vector与list
目录0. 前言1.vector用法2.list用法0. 前言vector可以看作一动态数组,list是一双向链表,示意图如下:图片来源 vector vs list (1)vector为存储的对象分配一块连续的地址空间 ,随机访问效率很高。但是 插入和删除需要移动大量的数据,效率较低。(2)list中的对象是离散的,随机访问需要遍历整个链表, 访问效率比vector低。但是在list中插入元素,尤其在首尾 插入,效率很高,只需要改变元素的指针。(3)vector是单向的,而list是双向的原创 2021-05-07 16:45:14 · 556 阅读 · 0 评论