
数据结构
文章平均质量分 65
zdp072
Jim的IT专栏
展开
-
编程之美一 : 让CPU占有率曲线听你指挥
编程之美:让CPU占有率曲线听你指挥 java实现原创 2013-10-02 11:03:24 · 2205 阅读 · 3 评论 -
大话数据结构十一:字符串的模式匹配(KMP算法)
1. KMP算法简介:kmp算法是一种改进的字符串匹配算法,相比朴素算法,KMP算法预先计算出了一个哈希表,用来指导在匹配过程中匹配失败后尝试下次匹配的起始位置,以此避免重复的读入和匹配过程。这个哈希表被称为"部分匹配值表"(Particial match table),这种设计是KMP算法最精妙之处。2. KMP算法分析:下面以阮一峰老师博客中的一原创 2013-10-27 09:14:52 · 4243 阅读 · 3 评论 -
大话数据结构十三:二叉树的链式存储结构(二叉链表)
1. 二叉树的特点i、每个结点最多有两颗子树ii、左子树和右子树是有顺序的,次序不能任意颠倒iii、即使树中某结点只有一颗子树,也要区分它是左子树还是右子树2. 二叉树五种形态空二叉树,只有一个根结点,根结点只有左子树,根结点只有右子树,根结点既有左子树又有右子树3. 特殊的二叉树3.1原创 2013-11-03 22:25:57 · 2213 阅读 · 0 评论 -
大话数据结构十五:线索二叉树
1. 什么是线索二叉树?n个结点的二叉链表中含有(2n-(n-1)=n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。2. 为什么要加线索?① 很多空指针域没有存储任何事物,对内存资源是一种浪费。② 二叉链表中,我原创 2013-11-07 21:46:37 · 1779 阅读 · 0 评论 -
大话数据结构十六:哈夫曼树(最优二叉树)
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. 邻接表(无向图)的特点:有时候邻接矩阵并不是一个很好的选择:如上图: 边数相对顶点较少,这种结构无疑是存在对存储空间的极大浪费。邻接表: 数组和链表结合一起来存储。1.)顶点用一个一位数组存储。2.)每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以我们选择单链表来存储。2. 邻接表原创 2014-02-23 11:08:54 · 2174 阅读 · 0 评论 -
Java排序算法(六):归并排序
[算法思想]x[java实现]使用递归:public class MergeSort { public static void main(String[] args) { int[] arr = { 6, 5, 3, 1, 8, 7, 2, 4 }; System.out.println("排序之前:"); for (int i = 0; i < arr.lengt原创 2015-03-12 22:53:39 · 845 阅读 · 0 评论 -
Java排序算法(五):堆排序
[算法说明]堆排序是对简单选择排序的改进简单选择排序是从n个记录中找出一个最小的记录,需要比较n-1次。但是这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多。堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆原创 2015-03-12 22:17:53 · 17121 阅读 · 10 评论 -
Java查找算法(二): 顺序查找
[ 什么是顺序查找 ] 顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个或最后一个记录开始,逐个和给定的值比较,如相等则查找成功;如直到最后一个值仍不等时,则表中没有所查的记录,查找不成功。[ Java实现顺序查找 ] public class SequentialSearch { public static void main(原创 2015-03-08 19:12:11 · 2040 阅读 · 0 评论 -
Java查找算法(一): 二分法查找
一. 什么是二分查找二分查找又称为折半查找,该算法的思想是将数列按序排列,采用跳跃式方法进行查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。以此类推不断缩小搜索范围。二. 二分查找的条件二分查找的先决条件是查找的数列必须是有序的。三. 二分查找的优缺点优点:比较次数少,查找速度快,平均性能好;原创 2014-05-01 15:14:30 · 3493 阅读 · 0 评论 -
Java查找算法(三): 倒排索引
[ 什么是倒排索引 ] 索引:就好比是书的目录,通过目录我们可以快速的找到对应的章节。倒排索引源于实际应用中需要根据属性的值来查找记录,例如:通过文章中的单词找到对应的文章。[ 倒排索引例子 ] 假设有三篇文章,内容分别为:文章1: it is what it is文章2:what is it文章3:it is a ban原创 2015-03-09 21:26:16 · 4152 阅读 · 0 评论 -
Java查找算法(四): 二叉排序树
[ 为什么使用二叉排序树 ] 如果查找的数据集是有序线性表,并且是顺序存储的,查找可以用折半、插值等查找算法来实现,但是因为有序,在插入和删除操作上,需要耗费大量的时间。因为二叉排序树使用链接的方式存储,在执行插入或删除操作时不用移动元素,所以插入删除的时间性能比较好[ 二叉排序树的特点 ] 二叉排序树又称为二叉查找树,它或者是一颗空树,或者是具原创 2015-03-09 22:33:56 · 2580 阅读 · 0 评论 -
Java排序算法(一):冒泡排序
[基本思想]冒泡排序是一种交换排序,它的基本思想是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。[Java实现]public class BubbleSort { public static void main(String[] args) { int[] arr = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34原创 2015-03-11 23:19:08 · 1070 阅读 · 0 评论 -
Java查找算法(五): 散列表查找
[ 什么是散列表查找 ] 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)这个对应关系f()称为散列函数或哈希函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表,那么关键字对应的记录存储位置我们称为散列地址。[ 散列技术的优缺点 ] 使原创 2015-03-09 23:03:24 · 1226 阅读 · 0 评论 -
Java排序算法:入门篇
[内排序和外排序]根据在排序过程中待排序的记录是否全部被放置在内存中,排序分为:内排序和外排序。内排序是在排序整个过程中,待排序的所有记录全部被放置在内存中。外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。[排序的性能]排序算法的时间开销是衡量其好坏的最重要的标志,在内排序中,主要进行两种操作:比较和移动。高效率内排序算原创 2015-03-11 21:54:35 · 720 阅读 · 0 评论 -
Java排序算法(二):简单选择排序
[基本思想]在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数种再找出最小的与第二个位置的数交换,如此循环至倒数第二个数和最后一个数比较为止。算法关键:找到最小的那个数,并用变量记住它的下标。[java实现]public class SimpleSelectionSort { public static void main(String[] arg原创 2015-03-12 14:07:15 · 1046 阅读 · 0 评论 -
Java排序算法(四):希尔排序
[基本思想]将原本有大量记录数的记录进行分组,分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,再对全体记录进行一次直接插入排序。所谓的基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间,像{2, 1, 3, 6, 4, 7, 5, 8, 9}这样可以称为基本有序了。[java实现原创 2015-03-12 21:02:23 · 988 阅读 · 0 评论 -
Java排序算法(三):直接插入排序
[基本思想]关键:在前面已经排好序的序列中找到合适的插入位置步骤:1. 从第一个元素开始,该元素可以认为已经排好序。2. 取出下一个元素,在已经排好序的元素序列中从后往前扫描进行比较。3. 如果该元素(已排序) 大于新元素,则将该元素移到下一位置。4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。5. 将新元素插入到该位置后面。6. 重复步骤2~5原创 2015-03-12 15:30:09 · 4933 阅读 · 0 评论 -
大话数据结构九:队列的链式存储结构(链队列)
1. 链队列的特点:链队列其实就是单链表,只不过它是先进先出的单链表,为了实现方便,程序中设置了队头(front),队尾(rear)两个指针。2. Java使用数组实现循环队列: //结点类,包含结点的数据和指向下一个节点的引用public class Node { private E data; // 数据域 private Node next; /原创 2013-10-13 13:30:43 · 2039 阅读 · 0 评论 -
大话数据结构七:两栈共享存储空间(双向栈)
1. 为什么要使用双向栈?通过上一篇博客特殊的线性表(栈),可以知道栈的顺序存储性能相对较高,因为它不存在插入和删除时移动元素的问题,但是它有一点缺陷:要实现确定数组存储容量的大小,万一不够,需要扩充容量。这时双向栈就派上用场了,它可以最大限度的利用事先开辟的存储空间。2. 双向栈有什么特点?数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始原创 2013-10-10 01:06:48 · 7014 阅读 · 0 评论 -
编程之美二 : 中国象棋将帅问题
中国象棋将帅问题解法简单分析,算法简约而不简单。原创 2013-10-02 18:31:00 · 1824 阅读 · 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. 结点:结点由存放数据元素的数据域和存放后继结点地址的指针域组成。1.)顺序存储结构中,每个数据元素只需要存数据元素的信息就可以了。2.)链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址原创 2013-10-06 13:10:39 · 2011 阅读 · 0 评论 -
大话数据结构六:特殊的线性表(栈)
1. 什么是栈?栈(stack)是限定仅在表尾进行插入和删除操作的线性表。2. 栈的特点:1.) 栈又称为后进先出(Last In First out)的线性表,栈元素具有线性关系,即前驱后继关系。2.) 一个栈,它的栈底是固定的,只允许在栈顶进行插入和删除操作。3. 栈的顺序存储结构(Java数组实现):// 栈的数组实现, 底层使用数组:publi原创 2013-10-09 00:08:42 · 2348 阅读 · 0 评论 -
大话数据结构三:线性表的链式存储结构(静态链表)
1. 静态链表:用数组描述的链表叫静态链表,通常为方便数据插入,我们会把数组建的大一些。2. 数组元素(node):由两个数据域组成(data,cursor)。数据域data用来存放数据元素,也就是通常我们要处理的数据;而cursor相当于单链表中的指针,存放该元素的后继在数组中的下标3. java实现静态链表:// 静态链表class StaticLinkedList { p原创 2013-10-06 22:28:13 · 1563 阅读 · 0 评论 -
大话数据结构五:线性表的链式存储结构(双向链表)
1. 双向链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域,那么在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱。2. 单链表和双向链表比较:单链表:总是要从头到尾找结点,只能正遍历,不能反遍历。双向链表: 可以从头找到尾,也可以从尾找到头,即正反遍历都可以,可以有效提高算法的时间性能,但由于每个结点需要记录两份指针,所以在空间占用上略多一点,这就是通原创 2013-10-07 22:04:28 · 1649 阅读 · 0 评论 -
大话数据结构八:队列的顺序存储结构(循环队列)
1. 什么是队列?队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。2. 队列的特点:队列是一种先进先出(First In First out)的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。3. 队列顺序存储有什么不足?使用数组实现的顺序存储,当做出队列操作时,所有的元素都需要向前移动一位,原创 2013-10-12 01:11:37 · 3984 阅读 · 0 评论 -
大话数据结构十:字符串的模式匹配(BF算法)
1. BF算法简介:BF(Brute Force)算法是普通的模式匹配算法,又称为朴素匹配算法或蛮力算法,该算法最大缺点就是字符匹配失败指针就要回溯,所以性能很低。2. BF算法思想:BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次原创 2013-10-22 23:12:31 · 2721 阅读 · 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 评论 -
大话数据结构开篇:时间复杂度和空间复杂度
1. 算法的复杂度:算法的复杂度分为时间复杂度和空间复杂度,时间复杂度是指衡量算法执行时间的长短;空间复杂度是指衡量算法所需存储空间的大小。2. 时间复杂度: 2.1 时间频度:一个算法中语句执行次数称为时间频度,计为T(n)。2.2 时间复杂度:算法的时间复杂度描述的是T(n)的变化规律,计作:T(n) = O(f(n))。用大写O( )来体现算法复杂度的记法称为原创 2013-10-29 23:23:17 · 4496 阅读 · 5 评论 -
大话数据结构十四:二叉树的顺序存储结构(数组实现)
1. 顺序存储结构:二叉树的顺序存储结构就是用一维数组存储二叉树中的结点。2. 完全二叉树:完全二叉树由于其结构上的特点,通常采用顺序存储方式存储。一棵有n个结点的完全二叉树的所有结点从1到n编号,就得到结点的一个线性系列。如下图:完全二叉树除最下面一层外,各层都被结点充满了,每一层结点的个数恰好是上一层结点个数的2倍,因此通过一个结点的编号就可以推知它原创 2013-11-04 23:40:20 · 12018 阅读 · 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. 邻接矩阵(无向图)的特点:图的邻接矩阵存储方式是用两个数组来表示图:1.)一个一维数组存储存储图中顶点信息。2.)一个二维数组(称为邻接矩阵)存储图中边或弧的信息。上图中我们设置两个数组:顶点数组:vertex[4] = {V0,V1,V2,V3}边数组:arc[4][4] 为对称矩阵(0表示顶点间不存在边,1表示顶点间存在边)原创 2014-02-22 22:22:33 · 1767 阅读 · 0 评论 -
大话数据结构二十:图的存储结构之十字链表
1. 引言:对于有向图来说,邻接表是有缺陷的:邻接表:关心了出度问题,想了解入度就必须要遍历整个图才知道。逆邻接表:解决了入度,却不了解出度的情况。能否把邻接表和逆邻接表结合起来呢?答案就是:使用十字链表。2.十字链表存储结构:顶点表结点结构:firstin:表示入边表头指针,指向该顶点的入边表中第一个结点。f原创 2014-02-23 12:01:30 · 3769 阅读 · 1 评论 -
大话数据结构二十二:图的存储结构之边集数组
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. 单向循环链表和单链表实现的区别:1.)添加一个结点到单向循环链表末尾时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为null。2.)判断是否到达表尾时,单向循环链表可以判断该结点是否指向头结点,单链表只需要知道是否为null。3.j原创 2013-10-07 18:02:43 · 1838 阅读 · 0 评论 -
Java排序算法(七):快速排序
[算法思想]通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序的目的。[java实现]public class QuickSort { public static void main(String[] args) { int[] arr = { 6, 5, 3, 1, 8,原创 2015-03-12 23:21:14 · 1366 阅读 · 0 评论