数据结构
数据结构与算法,表,栈,队列,串,数,图,搜索和排序算法,你想要的这里都有!
可爱的野指针
逐梦人,为了心中的方向前行!
展开
-
数组的访问-下标访问和指针引用访问哪个更快?
昨天我们上c语言课,老师在讲数组的访问的时候,说到:数组的指针访问比下标访问更快原话在谭浩强先生的c程序设计第五版-p229最初我对这个有点疑问:指针访问不应该是间接访问问嘛?为什么会比下标直接放更快呢?课后我去问老师,老师说因为下标访问需要计算位置,int类型加4字节,而指针只需要找门牌号,效率更高……这样似乎合情合理,但事实真的是这样吗?后来我决定设计一个程序测试一下,我开了一个10万的数组,为了保证真实性,使用devc++,使用随机数赋值,然后访问()逐一遍历,可是事实并没有如我所愿,于是我试了二十原创 2020-05-27 13:33:22 · 2562 阅读 · 6 评论 -
给有需要的人-十大排序算法下(归并排序 快速排序 计数排序 桶排序(简单版本) 基数排序)
小孱弱弱来补上前天的大坑,尤其要注意的是桶排序,这里只介绍简单版本,后面分享算法导论时,再深入写写。#include <iostream>#include <cstdlib>#include <windows.h>#include <time.h>#include <vector> #include <algorithm>#include <math.h>#include <list>using原创 2020-05-28 21:23:47 · 122 阅读 · 0 评论 -
给有需要的人-十大排序算法上(冒泡排序 选择排序 插入排序 希尔排序 堆排序 )
插一下小孱弱弱总结的失格排序算法,今天分享前五个。思想无比重要哦!!#include <iostream>#include <cstdlib>#include <windows.h>#include <time.h>using namespace std;#define MAXN 10typedef struct{ int r[MAXN+1]; int length;}SqList;void swap(SqList *L,int i,原创 2020-05-26 11:19:11 · 177 阅读 · 0 评论 -
给有需要的人-(邻接矩阵转换边集数组)
今天小孱弱弱像往常一样码,克鲁斯卡尔算法中的边集数组,由于比较冷门,网上几乎找不到邻接矩阵转化边集数组的信息,于是小孱弱鼓起勇气写一篇,帮助有需要的人。为了保证时间复杂度不能太高,我们在遍历邻接矩阵时,由于是无向图,我们只需遍历左下三角形就ok,瞬间复杂度降低一大块,再往下,使用简单的冒泡排序将结构体按照权值排好。其实还有可以改进的地方,这只是做参考,希望帮到大家!//邻接矩阵转化边集数组 void TransEdge(Edge edges[],MGraph *G){ int i,j,k; f原创 2020-05-19 15:47:24 · 1474 阅读 · 7 评论 -
数据结构与算法-图(广度优先搜索dfs)
昨天我们接好了深度优先,他是按照一直深入搜索到底,然后 展开的顺序,而今天的方法广度优先,自然是先把搜索面打开,然后再去细致的搜索。下面我们仔细介绍啦,其实广度优先搜索类似于树的层序遍历,一层一层往下走,首先选择一个其实顶点,然后访问与这个顶点具有逻辑边关系的顶点,挨个访问,访问完毕后,从第一个顶点开始继续寻找它的所有逻辑边的顶点,然后再找下一个顶点的逻辑边顶点,就这样一直找完所有顶点。//广度优先搜索 (图->支撑树) //循环队列//顺序循环队列(定义)typedef struct {原创 2020-06-04 14:07:17 · 127 阅读 · 0 评论 -
数据结构与算法-图(深度优先搜索bfs)
昨天说完了图的存储结构,今天开始图的遍历算法啦,无论是dfs和bfs都是重中之重,我们需要好好理解。今天先开始bfs深度优先搜索算法,对于图结构来说,任何两个顶点都可能存在逻辑关系,我们不能用树的遍历方法,所以需要更加具有普遍性的算法,所谓图的遍历,就是从图的一个节点出发,去访问其余任何一个顶点,并且每个顶点只访问一次,从名字上就可以了解,深度搜索就是往深了去找,找到底,然后回溯,继续找,直到全部找到。规范来说,dfs是一个递归的过程,它从图的某个顶点出发,访问到的顶点做好标记,然后向未访问到的邻接点继原创 2020-06-03 12:47:57 · 134 阅读 · 0 评论 -
数据结构与算法-图(十字链表 邻接多重表 边集数组 )
前两天我们介绍的邻接矩阵和邻接表是最常用的图的存储结构,可是呢,对于一些算法需要更为精巧的存储方法,哪怕空间复杂度稍微低一点也没关系。今天介绍十字链表和邻接多重表还有边集数组。首先我们回想一下邻接表,对于有向图的邻接表,由于对于顶点出度的入度分别储存在邻接表和逆邻接表中,对于频繁访问出度的入度的算法很不方便,于是前辈们将邻接表和逆邻接表结合在一起,组成了十字链表,就可以方便的读取出度和入度啦。对于顶点表的结点,除了他作为弧尾指向弧头的指针,再加一个储存他作为弧头指向弧尾的指针,对于边表结点,我们设置ta原创 2020-06-02 14:53:41 · 223 阅读 · 0 评论 -
数据结构与算法-图(图的储存方式2-邻接表)
昨天我们介绍的邻接矩阵虽然很不错,但是对于稀疏图,由于边数较少,二维矩阵大量位置空闲,造成了很大浪费,于是针对边数较少的图结构,我们引入邻接表表示方法,为了避免内存浪费,我们采用链式动态是申请内存,来避免内存浪费,还记得没树的孩子表示法?用一个一维数组和链表相连的方法,邻接表也是这样的。1.图结构中顶点使用一个一维数组存储,每一个数组元素指向与他相连的边的另一端,有几个相连的顶点,用链表穿起来。2.图结构每一个顶点都构成一个链表,对于有向图,由弧尾指向弧头即可。3.链表的结点分为邻接点域和指针域。4原创 2020-06-01 11:18:46 · 174 阅读 · 0 评论 -
数据结构与算法-图(图的存储方法1 邻接矩阵 )
我们都知道线性表一对一,树是一对多,可是我们的图确是多对多,这意味着每一个结点相连接的结点数不确定,图的存储就成了问题,不过,我们的前辈们已经解决了,我们只需要领会这些伟大的成就!今天说一说邻接矩阵,我们 都知道,每一个图结构都是由若干个结点和边组成的,合并在一起存储很有难度,那我们分开存储呗,图的结构可没主次之分,每一个顶点都是等价的,因此使用一个一维数组存储很不错,但是仔细想想,一条边需要两个顶点,描述的是两个顶点的关系,那就用个二维数组存储吧,我们用横纵两个坐标式的矩阵存储图结构,这个矩阵成为邻接矩原创 2020-05-31 19:39:01 · 198 阅读 · 0 评论 -
数据结构与算法-图(绪论 图论基本概念)
昨天我的的树就分享完了,树的概念很多吧,二叉树,满二叉树,完全二叉树,赫夫曼树,孩子,双亲……多不?哈哈哈,这算不了什么,我们接下来要看到的图的概念才叫多,没关系,勤奋和时间会让你记住他们,内心只需要告诉自己,加油,我能行,就一定能学会图。不知道有没有看过或者学过离散数学,如果学过,那么恭喜啦,离散数学里的图论就是这一章的基础,图论学的还不错的话,压力就小了。先介绍的是图的定义,图-V个顶点和E条边组合成的集合,例如图G(V,E),就是一个图,我们在线性表的一对一,树的一对多,到了图这里,就是多对多啦,原创 2020-05-30 15:03:42 · 174 阅读 · 0 评论 -
数据结构与算法-赫夫曼树(赫夫曼树 赫夫曼编码)
我们的树好久没更新啦,小孱弱弱一只忙着算法,没关系,今天继续,我们介绍赫夫曼树的应用。你们用没用过压缩包,本地来挺大的一个文件,压缩一下,大小减少的不是一点点,想知道其中的原理吗?我们今天说的赫夫曼树是最早的压缩技术,当然我们现在的压缩技术非常发达了,我们只做了解最基本的就欧克。先说赫夫曼树,自然是一棵树啦,只不过我们只用叶子结点存储数据,并且分析出每个数据出现的频率,我们将叶子结点带上权值,权值就是它的出现频率,从根节点到达每一个叶子的路径长度代表它的访问,怎么做能让叶子结点的访问更加有效率呢,所有叶子原创 2020-05-29 20:44:27 · 217 阅读 · 0 评论 -
数据结构与算法-树(树 二叉树 森林三者的转换)
我们都知道呀,二叉树是特殊的树,小孱弱弱今天就分享它们之间的关系,我们都知道,二叉树避比数更有具有优势,如果我们有一棵树,要处理这棵树,自然是转化为二叉树更加方便啦,前辈们早就将算法设计出来了,我们只需要用就欧克。下面一起来看看吧!一、树转化为二叉树。1.加线。所有的兄弟节点之间都加一条线。2.去线。对树中的每个节点,只保留它与第一个孩子的连线,删除它和其他孩子的连线。3.层次调整。以树的根节点为轴心,整棵树顺时针旋转一定角度,让他们层次分明。注意:千万不能弄错左右孩子之间的关系。二、森林转化二原创 2020-05-25 20:52:48 · 161 阅读 · 0 评论 -
数据结构与算法-树(线索二叉树)
小孱弱弱又来了,今天分享的是二叉树的应用-线索二叉树,在我们用二叉链表时,有这样一个问题,只有一个孩子的结点和叶子结点,会有大量空余指针域,这无疑是巨大的浪费,,我们前辈们就设计出来线索二叉树,线索二叉树就是在每个结点加上两条线索,一个指向它的中序遍历前驱,一个指向它的中序遍历的后继,若不存在前驱或者后继,指向NULL,我们对以某种次序遍历使其变为线索二叉树的过程叫做线索化。为了区分指针是指向哪,我们设置两个布尔型变量,ltag和rtag,ltag为0表示指向左孩子,为1那就指向前驱,同样的rtag为0指向原创 2020-05-24 20:47:09 · 194 阅读 · 5 评论 -
数据结构与算法-树(遍历二叉树)
经过昨天的二叉树基本信息,相信你们对二叉树有了不错的了解了,小孱弱弱今天分享的是二叉树的四种遍历方法,前序遍历,中序遍历,后序遍历,层序遍历。为因为二叉树不同于线性结构,没有明确的前驱和后继,所以需要人为规定,按照某种次序遍历。首先介绍的是二叉树的前序遍历,根节点->左子树->右子树:简单吧,就这么简单,但是需要好好理解,对于左子树和右子树,依然是按照根左右的次序遍历,直到遍历完整棵树,前序遍历的“谦虚前序”的意思就是根结点先访问。第二个带来的是中序遍历,也是最常用的遍历方法,左子树-&原创 2020-05-23 20:24:35 · 107 阅读 · 0 评论 -
数据结构与算法-树(二叉树 二叉树的定义 二叉树的储存方式)
小孱弱弱继续昨天的坑,二叉树,这个可是重中之重呀,很多nb的数据结构基于的二叉树,b树,红黑树,赫夫曼等等,它的重要性不用说了吧,学好二叉树才有底气去学红黑树呀这些东西。——首先是二叉树的定义,每一个结点最多只有两个孩子的树就是二叉树,分左孩子和右孩子,他们是固定的。再介绍一个满二叉树,故名思意,满二叉树除了叶子节点的任何结点都有两个孩子。再来一个完全二叉树,完全二叉树叶子结点只能出现在最下面两层,最底层叶子结点只能集中于左边且连续,同样结点数的二叉树,完全二叉树的深度最低。下面介绍二叉树的性质:性质原创 2020-05-22 21:25:16 · 179 阅读 · 0 评论 -
数据结构与算法-树(树 森林 树的三种储存结构)
小孱弱弱又来了,终于到树了,等不及了,在这里,有众多以树为基础的数据结构和算法,绝对能令你们折服,这精妙的算法,注定令人收获颇丰,请继续往下看我们在重头戏之前的基本概念吧!我们的主题是树,那什么是树呢?树就是一对多的形式,只有一个根节点,有根节点向下蔓延,不断连接,构成的,每一个点我们称之为结点,最初的那个节点称为根节点,注意:根节点是唯一的,每个节点向下所指的结点称该节点的孩子,顺势我们称上结点为相连下节点的双亲,注意:每个节点都会有双亲(根节点除外)有且只有一个双亲,一个双亲可以有多个孩子,最下一层节原创 2020-05-21 21:16:51 · 528 阅读 · 0 评论 -
数据结构与算法-串(KMP匹配模式算法)
昨天有点小插曲,我们今天继续前天的字符串匹配模式算法,上次的朴素的匹配模式算法的效率非常低,于是我们想办法对它改进,前辈们就发现呀,如果要匹配的字符串前几位和后几位中某几位相同,前几位匹配失败的话,就可以直接跳过后几位的匹配过程,这样一来,效率就提高了,下面我们直接介绍前辈的kmp算法。我们设置一个数组next记住匹配字符串各个位置的j值。next[j]=0,j=1;Max{k|1<k<j,且p1…pk-1=pj-k+1…pj-1}当此集合不为空时;1 其他情况。例1:j:123456模原创 2020-05-20 21:37:08 · 169 阅读 · 0 评论 -
数据结构与算法-串(串的比较 朴素的模式匹配算法)
字符串的应用那是相当的广喽,我们当然要好好掌握一下字符串的操作了,今天小孱弱弱分享一下自己学习得字符串基本操作:首先几点注意事项,不知道你们忘记了没 啊哈哈~1.字符串的结尾‘\0’。2.全是’\0’的字符串是空串。下面带来第一个字符串操作算法:字符串的比较规则:1.两个字符串先比较第一个字符,asc2码大的那个字符串获胜(大)。(sadfs<bewd)2.若一直比较到最后一个字符都是相等,这两个字符串打成了平手(相等)。(asd==asd)3.若是比较到一定字符数,其中一个字符串到尾巴原创 2020-05-18 20:27:49 · 1483 阅读 · 0 评论 -
数据结构与算法-队列(队列 循环队列 链式队列)
和昨天的栈有一些类似,小孱弱弱今天分享的数据结构-队列,那是非常有意思~~,顾名思义呀,队列队列,就是排队呀,应该还记得栈的数据操作模式吧,仅在栈尾进行插入和删除操作,我们的队列呢,仅在队列头部删除,队列尾部插入,这就很清楚了吧,队列的应用很广泛,一定要搞清楚里面的思想哦。进入正题:先是循环队列,为什么不是顺序队列呢,顺序队列的有很多不足,每次我们做删除操作时,几乎所有元素都要移动,这显然大大提高复杂度,并不是我们想要的,但是循环队列就不一样了,插入删除不需要做大量元素的移动,只需要这是一个指针fron原创 2020-05-17 20:40:51 · 181 阅读 · 0 评论 -
数据结构与算法-栈(顺序栈 链式栈 共享空间栈 递归栈)
春风十里一枝花的小孱弱弱又来了,至此线性表的内容就结束了,这一篇文章我们讨论特殊的表——栈,这里的栈可不是我们学习内存管理中的堆区栈区那个栈,这里的栈是一种数据结构,向仔细了解,请继续往下阅读吧。不知道大家有没有玩过羽毛球,装羽毛球的筒子,我们先放进取的羽毛球在筒子的最底下,我们随后一个放进去的在最上面,羽毛球全放进去了怎么往外拿呀,阵势明知故问哈哈哈,一个一个往外拿呗,此时不知道大家有没有发现,我们后放进去的是最先拿出来的,子一个放进去的,是最后一个拿出来的。这就是数据结构-栈的定义。栈是仅在表尾进行原创 2020-05-16 21:05:44 · 244 阅读 · 1 评论 -
数据结构与算法-表(静态链表 循环链表 双向链表)
小孱弱弱又来打卡了,既上一篇的表继续,今天分享的数据结构相比于链表来说,不太常用,但是他们的重要性不言而喻,我们需要的是学习这种思想,走前辈走过的路,细品,这是对自己能力的考验,也是锻炼自己的好途径。你很棒,送给坚持为了梦想努力的人,是汗水就一定会有回报的!首先是静态链表,现在比较流行的语言c呀,c++呀,Java呀要不就是有指针,c和c++,Java等高级语言有引用,可以方便的创建链表,但是杜宇一些比较古老的语言,像是basic、Fortran等,他们没有指针,链表的结构就没法实现了,这怎可能难到计算机原创 2020-05-15 20:59:53 · 313 阅读 · 0 评论 -
数据结构与算法-表(单链表 循序表 )
小孱弱弱分享一下线性表中的循序存储结构和链式存储结构,不足之处,请指教~小老弟抱拳了~先说一说线性表list的定义:0个或多个数据元素的有限序列。线性表的概念其实还是很大的,向量vector,链表list,栈stack,队列queue,都属于线性表,只不过他们性质不同,用处自然也不同了。首先,介绍线性表的顺序存储结构-顺序表,顺序表的特色就是,所有的数据元素都存储在一段连续的存储单元中。一个数据元素紧挨着一个,类似于我们的一维数组和STL中的向量vector。下面是顺序表c语言的实现:在这里插入代原创 2020-05-14 21:23:24 · 282 阅读 · 1 评论 -
数据结构与算法-绪论(时间复杂度 空间复杂度 大O计法)
小孱弱弱自告奋勇,把自己对数据结构的理解分享一下!!!话不多说进入正题:众所周知,数据结构+算法=程序,一个好的程序必然是选择了又对又好的数据结构,带上精巧的算法组成的:今天我们研究的是什么样的算法是好算法:一个个好的算法必然做到了时间复杂度和空间复杂度的权衡得到的,空间复杂度好解释,我们写的程序也好,使用的元素也好,都是存储在计算机中的,运行时必然占据一定的内存,占据内存的的规格就是空间复杂度。至于时间复杂度,我们考虑这样一个结构:int sum=0,n;cin>>n;for(原创 2020-05-13 15:52:30 · 212 阅读 · 0 评论 -
数据结构与算法-栈(逆波兰表达式)
小孱弱弱又来发帖了,今天带泪的知识点是逆波兰表达式,相信学过栈的小盆友们都接触过这个极其不符合正常人思维的表达式,但是作为栈的重要应用,逆波兰表达式的地位那是相当的高,先让我们了解一下逆波兰表达式的历史。其实我们使用的计算器,都是采用这一原理,原因是机器思维无法理解括号的强制优先级课控制。多亏了波兰的女逻辑学家家哈哈哈,为什么没用发明者的名字命名的,她的名字太复杂了,看来想名流千古哦名字需要朗朗上口才行啊哈哈哈,打住!我们平常使用的运算式叫做中缀表达式,而后缀(逆波兰)表达式(RPN),他们可以通过一定原创 2020-05-12 22:14:51 · 339 阅读 · 0 评论