数据结构与算法分析
文章平均质量分 87
本专栏记录了基本数据结构和常用经典算法,主要参考殷建平等译《算法导论》和李建中等译《数据结构(C语言版)》。
逆风微积分
目前从事Android系统框架层开发工作
展开
-
算法——字符串匹配之BM算法
本文介绍了一种基于后缀匹配的模式串匹配算法Boyer-Moore算法,简称为BM算法,该算法在好的情况下查找时间复杂度比KMP算法要快。原创 2014-10-10 20:00:52 · 2798 阅读 · 0 评论 -
算法——字符串匹配之KMP算法
本节介绍Knuth-Morris-Pratt字符串匹配算法(简称KMP算法)。该算法最主要是构造出模式串pat的前缀和后缀的最大相同字符串长度数组next,和前面介绍的《朴素字符串匹配算法》不同,朴素算法是当遇到不匹配字符时,向后移动一位继续匹配,而KMP算法是当遇到不匹配字符时,不是简单的向后移一位字符,而是根据前面已匹配的字符数和模式串前缀和后缀的最大相同字符串长度数组next的元素来确定向后移动的位数,所以KMP算法的时间复杂度比朴素算法的要少,并且是线性时间复杂度,即预处理时间复杂度是O(m),匹配原创 2014-10-09 12:43:59 · 3015 阅读 · 2 评论 -
算法——字符串匹配之有限自动机算法
本文介绍了有限自动机(Finite Automata)字符串匹配算法。原创 2014-10-08 20:13:04 · 5468 阅读 · 0 评论 -
算法——字符串匹配之Rabin-Karp算法
本文介绍了Rabin-Karp字符串匹配算法原创 2014-10-08 16:27:12 · 13039 阅读 · 1 评论 -
算法——字符串匹配之朴素算法
本文讲解了字符串匹配算法中最简单的算法——朴素字符串匹配算法。原创 2014-10-08 09:40:33 · 5129 阅读 · 0 评论 -
算法——最大流:Ford-Fulkerson方法
首先介绍一些基本概念。流网络原创 2014-09-07 18:59:24 · 4799 阅读 · 0 评论 -
算法——所有节点对的最短路径:Floyd-Warshall算法、Johnson算法
所有节点对的最短路径前言前面介绍了单源最短路径问题,本文是介绍所有节点对的最短路径问题,首先我们会想到用前面所介绍的知识来求解该问题,根据不同类型的图可以用一下几种方法求解:1、 若无权重的图,则可以使用|V|次BFS,时间复杂度是O[V*(V+E)];2、 若为非负权重边的图,则可以使用|V|次Dijkstra算法,不同的优先队列实现得到不同的时间复杂度:①线性数组,O(V3原创 2014-09-05 21:39:13 · 6677 阅读 · 1 评论 -
算法——单源最短路径:Bellman-Ford算法、Dijkstra算法
前言在最短路径问题中,约定原创 2014-09-04 17:17:40 · 3102 阅读 · 0 评论 -
算法——最小生成树:Kruskal算法、Prim算法
最小生成树定义:在一个具有Vg原创 2014-09-02 15:46:54 · 4097 阅读 · 0 评论 -
算法——基本的图算法:广度优先搜索、深度优先搜索
图的表示对于图,其中和分别表示边数和节点数。图有两种表示方法:邻接链表和邻接矩阵。邻接链表法:由一个包含条链表的数组所构成,每个节点都有一个链表。对于每个结点,邻接链表Adj[u]包含所有与结点u之间有边相连的结点v。邻接矩阵法:对邻接矩阵表示来说,我们通常会将图G中的结点编为1、2、……、|V|,这种编号可以任意。在进行编号之后,图G的邻接矩阵表示一个|V|*|V|的矩阵A=(aij原创 2014-09-01 19:37:37 · 2101 阅读 · 0 评论 -
数据结构——B树
前言:B树一棵多路平衡二叉树原创 2014-08-17 22:36:19 · 1973 阅读 · 0 评论 -
数据结构——平衡二叉树(AVL树)
前言: 由于二叉查找树不是严格意义上的O(logN),为了查找时间复杂度能够严格意义上的O(logN),在二叉查找树的基础上进行改进,附加一个性质,即某棵树根节点的左右子树高度相差不能大于1。如果左右子树高度相差大于1,则需进行旋转调整。原创 2014-08-16 21:38:05 · 1720 阅读 · 2 评论 -
算法——贪心算法
定义:贪心算法是指在原创 2014-08-16 15:21:24 · 1488 阅读 · 0 评论 -
算法——动态规划
定义: 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。原创 2014-08-16 09:29:43 · 1366 阅读 · 0 评论 -
数据结构——红黑树(RB-Tree)
红黑树本质上是一棵二叉查找树,但在二叉查找树的基础上,每个节点增加了一位存储来表示节点的颜色。有关二叉查找树的介绍在前面博文已经介绍过了,这里不再进行讲解。红黑树的性质:1)每个结点要么是红的,要么是黑的。 2)根结点是黑的。 3)每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。 4)如果一个结点是红的,那么它的俩个儿子都是黑的。 5)对于任一结点而言,其原创 2014-08-06 18:36:07 · 4011 阅读 · 0 评论 -
数据结构——哈希表(散列表)
导言:数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数组”,如图:原创 2014-07-24 20:43:46 · 2533 阅读 · 0 评论 -
数据结构与算法——堆排序
堆排序二叉堆的介绍,原创 2014-07-10 11:52:26 · 1268 阅读 · 0 评论 -
数据结构与算法——冒泡排序、选择排序和快速排序
冒泡排序冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序算法的步骤:1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相原创 2014-07-10 11:37:08 · 2115 阅读 · 0 评论 -
数据结构与算法——归并排序
归并排序(Merge Sort)算法归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。原创 2014-07-10 11:24:00 · 1123 阅读 · 0 评论 -
数据结构与算法——插入排序和希尔排序
插入排序插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。原创 2014-07-10 11:06:46 · 1313 阅读 · 0 评论 -
数据结构与算法——线性时间排序(计数排序、基数排序、桶排序)
前言:计数排序、基数排序he原创 2014-07-09 20:14:14 · 1285 阅读 · 0 评论 -
数据结构——二叉查找树(C语言)
定义:二叉查找树是一棵二叉树,因此可以用链式结构来存储数据。若二叉查找树不为空,则应具有以下性质:关键字的值唯一若左子树不为空,则子树任何节点关键字值一定小于其根节点的关键字值若右子树不为空,则子树任何节点关键字值一定大于其根节点的关键字值左、右子树任然是二叉查找树结构二叉查找树的操作查找节点:若二叉查找树为空,则查找失败若该树非空且查找数据x等原创 2014-03-24 21:48:30 · 2367 阅读 · 0 评论 -
数据结构——斐波那契堆FibonacciHeap(C语言)
前一篇博文记录了二项堆的一些操作,本文介绍与之相似的堆结构——斐波那契堆。斐波那契堆是可合并堆,一些操作可以在常数滩还时间内完成,而二项堆中的一些操作需要O(lgn);定义一个斐波那契堆是一序列具有最小堆序的有根树的集合。也就会说,每棵树都遵循最小堆性质:每个节点的关键字不小于它父节点的关键字。注:斐波那契堆里的树可以不说二项树,并且根链表是无序的。结构斐波那契堆是由一原创 2014-03-21 15:30:31 · 2325 阅读 · 2 评论 -
数据结构——二项堆(C语言)
二项堆的合并操作比二叉堆的合并操作复杂度要低,个人觉得二项堆比较难理解,现借此把学习二项堆的笔记写下,这个知识点本人理解的还是不够透彻,希望得到大家的指教。因为二项堆是一组二项树的集合,学习二项堆时,需要用到二项树的知识点,在这里先讲解下二项树的概念和一些性质。二项树定义二项树采用的是递归定义的有序树,二项树B0只包含一个结点,二项树Bk由两颗二项树Bk-1链接而成:其中一棵树的根原创 2014-03-18 09:54:00 · 2012 阅读 · 0 评论 -
数据结构——左高树(C语言)
介绍左高树之前,先简单介绍下扩充二叉树的概念。扩充二叉树一棵二叉树,其所有空的子树都由方形结点代替。方形结点称为外部结点,原来的结点称为内部结点。 设x是扩充二叉树的一个结点,并令left_child(x)和right_child(x)分别表示内部结点的左、右儿子。定义shortest(x)为从x到一个外部结点的最短路程长度。左高树定义左高树是一棵二叉树,且如果该二叉树不空,原创 2014-03-13 22:25:19 · 3336 阅读 · 0 评论 -
数据结构——双端堆(C语言)
定义双端堆:是一棵完全二叉树,该完全二叉树要么为空,要么同时满足下列性质:(1) 根节点不包含元素;(2) 左子树是一个最小堆;(3) 右子树是一个最大堆;(4) 如果右子树不空,令i是左子树中任意一节点,j是i在右子树中的对应节点。如果i在右子树中的对应节点不存在,则令j为i父节点在右子树中的对应节点。对于节点i和j,节点i的关键字小于等于j的关键字。双端堆的插入原创 2014-03-12 21:33:59 · 2031 阅读 · 0 评论 -
数据结构——最大堆和最小堆(C语言)
定义:最大堆和最小堆都是一棵完全二叉树。最大堆:是指根节点的关键字值是堆中的最大关键字值,且每个节点若有儿子节点,其关键字值都不小于其儿子节点的关键字值。最小堆:是指根节点的关键字值是堆中的最小关键字值,且每个节点若有儿子节点,其关键字值都不大于其儿子节点的关键字值。以下的操作以最大堆为例,最小堆相似。最大堆的插入操作步骤:1、把当前节点数i设置为已知堆的节原创 2014-03-12 14:03:47 · 11531 阅读 · 0 评论 -
数据结构——最小最大堆(C语言)
最小最大堆一、定义最小-最大堆:是一棵完全二叉树,二叉树的各层交替为最小层和最大层,且根节点位于最小层。最大层:该层上的节点大于等于以其为根节点的子树上的所有节点。最小层:该层上的节点小于等于以其为根节点的子树上的所有节点。二、性质1、处于最小层节点的关键字值逐层增大,这里是指按树本身节点的联系顺序而非层次遍历的顺序。2、处于最小层节点的关键字值逐层减小。原创 2014-03-11 18:43:34 · 2676 阅读 · 0 评论 -
数据结构——二叉树的遍历问题(C语言)
二叉树的遍历方式有以下几种:递归遍历、非递归遍历(即迭代遍历)和层次遍历。一、递归遍历:1、先序递归遍历:就是从二叉树的根结点开始,先访问结点的数据,再访问二叉树的左子树结点,直到遇到空结点为止。然后,返回到最近的有右儿子的父亲结点,并从该结点的右儿子开始继续遍历。源程序如下:void Pre_Order_BinTree(BinTree Ptr){ if(Ptr) {原创 2014-02-23 21:45:18 · 1813 阅读 · 0 评论 -
数据结构——二叉树的链式实现(C语言)
二叉树:是有限多个结点的集合,这个集合或者是空集,或者有一个根结点和两棵互不相交的,分别称为左子树和右子树的二叉树组成。以下是C语言源程序:函数声明:#ifndef BinTree_H#define BinTree_H/****二叉树结构的声明*****/typedef char Elemtype;typedef struct node{ Elemtype data;原创 2014-02-23 21:02:56 · 2325 阅读 · 0 评论 -
数据结构——双向链表(C语言)
单链表的结点中只有一个指向其后继结点的指针域next,在单链表中,想要找其前驱则只能从该链表的头指针开始,顺着各结点的next 域进行,也就是说找后继的时间性能是O(1),找前驱的时间性能是O(n)。 双向链表结点中存储两个指针域,即结点的直接前驱和直接后继,这样方便操作。以下是链表的结构:以下是C语言源程序:函数声明:#ifndef List_H#defin原创 2014-02-20 20:50:40 · 1529 阅读 · 0 评论 -
数据结构——队列的链式实现(C语言)
队列是一种先进先出的线性表,但队列顺序存储的时候,操作不方便,为了操作简单,队列采用链式存储结构。队列入队时只能在队尾操作,出队时在队首操作,头结点的指针域有头指针(front)和尾指针(rear),头结点只存放指针域,不存放数据项,但头指针和尾指针指向头指针时,队列为空。以下是C语言源程序:函数声明:#ifndef Queue_H#define Queue_Htypedef i原创 2014-02-19 10:48:51 · 1854 阅读 · 0 评论 -
数据结构——链栈的实现(C语言)
大家都知道栈的顺序存储的效率低,对删除和插入不方便操作。栈的链式实现操作方便,只需改变链栈的指针域指针的方向,不需要移动数据项。链栈只能在栈顶操作,也就是说只能在栈顶入栈和出栈。以下是源程序:函数声明:#ifndef Stack_H#define Stack_Htypedef int Item;typedef struct node * PNode;typedef s原创 2014-02-18 20:53:08 · 2828 阅读 · 0 评论 -
数据结构——线性表的链式结构(C语言)
链式存储:以节点的方式存储,节点包括数据域和指针域,指针域的指针指向下一个节点的存储位置,数据的存储可以不连续。头指针作为链表的索引,使链表操作方便,头指针指向头节点,头节点指向第一个节点,以此类推,直到尾节点。以下是源程序:原创 2014-02-18 14:47:02 · 2185 阅读 · 3 评论