随笔分类 - 数据结构和算法
摘要:1. 二项堆数据结构简介2. 存储模型3. 实现代码分析4. 参考资料及代码下载<1>. 二项堆数据结构简介一颗二项堆是由一组二项树组成,在给出二项堆的定义之前,首先我们来定义什么是二项树。二项树是一种递归的定义:1. 二项树B[0]仅仅包含一个节点2. B[k]是由两棵B[k-1]二项树组成,其中一颗树是另外一颗树的子树。下面是B0 - B4二项树:显然二项树具有如下的性质:1. 对于树B[k]该树含有2^k个节点;2. 树的高度是k;3. 在深度为i中含有Cik节点,其中i = 0, 1,2 ... , k;定义完二项树之后,下面来定义二项堆H,二项堆是由一组满足下面的二项树组
阅读全文
摘要:1.聊一聊跳表作者的其人其事2. 言归正传,跳表简介3. 跳表数据存储模型4. 跳表的代码实现分析5. 论文,代码下载及参考资料<1>. 聊一聊作者的其人其事跳表是由William Pugh发明。他在 Communications of the ACM June 1990, 33(6) 668-676 发表了Skip lists: a probabilistic alternative to balanced trees,在该论文中详细解释了跳表的数据结构和插入删除操作。William Pugh同时还是FindBug(没有使用过,这是一款java的静态代码分析工具,直接对java
阅读全文
摘要:1. 红黑树简介2. 红黑树性质介绍3. 漫游红黑树4. 我的EasyCoding库5. 参考资料及代码下载<1>. 红黑树简介红黑树是一种平衡的二叉查找树,是一种计算机科学中常用的数据结构,最典型的应用是实现数据的关联,例如map等数据结构的实现。1972年,鲁道夫贝尔最先发明,但是他称之为“对称二叉B树”,真正的称之为“红黑树”是在1978年Leo J. Guibas 和 Robert Sedgewick的一篇论文开始的。这么算起来,红黑树已经存在了将近30年,时至今日,仍旧另初学者头痛不已。<2>. 性质简介红黑树拓展了二叉查找树,给每个树的节点增加了一个Colo
阅读全文
摘要:1. 无向图图的表示2. 无向图遍历算法3. 最小生成树算法4. 代码下载1. 无向图表示下面的代码中使用的无向图的表示方法和有向图中表示相同。如下:2.无向图遍历算法无向图的遍历算法和有向图是类似,具体可以常见上一篇有向图的介绍。3. 最小生成树算法3.1 基本概念在表示最小生成树之前,首先定义最小生成树。设图G= (V, E),对于其中的每条边(u, v) 属于E,定义函数w(u, v)为连接u和v的代价,定义最小生成树T(E的子集),T连接所有的顶点,并且权值最小。3.2 算法思想最小生成树的基本算法采用“贪心策略”。我们初始化一个集合T,然后在每次迭代保证向T中加入边后,A仍然能够保证
阅读全文
摘要:今天下午做的一道笔试题,题目如下:“有十二个外表相同的球,其中有一个坏球,它的重量和其他十一个有轻微的(但是可以测量出来的)差别。现在有一架没有砝码的很灵敏的天平,问如何称三次就能保证找出那个坏球,并知道它比标准重还是轻。”①②③④⑤⑥⑦⑧⑨⑩⑾⑿第一次:①②③④和⑤⑥⑦⑧称,A,若平,则次品是⑨⑩⑾⑿之一;第二次:⑨⑩和①②称,a,若平,则次品是⑾⑿之一;第三次:⑾和①称,若平,则⑿是次品;若不平,则⑾是次品。b,若不平,则次品是⑨⑩之一;第三次:⑨和①称,若平,则⑩是次品;若不平,则⑨是次品。B,若不平,①②③④边重,则次品是①②③④之一(次品比正品重),或⑤⑥⑦⑧之一(次品比正品轻);第
阅读全文
摘要:1. 图的表示2. 有向图的遍历算法:深度优先3.有向图的遍历算法:广度优先4 代码反思5. 下载1. 图的表示 1.1 图的定义图G定义为V和E的集合G={V, E},其中V表示图中的所有的顶点集合,E表示的是G中的所有的边的集合。图按照E中的元素是否有方向,分为有向图和无向图。1.2 图的表示方法上面给出的数学上图的定义,那么在计算机中如何表示图?通常意义上,有下面的两种方法:邻接表和邻接矩阵表示法。无向图的邻接表和邻接矩阵表示如下所示:有向图的邻接表和邻接矩阵表示如下所示:根据上面的表示方法,下面定义图G的这种数据结构(邻接表),首先定义图的顶点GraphVertex: // 顶点显示的
阅读全文
摘要:1.状态机及形式语言基础2. 版本1:仅仅匹配一个?3. 版本2:如何匹配*?4. 如何实现*, ?的匹配?5. 如何实现根据输入的pattern,生成DFA状态机?1. 状态机及形式语言基础1.1 语言和文法在计算机中存在下面两个比较重要的问题,一个问题提出之后,能否使用计算机来执行,如果能够执行的话,那么该怎么执行?这些都是计算模型需要解决的问题,为解决山这些问题,需要来首先了一下什么是形式语言,相对于自然语言而言,如何去描述一个形式语言(文法)?自然语言就是日常的口头语言,将一个自然语言翻译成另外的一种自然语言的问题引出了“形式语言”的概念。下面就是一个迭代的定义: 1.字母表V:含有有
阅读全文
摘要:1. 直接寻址2. 散列表3. 散列函数设计1. 直接寻址使用散列的目的是能够快速取得某个元素,那么如果能够保证每个元素都存在一个“槽”的话(类似于数组),就能够完成在O(1)的时间内完成取元素的工作。如果一个集合的元素都是取自全域U={1, 2, ... m},那么通过使用数组T[1,...m]来保证每个元素都存在与之对应的”槽“。2. 散列表散列方式下,关键字k是放在h(k)中,显然散列表方法中最主要的是如何设计散列函数,尽可能的减少散列之间的冲突。但是散列中的冲突是无法避免的,那么常见的两种解决方法是:链接法和开放寻址法。2.1 链接法链接法的核心思想就是冲突的元素(具有相同的h(k))
阅读全文
摘要:1. 数组最大值和最小值问题2.给定数组A,查找数组中第i小的数据3. 代码下载1. 最大值和最小值问题1.1 给定一个数组A,如何求得数组A中的最大元素和最小元素?最直接的算法显然就是通过遍历数组实现,那么现在的问题是这个算法是否是最优的呢?类比比赛淘汰机制的话,可以看出上面的算法在比较次数上是最优的。简单的实现:int maxElementInArray(int* arr, int length){ int max = arr[0]; for(int i = 1; i < length; ++i) { if (arr[i] > max) max = arr[i]; } retu
阅读全文
摘要:1. 二叉树简介2. 二叉树实现代码及boost类库中对于图的支持简单介绍3. 代码反思4. 代码下载1. 二叉树简介二叉树顾名思义,除了叶子节点之外,每个节点均含有两个子节点。例如:二叉查找树是满足下面的下面条件的 二叉树:下面定义在二叉查找树上的操作: 1. 二叉查找树上最大元素:maxElement 2. 最小元素:minElement 3. 前序遍历:preOrder 4. 中序遍历:inOrder 5. 后序遍历:postOrder 6.中序遍历的前驱:precursor 7. 中序遍历后继:successor 8. 插入节点:insertNode 9. 删除节点:deleteNod
阅读全文
摘要:1. list类型简介2. c++代码实现及stl中list的使用示例3. 代码下载1. list类型简单介绍list表示线性表类型,能够动态改变长度。可以使用数组或者是链表的形式进行存储。数组形式如下:这里使用的是链表表示,并且带有头节点。定义其上的操作如下: 1. 插入元素:insertNode 2. 删除元素:deleteNode 3. 查找元素:search2. c++代码实现及stl中list使用示例c++实现代码如下:#include <iostream>using namespace std;struct MyListNode{ int m_nValue; MyLis
阅读全文
摘要:1. queue数据结构简单介绍2. queue简单实现(c++)及stl中queue的简单使用示例3. 代码下载1. queue数据结构的简单介绍queue是这样的一种数据结构,遵循“先进先出”的顺序。队列上的操作和stack上的基本上相似: 1. 判空: isEmpty 2. 判满:isFull 3. 入队:enqueue 4. 出队: dequeue下面代码中的队列是使用数组实现的,特别需要指出的是在队列实现时应该特别注意如何区分队列是空或者队列满的情况。下面是通过空缺一个位置的方法来实现的(长度n的数组最多只能存放n-1个元素)。另外可以使用一个bool标志等实现方式。下图是队列实现中
阅读全文
摘要:1. 栈数据结构简单介绍2. 简单实现代码及stl中stack简单使用3. 代码下载1. 栈数据结构简单介绍栈是这样的一种数据结构,遵循“先进后出”的原则。在stack上定义如下的operations: 1. 判空 2. 入栈push 3. 出栈pop,在栈的不同实现版本中,有的实现pop元素返回栈顶的元素,有的实现却仅仅是将栈顶元素弹出,通过top函数得到栈顶元素 4. 判满2. 实现代码以及stl中stack的简单使用下面的栈使用数组来存储元素。代码如下:#include <iostream>using namespace std;class MyStack{ // 数据成员
阅读全文
摘要:1. 问题描述2. 思路及实现代码1. 问题描述http://acm.hrbeu.edu.cn/index.php?act=problem&id=1004&cid=18某石油公司发现了一个油田。该油田由n*m个单元组成的矩形,有些单元里有石油,有些则没有。单元油田可以通过上,下,左或右连通。在一个单元油田里架设一台采油机,它可以把和该单元油田相连的单元油田的石油采完。该公司想知道最少需要架设几台采油机能把所有的石油采完?示例输入:2 2@**@2 2@@@@示例输出:212. 思路及实现代码广度优先搜索算法实现。//广度优先搜索算法#include<iostream>
阅读全文
摘要:1. 其他排序算法介绍1. 其他排序算法介绍1.1 计数排序使用条件:待排序的元素是在某个范围之内的,通过计算比每个元素小的元素的个数,然后就可以知道该元素的位置,直接放置即可。1.2 桶排序待排序的数据是在某个范围之内,将该数据分布到n个只区间之内,在只区间内排序,然后按顺序合并这些区间中的数据即可。
阅读全文
摘要:1. 快速排序思想2. 实现代码3. 代码下载1. 快速排序思想快速排序主要是基于下面的事实:对于数组A,首先对其进行分割成两部分,前面一部分的值是小于所选定的主元(pivot),后面一部分是大于主元的,然后通过递归调用排序刚刚分割的两部分,即实现对与整个数组的排序。伪代码如下:2. 实现代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceAlice.Sort{publicclassQuickSort{//实现快速排序[start,end]publicstaticvoi
阅读全文
摘要:1. 堆简单介绍,数据存储及堆上定义的操作2. 堆排序简单实现及算法的时间复杂度3. 代码下载1. 堆简单介绍,数据存储及堆上的定义的操作二叉堆在本文中使用数组(.net中的List)来存储,它可以完全被看作是一颗二叉树。除了叶子节点外,其他每层都是满的。二叉堆可以分为最大堆和最小堆。最大堆定义如下:有定义可知,最大堆中中根元素是最大的。最小堆定义与最大堆定义正好相反,最小堆中根元素是最小元素。下面定义堆上的操作。 1. 给定某个节点下标i,该节点的父节点PARENT(i) = floor(i / 2) 2. 给定某个节点下标i,该节点的左孩子LEFT(i) = 2 * i 3. 给定某个节点
阅读全文
摘要:1. 数组的随机排列算法及其简单验证2.随机算法简单分析3. 代码下载1. 数组的随机排列算法及其简单验证1.1 数组的排列的随机算法的最终目的是达到,数组每个元素在每个位置上出现的概率为1/n(其中n为数组大小)。一种的算法如下,对于数组A中的每个元素A[i],随机附上一个权值,然后根据该权值对A数组进行排序。下面是一个简单的实现,排序使用的是冒泡排序,代码如下: publicstaticvoidPermuteBySorting(refint[]A){intlength=A.Length;List<int>B=newList<int>();//随机数System.Ra
阅读全文
摘要:///<summary>///判定给定num是否是回文数字///</summary>///<paramname="num">待判断数字</param>///<paramname="digistsNums">num位数</param>///<returns></returns>publicstaticboolJudge(intnum,intdigistsNums){//递归结束条件if(digistsNums<=1)returntrue;else{//否则
阅读全文
摘要:这里仅仅是最简单的递归式的生成求解方法,主要是为了分析算法的时间复杂度。总结起来存在下面的几种方法吧。1. 猜测法说白了讲,就是说给定一个递归式,根据“经验”来猜测可能的函数f(n),这里面如果是递归式比较简单的话,很容易猜测,但是如果递归式的形式比较负责,往往猜测法是难以奏效的。2. 递归树该方法的实质就是通过将递归式展开,然后求和的过程,其中可能的难点在于如何计算多项式的和,这里可能需要高等数学的知识啦。3. 万能的方法:公式求解对于一些常见的递归式的话,我们可以直接使用公式进行运算,这个比较简单,但是公式比较长,记忆起来比较恶心,有兴趣可以自己证明一下。
阅读全文