![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
lynalmost
这个作者很懒,什么都没留下…
展开
-
二叉树
二叉树:一个有穷的结合点集合。 这个集合可以为空 若不为空,则它是由根节点和称为其左子树和右子树两个不香蕉的二叉树组成。 二叉树的五种基本形式特殊的二叉树斜二叉树完美二叉树(满二叉树) 除了叶结点没有儿子以外,其他每个结点都有两个儿子。且树叶都在同一层。完全二叉树 有n个结点的二叉树,对树中结点按从上至下、从左到右顺序进行编号,编号为i(1≤i≤n)结点与满二叉树中编号为i结点在二叉树中原创 2017-07-28 18:15:40 · 226 阅读 · 0 评论 -
解决散列表冲突问题-分离链接散列表
分离链接的做法是将同一个值的所有元素放到一个表中如图创建分离链接散列表代码#include<stdio.h>#include<stdlib.h>typedef struct ListNode{ int Element; struct ListNode *next;}List;typedef struct HashTb1{ int TableSize; List原创 2017-08-20 23:39:57 · 562 阅读 · 0 评论 -
解决散列表冲突问题-开放定址法
指针是我们学习C语言的一大瓶颈,用分离链接散列算法的一大缺点也是因为他用到了指针,涉及到了内存分配。开放定址散列法是另一种解决冲突而不需要用到指针的算法。开放地址散列法的基本思想是,遇到了冲突,我们就用另一套法则,将此关键字放在其他的空缺位置上。显而易见,他的缺点是散列表的创建必须足够大,才能够容许我们进行相关的操作,比起分离链接法来讲,虽然算法速度上有所提升,但是内存浪费比较大。因为他的装填因子λ原创 2017-08-21 12:00:53 · 978 阅读 · 0 评论 -
不相交集ADT-概述
学了这么久的数据结构,发现很多基础知识其实在离散数学中早有涉及。不相交集中就涉及到关系 对不相交集的操作有两个,Find和Unoin。Find即返回包含给定元素的集合(即等价类)的名字。Union是添加关系,在添加两个元素的关系之前,应该判断它俩是否已经存在关系。如果没有存在关系,再进行后序操作。即将两个元素所在的等价类合并,去掉原来两个集合而保持所有集合的不相交性。 起初看到Union操作,还原创 2017-08-21 14:27:20 · 880 阅读 · 0 评论 -
关于图的一些定义和表示
一些定义:一个图(Gragh)G = (V,E)由定点(Vertex)集V和边(Edge)集E组成。图的每一条边都是由一个对点(v,w)组成的。如果点是有序的,那么图就叫做有向图。 反之则图为无向图。如果在一个无向图种从每一个顶点到每个其他顶点都存在一条路径,则称该无向图是连通的。具有这样的性质的有向图是强连通的。如果一个有向图不是强连通,但是他的基础图(其弧上去掉方向所形成的图)是连通的,那么该原创 2017-08-21 20:57:57 · 1147 阅读 · 0 评论 -
拓扑排序
拓扑排序是对有向无圈图的顶点的一种排序,它使得如果存在一条从vi到vj的路径,那么在排序中vj出现在vi的后面。显然,如果图中存在圈,那么拓扑排序是不可能完成的,因为对于圈上的两个顶点v和w,v先于w的同时w先于v,是矛盾的。一个简单的拓扑排序的算法:voidTopsort(Gragh G){ int Counter; Vertex V,W; for(Counte原创 2017-08-22 14:50:51 · 207 阅读 · 0 评论 -
无权图-最短路径
如果给图中的每条边赋一个值,或称权,那么这个图就叫做带权图。带权图在我们生活中很常见,生活中的交通路线,航班航线,都可以用带权图来表述。而生活中我们常常遇到的问题是,求从一个地点到另一个地点的最短距离,也就是求图中的最短路径问题。要求这个问题,我们首先要判断图中有没有带负值的弧,如果是带负值,要求其最短路径比较麻烦,因为如果构成了负值圈,就可以一直循环下去,这个大小是∞的。所以本博讨论的最短路径问题原创 2017-08-22 15:55:28 · 2070 阅读 · 0 评论 -
Dijkstra算法
如果我们要求最短路径的时带权图,那么问题就变得复杂起来了,因为我们要找的路线不是像无权图那样简单的找经过边最少的路径。例如:我们设置V1为起点,V6为终点 最短路径是V1 -> V4 -> V7 -> V6 而不是V1 -> V4 -> V6我们可以把无权图最短路径的算法当做是有权图最短路径算法的一个特例,他们的权恰好相等且都为1,那么他们的算法一定有共同之处。解决这个问题的算法就是Dijkst原创 2017-08-22 21:22:48 · 295 阅读 · 0 评论 -
最小生成树
最小生成树1.是一棵无回路的树。 2.V个顶点那么一定包含V-1条边。 3.是一棵生成树,包含原图中的全部顶点。 4.其中V-1条边全部来自于原图中,且其权重最小。 5.最小生成树不唯一。 6.对于任一生成树T,如果将一条不属于T的边e添加进来,则会产生一个圈。如果从该圈中任意除去一条边,则又恢复生成树的特性。PS:最小生成树存在当且仅当 G是连通的。在接下来得算法中,我们不考虑图G不连通原创 2017-08-23 13:47:49 · 594 阅读 · 0 评论 -
SkipList 跳表的原理
SkipList 跳表的原理前言在各类数据结构中,实现的方式无非两种,数组/链表,跳表是一种基于链表改进的数据结构,能够实现快速查找;levelDB中便用到了它。跳表是平衡树的一种替代的数据结构,但是和红黑树不同的是,跳表对于树的平衡的实现是基于一种随机化的算法也就是说跳表的插入和删除工作是比较简单的。接下来我们将了解跳表的实现原理。跳表的结构以下是一个普通的链表,假设我们需要访问...原创 2018-12-16 14:41:08 · 609 阅读 · 0 评论 -
散列/散列函数
散列是一种用于以常数平均时间执行插入、删除和查找的技术。每个关键字被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。这种映射就叫做散列函数我认为,先用散列函数将我们所要进行操作的集合整合成散列表,是对之后的操作的一种便利。放到实际中去,我们要进行操作的集合不仅仅只是数字,例如图书馆中的书籍分类等等。而且就算是一组不连续差距较大的数字,要执行后序的插入删除和查找都是很不方原创 2017-08-20 21:45:25 · 484 阅读 · 0 评论 -
树和树的表示
PART1 树在现实生活中,有很多具有层次的关系。层次管理具有很高的效率。在计算机中也是一样,树就实现了计算机中的层次,在查找修改信息方面提供了很大的方便。 之前在学习离散数学时已经对树有了了解,所以这里理解起来很容易。树的定义: n(n≥0)个结点构成的有限集合。 当n=0时,称为空树。 对于任意一棵非空树,他都具有以下性质: 1.树中有一个特殊结点叫做根(root),可用r表示。 2.原创 2017-07-28 17:35:22 · 709 阅读 · 0 评论 -
二叉树的遍历
1.先序遍历 遍历过程: 1.访问根结点。 2.先序遍历其左子树。 3.先序遍历其右子树。 代码实现(递归):void PreOrderTraversal(BinTree BT){ if(BT){ printf("%d", BT->Data); //访问根结点 PreOrderTraversal( BT->Left); /原创 2017-07-29 18:49:41 · 579 阅读 · 0 评论 -
二叉搜索树
二叉搜索树,也成二叉排序树或二叉查找树。并且满足以下性质:1.非空左子树的所有键值小于其根结点的键值。 2.非空右子树的所有键值大于其根节点的键值。 3.左右子树都是二叉搜索树。二叉搜索树操作的特别函数:1.Position Find ( ElemntType, BinTree BST):从二叉搜索树中查找元素X,返回其所在结点的地址 思路: 从根结点开始,如果树为空,返回NULL 若搜索原创 2017-07-29 22:01:41 · 237 阅读 · 0 评论 -
堆排序
堆是一种特殊的队列,是一种优先队列:取出的元素顺序是按照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。 堆的两个特性 结构性:用数组表示的完全二叉树 有序性:任意节点的关键字是其子树所有结点的最大值(或最小值)。分别称为最大堆和最小堆。 优先队列的完全二叉树:最大堆:最小堆堆排序其实就是对选择排序的改进算法1void Heap_Sort( ElementType A[], int原创 2017-07-29 22:19:16 · 164 阅读 · 0 评论 -
快速排序
快速排序是一种用到了分而治之的算法,在将要排序的集合中找一个主元,根据这个主元的大小来将集合分为块儿(一边是大于主元的,另一边是小于主元的)选择主元的方式有很多,但是最优的是恰好每次选的主元都能够让集合均分原创 2017-07-29 22:41:46 · 163 阅读 · 0 评论 -
表 学习笔记&&总结
对久仰“数据结构”的大名,也趁着各种机会,开始自学数据结构。听到数据结构的名字,觉得听高大上的,也疑惑了很久什么是数据结构? 听说是没有官方的统一定义,但是根据各计算机书籍对其定义,数据结构与算法总是联系在一起的。 例:“数据结构(data structure)是计算机中存储、组织、数据的方式。通常情况夏,精心选择的数据结构可以带来最优效率的算法。” —-中文维基百科 虽然是原创 2017-07-24 20:28:53 · 260 阅读 · 0 评论 -
栈 学习笔记&&总结
栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶。对栈的基本操作有Push(进栈)和 Pop(出栈),前者相当于插入,后者则是删除最后插入的元素。所以栈有时叫做LIFO(后进先出)表。PART 1 栈的基本了解 对栈的第一次接触也是在C语言的学习中。不同的数据存放的方式不同,使用的机制也相应不同。普通函数的调用,递归等都要用到栈。 对栈的实现有两种方法,一种原创 2017-07-26 11:38:23 · 461 阅读 · 0 评论 -
排序-插入排序
没有一种排序方法是在任何情况下都是表现最好的。插入排序可以用一种比较易懂的方式理解是“打扑克牌”。 我们在摸牌的时候总会把之后摸的排插入到它对应的位置上去。插入排序也是一样,用一个temp存每一次“摸”进的“牌”,与已经存在的“牌”进行对比,存放到它对应的位置上去。代码实现举例#include<stdio.h>#define N 5void Insertion_Sort(int A[N]);原创 2017-07-28 15:57:19 · 175 阅读 · 0 评论 -
表-队列
像栈一样,队列也是表。队列是具有一定操作约束的线性表。 特点 插入和删除操作:只能从表的一端插入,另一端删除。 数据插入:入队 数据删除:出队 先进先出:FIFO与其他的表类似,对队列的操作也有一下五种。 1.Create Queue(int MaxSize) 创建队列 2.IsFullQ (Queue Q, int MaxSize)判断队列是否已满 3.AddQ (Queue Q,原创 2017-07-27 10:21:31 · 253 阅读 · 0 评论 -
希尔排序
没有一种排序方法是在任何情况下都是表现最好的。希尔排序的名称源于它的发明者Donald Shell。 它通过比较相距一定时间间隔的元素来工作;各趟比较所用的举例随着算法的进行而减小,知道只比较相邻元素的最后一趟排序为止。 图解分别先进行五间隔比较,三间隔比较,最后进行一间隔比较。 对于每次间隔的选取可自己根据情况选择,但是最后一步必须是一间隔比较。代码实现:#include<stdio.h>原创 2017-07-28 16:38:24 · 260 阅读 · 0 评论 -
跳台阶/变态台阶之多种解法
跳台阶/变态台阶之多种解法一句话总结动态规划Those who cannot remember the past are doomed to repeat it.不吸取过去教训的人注定要重蹈覆辙很多人听闻动态规划就生畏(我也是),动规其实就像上面那句话,它的过程是每次决策依赖于当前状态,所以动规的重点是找出其状态转移方程。跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳...原创 2019-09-05 11:40:52 · 328 阅读 · 0 评论