随笔分类 - 算法速成系列
摘要:今天是大结局,说下“图”的最后一点东西,“最小生成树“和”最短路径“。一: 最小生成树1. 概念 首先看如下图,不知道大家能总结点什么。 对于一个连通图G,如果其全部顶点和一部分边构成一个子图G1,当G1满足: ① 刚好将图中所有顶点连通。②顶点不存在回路。则称G1就是G的“生成树”。 其实一句话总结就是:生成树是将原图的全部顶点以最小的边连通的子图,这不,如下的连通图可以得到下面的两个生成树。 ② 对于一个带权的连通图,当生成的树不同,各边上的权值总和也不同,如果某个生成树的权值最小,则它就是“最小生成树”。 2. 场景 实际应用中“最小生成树”还是蛮有实际价值...
阅读全文
摘要:今天来分享一下图,这是一种比较复杂的非线性数据结构,之所以复杂是因为他们的数据元素之间的关系是任意的,而不像树那样被几个性质定理框住了,元素之间的关系还是比较明显的,图的使用范围很广的,比如网络爬虫,求最短路径等等,不过大家也不要胆怯,越是复杂的东西越能体现我们码农的核心竞争力。 既然要学习图,得要遵守一下图的游戏规则。一: 概念 图是由“顶点”的集合和“边”的集合组成。记作:G=(V,E);<1> 无向图 就是“图”中的边没有方向,那么(V1,V2)这条边自然跟(V2,V1)是等价的,无向图的表示一般用”圆括号“。 <2> 有向图 “图“中的边有方向,自然<V.
阅读全文
摘要:今天说下最后一种树,大家可否知道,文件压缩程序里面的核心结构,核心算法是什么?或许你知道,他就运用了赫夫曼树。听说赫夫曼胜过了他的导师,被认为”青出于蓝而胜于蓝“,这句话也是我比较欣赏的,嘻嘻。一 概念了解”赫夫曼树“之前,几个必须要知道的专业名词可要熟练记住啊。 1: 结点的权 “权”就相当于“重要度”,我们形象的用一个具体的数字来表示,然后通过数字的大小来决定谁重要,谁不重要。2: 路径 树中从“一个结点"到“另一个结点“之间的分支。 3: 路径长度 一个路径上的分支数量。4: 树的路径长度 从树的根节点到每个节点的路径长度之和。 5: 节点的带权路径路劲长度其实也就是该节点到根
阅读全文
摘要:先前说了树的基本操作,我们采用的是二叉链表来保存树形结构,当然二叉有二叉的困扰之处,比如我想找到当前结点的“前驱”和“后继”,那么我们就必须要遍历一下树,然后才能定位到该“节点”的“前驱”和“后继”,每次定位都是O(n),这不是我们想看到的,那么有什么办法来解决呢? (1) 在节点域中增加二个指针域,分别保存“前驱”和“后继”,那么就是四叉链表了,哈哈,还是有点浪费空间啊。 (2) 看下面的这个二叉树,我们知道每个结点有2个指针域,4个节点就有8个指针域,其实真正保存节点的指针 仅有3个,还有5个是空闲的,那么为什么我们不用那些空闲的指针域呢,达到资源的合理充分的利用。一: 线索...
阅读全文
摘要:最近项目赶的紧,歇了一个星期没写博客了,趁周末继续写这个系列。 先前我们讲的都是“线性结构”,他的特征就是“一个节点最多有一个”前驱“和一个”后继“。那么我们今天讲的树会是怎样的呢?我们可以对”线性结构“改造一下,变为”一个节点最多有一个"前驱“和”多个后继“。哈哈,这就是我们今天说的”树“。一: 树 我们思维中的”树“就是一种枝繁叶茂的形象,那么数据结构中的”树“该是怎么样呢?对的,他是一种现实中倒立的树。1:术语 其实树中有很多术语的,这个是我们学习树形结构必须掌握的。 <1> 父节点,子节点,兄弟节点 这个就比较简单了,B和C的父节点就是A,反过来说就是B和C...
阅读全文
摘要:今天跟大家聊聊栈,在程序设计中,栈的使用还是非常广泛的,比如有“括号匹配问题“,”html结构匹配问题“。所以说掌握了”栈“的使用,对我们学习算法还是很有帮助的。一: 概念 栈,同样是一种特殊的线性表,是一种Last In First Out(LIFO)的形式,现实中有很多这样的例子, 比如:食堂中的一叠盘子,我们只能从顶端一个一个的取。二:存储结构 ”栈“不像”队列“,需要两个指针来维护,栈只需要一个指针就够了,这得益于栈是一种一端受限的线性表。 这里同样用”顺序结构“来存储这个”栈“,top指针指向栈顶,所有的操作只能在top处。 代码段: 1 #region 栈的...
阅读全文
摘要:可能大家都知道,线性表的变种非常非常多,比如今天讲的“队列”,灰常有意思啊。一:概念 队列是一个”先进先出“的线性表,牛X的名字就是“First in First Out(FIFO)”, 生活中有很多这样的场景,比如读书的时候去食堂打饭时的”排队“。当然我们拒绝插队。二:存储结构 前几天也说过,线性表有两种”存储结构“,① 顺序存储,②链式存储。当然“队列”也脱离 不了这两种服务,这里我就分享一下“顺序存储”。 顺序存储时,我们会维护一个叫做”head头指针“和”tail尾指针“,分别指向队列的开头和结尾。代码段如下: 1 #region 队列的数据结构 2 ...
阅读全文
摘要:一:线性表的简单回顾 上一篇跟大家聊过“线性表"顺序存储,通过实验,大家也知道,如果我每次向顺序表的头部插入元素,都会引起痉挛,效率比较低下,第二点我们用顺序存储时,容易受到长度的限制,反之就会造成空间资源的浪费。二:链表 对于顺序表存在的若干问题,链表都给出了相应的解决方案。1. 概念:其实链表的“每个节点”都包含一个”数据域“和”指针域“。 ”数据域“中包含当前的数据。 ”指针域“中包含下一个节点的指针。 ”头指针”也就是head,指向头结点数据。 “末节点“作为单向链表,因为是最后一个节点,通常设置指针域为null。代码段如下: 1 ...
阅读全文
摘要:人活在社会上不可能孤立,比如跟美女有着千丝万缕的关系,有的是一对一,有的是一对多,有的是多对多。哈哈,我们的数据也一样,存在这三种基本关系,用术语来说就是:<1> 线性关系。<2> 树形关系。<3> 网状关系。一: 线性表 1 概念: 线性表也就是关系户中最简单的一种关系,一对一。 如:学生学号的集合就是一个线性表。 2 特征: ① 有且只有一个“首元素“。 ② 有且只有一个“末元素”。 ③ 除“末元素”外,其余元素均有唯一的后继元素。 ④ 除“首元素”外,其余元素均有唯一的前驱元素。 3 ...
阅读全文
摘要:大家是否感觉到,树在数据结构中大行其道,什么领域都要沾一沾,碰一碰。就拿我们前几天学过的排序就用到了堆和今天讲的”二叉排序树“,所以偏激的说,掌握的树你就是牛人了。今天就聊聊这个”五大经典查找“中的最后一个”二叉排序树“。1. 概念: <1> 其实很简单,若根节点有左子树,则左子树的所有节点都比根节点小。 若根节点有右子树,则右子树的所有节点都比根节点大。 <2> 如图就是一个”二叉排序树“,然后对照概念一比较比较。 2.实际操作: 我们都知道,对一个东西进行操作,无非就是增删查改,接下来我们就聊聊其中的基本操作。 <1> 插入:相信大家对“...
阅读全文
摘要:大家可否知道,其实查找中有一种O(1)的查找,即所谓的秒杀。哈希查找: 对的,他就是哈希查找,说到哈希,大家肯定要提到哈希函数,呵呵,这东西已经在我们脑子里面形成固有思维了。大家一定要知道“哈希“中的对应关系。 比如说: ”5“是一个要保存的数,然后我丢给哈希函数,哈希函数给我返回一个”2",那么此时的”5“和“2”就建立一种对应关系,这种关系就是所谓的“哈希关系”,在实际应用中也就形成了”2“是key,”5“是value。 那么有的朋友就会问如何做哈希,首先做哈希必须要遵守两点原则: ①: key尽可能的分散,也就是我丢一个“6”和“5”给你,你都返回一个“2”,那么这样的...
阅读全文
摘要:在我们的生活中,无处不存在着查找,比如找一下班里哪个mm最pl,猜一猜mm的芳龄.......对的这些都是查找。在我们的算法中,有一种叫做线性查找。分为:顺序查找。 折半查找。查找有两种形态:分为:破坏性查找, 比如有一群mm,我猜她们的年龄,第一位猜到了是23+,此时这位mm已经从我脑海里面的mmlist中remove掉了。 哥不找23+的,所以此种查找破坏了原来的结构。 非破坏性查找, 这种就反之了,不破坏结构。顺序查找: 这种非常简单,就是过一下数组,一个一个的比,找到为止。 1 using System; 2 using System.Colle...
阅读全文
摘要:今天跟大家聊聊最后三种排序: 直接插入排序,希尔排序和归并排序。直接插入排序: 这种排序其实蛮好理解的,很现实的例子就是俺们斗地主,当我们抓到一手乱牌时,我们就要按照大小梳理扑克,30秒后, 扑克梳理完毕,4条3,5条s,哇塞...... 回忆一下,俺们当时是怎么梳理的。 最左一张牌是3,第二张牌是5,第三张牌又是3,赶紧插到第一张牌后面去,第四张牌又是3,大喜,赶紧插到第二张后面去, 第五张牌又是3,狂喜,哈哈,一门炮就这样产生了。 怎么样,生活中处处都是算法,早已经融入我们的生活和血液。 下面就上图说明: 看这张图不知道大家可否理解了,在插入排序中,数组会被...
阅读全文
摘要:首先感谢朋友们对第一篇文章的鼎力支持,感动中.......今天说的是选择排序,包括“直接选择排序”和“堆排序”。话说上次“冒泡排序”被快排虐了,而且“快排”赢得了内库的重用,众兄弟自然眼红,非要找快排一比高下。这不今天就来了两兄弟找快排算账。1.直接选择排序:先上图:说实话,直接选择排序最类似于人的本能思想,比如把大小不一的玩具让三岁小毛孩对大小排个序,那小孩首先会在这么多玩具中找到最小的放在第一位,然后找到次小的放在第二位,以此类推。。。。。。,小孩子多聪明啊,这么小就知道了直接选择排序。羡慕中........对的,小孩子给我们上了一课,第一步: 我们拿80作为参照物(base),在80后面
阅读全文
摘要:今天是开篇,得要吹一下算法,算法就好比程序开发中的利剑,所到之处,刀起头落。针对现实中的排序问题,算法有七把利剑可以助你马道成功。首先排序分为四种: 交换排序: 包括冒泡排序,快速排序。 选择排序: 包括直接选择排序,堆排序。 插入排序: 包括直接插入排序,希尔排序。 合并排序: 合并排序。那么今天我们讲的就是交换排序,我们都知道,C#类库提供的排序是快排,为了让今天玩的有意思点,我们设计算法来跟类库提供的快排较量较量。争取KO对手。冒泡排序:首先我们自己来设计一下“冒泡排序”,这种排序很现实的例子就是:我抓一把沙仍进水里,那么沙子会立马沉入水底,沙子上的灰尘会因为惯性暂时沉入...
阅读全文