
数据结构与算法分析
文章平均质量分 88
hoxis
这个作者很懒,什么都没留下…
展开
-
JVM性能优化 Part III:垃圾回收
JVM性能优化 Part III:垃圾回收 Java平台的垃圾回收机制大大提高的开发人员的生产力,但实现糟糕的垃圾回收器却会大大消耗应用程序的资源。本文作为JVM性能优化系列的第3 篇,Eva Andeasson将为Java初学者介绍Java平台的内存模型和GC机制。她将解释为什么碎片化(不是GC)是Java应用程序出现性能问题的主要原 因,以及为什么当前主要通过分代垃圾回原创 2014-05-06 14:20:32 · 721 阅读 · 0 评论 -
排序算法总结之希尔排序
希尔排序(Shell Sort)是插入排序的一种,其实质就是分组插入排序,该方法又称缩小增量排序,因D.L.Shell于1959年提出而得名。它是对直接插入排序的一种改进,通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使得数据项大跨度的移动。 基本思想 先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后原创 2014-09-07 16:12:12 · 1361 阅读 · 0 评论 -
Java解析字符串表达式--逆波兰表达式的计算
问题来由: 读入一个字符串形式的四则运算表达式,输出对应的计算结果。如读入的是“6 * ( 5 + ( 2 + 3) * 8 + 3)”,那么解析后的输出结果应为288。 思路: 一般的计算过程是这样的,首先计算优先级最高的小括号里面的内容,即“( 5 + ( 2 + 3) * 8 + 3)”, 将“2 + 3”的计算结果并存为A,接着用计算“A*8”,并存为B 计算“5+原创 2014-09-10 16:17:58 · 15434 阅读 · 0 评论 -
排序算法总结之冒泡排序
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它的基本思想就是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 例如:初始序列3,6,4,2,11,10,5;从头开始,两两相比原创 2014-08-21 13:24:34 · 2227 阅读 · 0 评论 -
排序算法总结之直接选择排序
概念 每一趟在最后的n-i+1(i=1,2,...,n-1)中取最小的记录作为有序表的第i个记录 优点:算法简单,容易实现 缺点:每次只能确定一个元素 Java实现: package com.liuhao.sort; import java.util.Arrays; //定义一个数据包装类 class DataWrap implements Comp原创 2014-08-19 11:55:44 · 2551 阅读 · 1 评论 -
排序算法总结之堆排序
堆的概念。 n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质): (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ ) 满足(1)的称为小根堆,满足(2)的称为大根堆。 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点原创 2014-08-20 15:58:45 · 1560 阅读 · 0 评论 -
Java解析字符串表达式--逆波兰表达式的生成
上回讲了如何计算后缀表达式,其实真正的难点在于如何将一个正常的字符串表达式(中缀表达式)变成一个后缀表达式。如将6 * ( 5 + ( 2 + 3) * 8 + 3)变为6 5 2 3 + 8 * + 3 + * 逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:原创 2014-09-11 14:19:50 · 5378 阅读 · 2 评论 -
排序算法总结之折半插入排序
基本思想 折半插入排序是对直接插入排序的简单改进,对于直接插入排序而言,当第i-1趟需要将第i个元素插入前面的0~i-1个元素序列中时,总是需要从i-1个元素开始,逐个比较每个元素,直到找到它的位置。这显然没有利用前面0~i-1个元素已经有序这个特点,而折半插入排序则改进了这一点。 对于折半插入排序而言,当需要插入第i个元素时,它不会逐个进行比较每个元素,而是: (1)计算0~i-1索引的中原创 2014-08-29 18:27:29 · 6866 阅读 · 0 评论 -
哈夫曼树(最优二叉树)及其Java实现
一、定义 一些定义: 节点之间的路径长度:在树中从一个结点到另一个结点所经历的分支,构成了这两个结点间的路径上的经过的分支数称为它的路径长度 树的路径长度:从树的根节点到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。 结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。 结点的带权路径长度:结点到树根之间的路径长度与该结点原创 2014-08-18 10:50:07 · 20225 阅读 · 6 评论 -
排序二叉树及其Java实现
定义 排序二叉树的定义也是递归定义的,需要满足: (1)若它的左子树不为空,则左子树上所有节点的值要均小于根节点的值; (2)若它的右子树不为空,则右子树上所有节点的值要均大于根节点的值; (3)左、右子树也分别是排序二叉树 如下图,对于排序二叉树,若按中序遍历就可以得到由小到大的有序序列。 创建 创建排序二叉树的步骤就是不断像排序二叉树中添加新节点(p)的过程: (1)以根节原创 2014-08-18 16:30:45 · 7386 阅读 · 1 评论 -
排序算法总结之直接插入排序
基本思想 插入排序(Insertion Sort)基本思想是:依次将待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。具体来说,对于一个有n个数据的序列,排序需要进行n-1趟插入操作。 形象来看,每一趟插入操作就像大家玩扑克牌的摸牌阶段,我们使用左手拿着已经摸到并排好大小的牌,右手从牌堆里边摸牌,每摸一张牌就将其插入到左手理顺的牌中,插入后保持其大原创 2014-08-29 14:33:26 · 1433 阅读 · 0 评论 -
排序算法总结之快速排序
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。原创 2014-08-27 16:27:33 · 2217 阅读 · 0 评论 -
排序算法-直接插入排序
直接插入排序思想:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 算法复杂度:如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况...2014-03-20 19:20:57 · 325 阅读 · 0 评论 -
线性表的Java实现--顺序存储
线性表的Java实现--顺序存储 线性表(Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列。 其中:数据元素的个数n定义为表的长度 = "list".length() ("list".length() = 0(表里没有一个元素)时称为空表)将非空的线性表(n>=0)记作:(a[0],a[1],a[2...原创 2014-04-13 20:57:33 · 338 阅读 · 0 评论 -
线性表的Java实现--链式存储(单向链表)
线性表的Java实现--链式存储(单向链表) 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素。由于不需要按顺序存储,链表在插入、删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢。 使用链式存储可以克服顺序线性表需要预先知道数据大小的...2014-04-13 21:06:20 · 251 阅读 · 0 评论 -
线性表的Java实现--链式存储(双向链表)
线性表的Java实现--链式存储(双向链表)有了单向链表的基础,双向链表的实现就容易多了。 双向链表的一般情况: 增加节点: 删除节点: 双向链表的Java实现:package com.liuhao.algorithm;public class DuLinkList<T> { /** * 内部类:链表中的一个节点 * ...2014-04-13 21:33:01 · 177 阅读 · 0 评论 -
线性表的实现分析
线性表的实现分析 顺序存储和链式存储的对比: 顺序表链表空间性能顺序表的存储空间是静态分布的,需要一个固定长度的数组,因此总有部分数组元素被浪费。链表的存储空间是动态分布的,因此不会产生空间的浪费。但是需要额外的空间来为每个节点保存引用。时间性能顺序表中元素的逻辑顺序和物理存储顺序是保持一致的,因此支持随机读取,在查找、读取方面性能较好。链表...原创 2014-04-14 08:47:11 · 302 阅读 · 0 评论 -
栈的Java实现--顺序栈
栈的Java实现--顺序栈栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈...2014-04-14 12:51:52 · 446 阅读 · 1 评论 -
排序算法总结之归并排序
基本思想 设归并排序的当前区间是R[low..high],分治法的三个步骤是: ①分解:将当前区间一分为二,即求分裂点 ②求解:递归地对两个子区间R[low..mid]和R[mid+1..high]进行归并排序; ③组合:将已排序的两个子区间R[low..mid]和R[mid+1..high]归并为一个有序的区间R[low..high]。原创 2014-09-07 19:39:38 · 1659 阅读 · 0 评论 -
排序算法总结之排序概述
所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下: 输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn。 输出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。 1.被排序对象--文件 被排序的对象--文件由一组记录组成。 记录则由若干个数据项(或域)组成原创 2014-08-19 10:28:58 · 1095 阅读 · 0 评论 -
栈的Java实现--顺序栈
栈的Java实现--顺序栈栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元原创 2014-05-06 14:21:23 · 1300 阅读 · 0 评论 -
线性表的Java实现--顺序存储
线性表的Java实现--顺序存储 线性表(Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列。 其中:数据元素的个数n定义为表的长度 = "list".length() ("list".length() = 0(表里没有一个元素)时称为空表)将非空的线性表(n>=0)记作:(a[0],a[1],a[2],…,a原创 2014-05-06 14:21:03 · 2766 阅读 · 0 评论 -
线性表的Java实现--链式存储(单向链表)
线性表的Java实现--链式存储(单向链表) 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素。由于不需要按顺序存储,链表在插入、删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢。 使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点原创 2014-05-06 14:21:08 · 3224 阅读 · 0 评论 -
线性表的Java实现--链式存储(双向链表)
线性表的Java实现--链式存储(双向链表)有了单向链表的基础,双向链表的实现就容易多了。 双向链表的一般情况: 增加节点: 删除节点: 双向链表的Java实现:package com.liuhao.algorithm;public class DuLinkList { /** * 内部类:链表中的一个节点 * * @auth原创 2014-05-06 14:21:13 · 1316 阅读 · 1 评论 -
线性表的实现分析
线性表的实现分析 顺序存储和链式存储的对比: 顺序表链表空间性能顺序表的存储空间是静态分布的,需要一个固定长度的数组,因此总有部分数组元素被浪费。链表的存储空间是动态分布的,因此不会产生空间的浪费。但是需要额外的空间来为每个节点保存引用。时间性能顺序表中元素的逻辑顺序和物理存储顺序是保持一致的,因此支持随机读取,在查找、读取方面性能较好。链表采用原创 2014-05-06 14:21:18 · 1146 阅读 · 0 评论 -
排序算法-直接插入排序
直接插入排序思想:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 算法复杂度:如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最原创 2014-05-06 14:18:59 · 770 阅读 · 0 评论 -
树的父节点表示法及其Java实现
树中除了根节点之外,每个节点都有且仅有一个父节点,为了记录树中节点与节点之间的父子关系,可以为每个节点增加一个parent域,用以记录该节点的父节点。 对于下图中的树: 可以用下表来存储: 由此可见,只要用一个节点数组来保存树中的每个节点,并让每个节点记录其父节点在数组中的索引即可。 Java实现代码原创 2014-06-07 18:06:18 · 6057 阅读 · 0 评论 -
树的子节点链表示法及其Java实现
父节点表示法的思想是让每个节点持有它的父节点的索引,这种方式是从子节点出发;反过来可以让父节点持有它的所有子节点。这种方式下,由于每个父节点需要记住多个子节点,因此必须采用“子节点链”表示法。原创 2014-06-07 21:01:37 · 3772 阅读 · 0 评论 -
树的定义和基本概念
数的定义和基本概念原创 2014-06-07 14:45:47 · 2428 阅读 · 0 评论 -
二叉树的基本概念
1、二叉树的递归定义 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。二叉树指的是每个节点最多只能有两个子树(左子树和右子树)的有序树,子树有左右之分,次序不能颠倒。 二叉树不是树的特例 (1)二叉树与无序树不同 二叉树中,每个结点最多只能有两棵子树,原创 2014-07-25 10:53:55 · 1476 阅读 · 0 评论 -
二叉树的顺序存储及其Java实现
顺序存储充分利用满二叉树的特性,即每层的节点数分别为1、2、4、8。。。2i+1,一个深度为i的二叉树最多只能包含2i-1个节点,因此只要定义一个长度为2i-1的数组即可存储这颗二叉树。 对于普通的不是满二叉树的,那些空出来的节点对应的数组元素留空即可,因此顺序存储会造成一定的空间浪费。如下图。 显然,如果是完全二叉树,那么就不会有空间浪费的情况;若是只有右子树,那么会造成相当大原创 2014-07-28 09:30:04 · 4166 阅读 · 1 评论 -
二叉树的二叉链表存储及其Java实现
二叉链表存储的思想是让每个节点都记住它的左、右两个子节点,为每个节点增加left、right两个指针,分别引用该节点的左、右两个子节点,如图所示: 其中,每个节点大致有如下定义: 对于这种二叉链表存储的二叉树,如果程序需要,为指定节点添加子节点也非常容易,让父节点的left、right引用指向新节点即可。 Java实现代码: 测试代码: 对于这种二叉链表的二叉原创 2014-07-28 16:14:32 · 4343 阅读 · 3 评论 -
二叉树的遍历及其Java实现
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问,对二叉树的遍历就是将非线性结构的二叉树中的节点排列在一个线性序列上的过程。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。 如果采用顺序结构来保存二叉树,遍历二叉树非常容易,直接遍历底层数组即可。如果采用链表来保存,则有以下两类遍历方式:原创 2014-07-29 11:35:25 · 2635 阅读 · 0 评论 -
二叉树的三叉链表存储及其Java实现
三叉链表存储的思想是让每个节点持有三个引用parent、left、right,分别指向其父节点、左子节点和右子节点。如下图所示: 因此,三叉链表存储的节点大致如: class Node{ T data; Node parent; Node left; Node right; } Ja原创 2014-07-29 09:14:25 · 3217 阅读 · 0 评论 -
Collections中sort()方法源代码的简单分析
Collections的sort方法代码: public static void sort(List list, Comparator c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j i.next原创 2014-07-29 17:56:17 · 11537 阅读 · 0 评论 -
java.util.ComparableTimSort中的sort()方法简单分析
TimSort算法是一种起源于归并排序和插入排序的混合排序算法,设计初衷是为了在真实世界中的各种数据中可以有较好的性能。该算法最初是由Tim Peters于2002年在Python语言中提出的。 TimSort 是一个归并排序做了大量优化的版本。对归并排序排在已经反向排好序的输入时表现O(n2)的特点做了特别优化。对已经正向排好序的输入减少回溯。对两种情况混合(一会升序,一会降序)的输入处理比较原创 2014-07-30 13:42:47 · 16187 阅读 · 4 评论 -
栈的Java实现--链栈
栈的Java实现--链栈链栈,顾名思义,就是以链表的形式实现的栈的相关操作,其实是功能弱化了的链表,如果已经阅读过链表的实现代码,那么链栈的实现显得更为容易。 链栈的基本结构:链栈的入栈操作: 让top引用指向新的节点,新节点的next指向原来的top记录栈内元素个数的size+1链栈的出栈操作: top引用指向原栈顶元素的下一个元素(top.next)...原创 2014-04-14 16:30:37 · 658 阅读 · 0 评论