
大话数据结构
文章平均质量分 69
用Java语言对数据结构及经典算法进行解析,配以插图和例子,与君共勉。
zdp072
Jim的IT专栏
展开
-
大话数据结构二十二:图的存储结构之边集数组
1. 边集数组简介:边集数组由两个一维数组构成:1.) 一个存储顶点信息。2.) 一个存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)、和权(weight)组成。2. 边集数组适用场景:边集数组关注的是边的集合,在边集数组中要查找一个顶点的度需要扫描整个边数组,效率并不高。因此它更适合对原创 2014-02-23 13:09:46 · 3998 阅读 · 0 评论 -
大话数据结构二十一:图的存储结构之邻接多重表
1.引言:若要删除左边的(V0,V2)这条边,需要对图下表的阴影两个结点进行删除操作。2.邻接多重表的存储结构:iVex和jVex:是与某条边依附的两个顶点在顶点表中的下标。iLink:指向依附顶点iVex的下一条边。jLink:指向依附顶点jVex的下一条边。3.邻接多重表示意图绘制:原创 2014-02-23 12:58:27 · 7677 阅读 · 2 评论 -
大话数据结构二十:图的存储结构之十字链表
1. 引言:对于有向图来说,邻接表是有缺陷的:邻接表:关心了出度问题,想了解入度就必须要遍历整个图才知道。逆邻接表:解决了入度,却不了解出度的情况。能否把邻接表和逆邻接表结合起来呢?答案就是:使用十字链表。2.十字链表存储结构:顶点表结点结构:firstin:表示入边表头指针,指向该顶点的入边表中第一个结点。f原创 2014-02-23 12:01:30 · 3769 阅读 · 1 评论 -
大话数据结构十九:图的存储结构之邻接表
1. 邻接表(无向图)的特点:有时候邻接矩阵并不是一个很好的选择:如上图: 边数相对顶点较少,这种结构无疑是存在对存储空间的极大浪费。邻接表: 数组和链表结合一起来存储。1.)顶点用一个一位数组存储。2.)每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以我们选择单链表来存储。2. 邻接表原创 2014-02-23 11:08:54 · 2174 阅读 · 0 评论 -
大话数据结构十八:图的存储结构之邻接矩阵
1. 邻接矩阵(无向图)的特点:图的邻接矩阵存储方式是用两个数组来表示图:1.)一个一维数组存储存储图中顶点信息。2.)一个二维数组(称为邻接矩阵)存储图中边或弧的信息。上图中我们设置两个数组:顶点数组:vertex[4] = {V0,V1,V2,V3}边数组:arc[4][4] 为对称矩阵(0表示顶点间不存在边,1表示顶点间存在边)原创 2014-02-22 22:22:33 · 1767 阅读 · 0 评论 -
大话数据结构十七:图的一些概念
图的基本术语:1) 图(Graph):图G由两个集合V和E组成,记为G=(V,E),这里V是顶点的有穷非空集合,E是边(或弧)的集合,而边(或弧)是V中顶点的偶对。 顶点(Vertex):图中的结点又称为顶点。 边(Edge):相关顶点的偶对称为边。2) 有向图(Digraph):若图G中的每条边都是有方向的,则称G为有向图。 弧(原创 2013-11-12 22:55:57 · 1777 阅读 · 1 评论 -
大话数据结构十六:哈夫曼树(最优二叉树)
1. 引子当前素质教育的背景下,小学的学科成绩都改为了优秀、良好、及格、不及格这样的模糊词语,而不再通报具体的分数。用代码可以表示如下:if( a < 60 ) System.out.print("不及格"); else if( a < 70 ) System.out.print("及格"); else if( a < 90 ) System.out.p原创 2013-11-10 13:46:09 · 2126 阅读 · 0 评论 -
大话数据结构十五:线索二叉树
1. 什么是线索二叉树?n个结点的二叉链表中含有(2n-(n-1)=n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。2. 为什么要加线索?① 很多空指针域没有存储任何事物,对内存资源是一种浪费。② 二叉链表中,我原创 2013-11-07 21:46:37 · 1779 阅读 · 0 评论 -
大话数据结构十四:二叉树的顺序存储结构(数组实现)
1. 顺序存储结构:二叉树的顺序存储结构就是用一维数组存储二叉树中的结点。2. 完全二叉树:完全二叉树由于其结构上的特点,通常采用顺序存储方式存储。一棵有n个结点的完全二叉树的所有结点从1到n编号,就得到结点的一个线性系列。如下图:完全二叉树除最下面一层外,各层都被结点充满了,每一层结点的个数恰好是上一层结点个数的2倍,因此通过一个结点的编号就可以推知它原创 2013-11-04 23:40:20 · 12018 阅读 · 0 评论 -
大话数据结构十三:二叉树的链式存储结构(二叉链表)
1. 二叉树的特点i、每个结点最多有两颗子树ii、左子树和右子树是有顺序的,次序不能任意颠倒iii、即使树中某结点只有一颗子树,也要区分它是左子树还是右子树2. 二叉树五种形态空二叉树,只有一个根结点,根结点只有左子树,根结点只有右子树,根结点既有左子树又有右子树3. 特殊的二叉树3.1原创 2013-11-03 22:25:57 · 2213 阅读 · 0 评论 -
大话数据结构十二:字符串的模式匹配(BM算法)
1. BM算法简介:KMP算法其实并不是效率最高的字符串匹配算法,实际应用的并不多,各种文本编辑器的“查找”功能大多采用的是BM算法(Boyer Moore)。BM算法效率更高,更容易理解。2. BM算法分析:(1) 假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE"。(2) 首先,"字符串"与"搜索原创 2013-10-27 21:27:44 · 4405 阅读 · 0 评论 -
大话数据结构十一:字符串的模式匹配(KMP算法)
1. KMP算法简介:kmp算法是一种改进的字符串匹配算法,相比朴素算法,KMP算法预先计算出了一个哈希表,用来指导在匹配过程中匹配失败后尝试下次匹配的起始位置,以此避免重复的读入和匹配过程。这个哈希表被称为"部分匹配值表"(Particial match table),这种设计是KMP算法最精妙之处。2. KMP算法分析:下面以阮一峰老师博客中的一原创 2013-10-27 09:14:52 · 4243 阅读 · 3 评论 -
大话数据结构十:字符串的模式匹配(BF算法)
1. BF算法简介:BF(Brute Force)算法是普通的模式匹配算法,又称为朴素匹配算法或蛮力算法,该算法最大缺点就是字符匹配失败指针就要回溯,所以性能很低。2. BF算法思想:BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次原创 2013-10-22 23:12:31 · 2721 阅读 · 0 评论 -
大话数据结构九:队列的链式存储结构(链队列)
1. 链队列的特点:链队列其实就是单链表,只不过它是先进先出的单链表,为了实现方便,程序中设置了队头(front),队尾(rear)两个指针。2. Java使用数组实现循环队列: //结点类,包含结点的数据和指向下一个节点的引用public class Node { private E data; // 数据域 private Node next; /原创 2013-10-13 13:30:43 · 2039 阅读 · 0 评论 -
大话数据结构八:队列的顺序存储结构(循环队列)
1. 什么是队列?队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。2. 队列的特点:队列是一种先进先出(First In First out)的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。3. 队列顺序存储有什么不足?使用数组实现的顺序存储,当做出队列操作时,所有的元素都需要向前移动一位,原创 2013-10-12 01:11:37 · 3984 阅读 · 0 评论 -
大话数据结构七:两栈共享存储空间(双向栈)
1. 为什么要使用双向栈?通过上一篇博客特殊的线性表(栈),可以知道栈的顺序存储性能相对较高,因为它不存在插入和删除时移动元素的问题,但是它有一点缺陷:要实现确定数组存储容量的大小,万一不够,需要扩充容量。这时双向栈就派上用场了,它可以最大限度的利用事先开辟的存储空间。2. 双向栈有什么特点?数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始原创 2013-10-10 01:06:48 · 7014 阅读 · 0 评论 -
大话数据结构六:特殊的线性表(栈)
1. 什么是栈?栈(stack)是限定仅在表尾进行插入和删除操作的线性表。2. 栈的特点:1.) 栈又称为后进先出(Last In First out)的线性表,栈元素具有线性关系,即前驱后继关系。2.) 一个栈,它的栈底是固定的,只允许在栈顶进行插入和删除操作。3. 栈的顺序存储结构(Java数组实现):// 栈的数组实现, 底层使用数组:publi原创 2013-10-09 00:08:42 · 2348 阅读 · 0 评论 -
大话数据结构五:线性表的链式存储结构(双向链表)
1. 双向链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域,那么在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱。2. 单链表和双向链表比较:单链表:总是要从头到尾找结点,只能正遍历,不能反遍历。双向链表: 可以从头找到尾,也可以从尾找到头,即正反遍历都可以,可以有效提高算法的时间性能,但由于每个结点需要记录两份指针,所以在空间占用上略多一点,这就是通原创 2013-10-07 22:04:28 · 1649 阅读 · 0 评论 -
大话数据结构四:线性表的链式存储结构(单向循环链表)
1. 单向循环链表:将单链表尾结点的指针端由空指针改为指向头结点,使整个单链表形成一个环,这种头尾相接的单链表称为单向循环链表。2. 单向循环链表和单链表实现的区别:1.)添加一个结点到单向循环链表末尾时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为null。2.)判断是否到达表尾时,单向循环链表可以判断该结点是否指向头结点,单链表只需要知道是否为null。3.j原创 2013-10-07 18:02:43 · 1838 阅读 · 0 评论 -
大话数据结构三:线性表的链式存储结构(静态链表)
1. 静态链表:用数组描述的链表叫静态链表,通常为方便数据插入,我们会把数组建的大一些。2. 数组元素(node):由两个数据域组成(data,cursor)。数据域data用来存放数据元素,也就是通常我们要处理的数据;而cursor相当于单链表中的指针,存放该元素的后继在数组中的下标3. java实现静态链表:// 静态链表class StaticLinkedList { p原创 2013-10-06 22:28:13 · 1563 阅读 · 0 评论 -
大话数据结构二:线性表的链式存储结构(单链表)
1. 线性表的链式存储结构:指的是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,这就意味着这些数据元素可以存在内存未被占用的任意位置。2. 结点:结点由存放数据元素的数据域和存放后继结点地址的指针域组成。1.)顺序存储结构中,每个数据元素只需要存数据元素的信息就可以了。2.)链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址原创 2013-10-06 13:10:39 · 2011 阅读 · 0 评论 -
大话数据结构一:线性表的顺序存储结构
1. 线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素。Java:使用数组实现线性表的顺序存储结构:// 顺序存储结构public class SequenceList { private static final int DEFAULT_SIZE = 10; // 默认初始化数组大小 private int size; // 当前数组大小 priv原创 2013-10-04 23:44:32 · 2261 阅读 · 2 评论 -
大话数据结构开篇:时间复杂度和空间复杂度
1. 算法的复杂度:算法的复杂度分为时间复杂度和空间复杂度,时间复杂度是指衡量算法执行时间的长短;空间复杂度是指衡量算法所需存储空间的大小。2. 时间复杂度: 2.1 时间频度:一个算法中语句执行次数称为时间频度,计为T(n)。2.2 时间复杂度:算法的时间复杂度描述的是T(n)的变化规律,计作:T(n) = O(f(n))。用大写O( )来体现算法复杂度的记法称为原创 2013-10-29 23:23:17 · 4496 阅读 · 5 评论