数据结构与算法
文章平均质量分 60
linkinparkzlz
不要想太多,还是来一杯Java吧
展开
-
堆-及其基本操作
实现优先级队列的另一种结构::堆。堆是一种树,,由他实现的优先级队列的插入和删除的时间复杂度都是O(llooggN) 。注意:这里的堆是一种特殊的二叉树,不要和java以及C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分。堆是有如下特点的二叉树: —-它是完全二叉树。也就是说,除了最后一层节点不是满的,其他的每一层从左到右都完全是满的。 —–它常常用一个数原创 2016-11-29 09:19:48 · 482 阅读 · 0 评论 -
队列-循环队列及其实现
概念:队列也是一种特殊的线性表,它的特殊性在于队列置允许在表尾插入数据元素,在表头删除数据元素,所以队列也是一种操作受限的线性表,它具有先进先出的特性。允许进行插入的一端称为队尾(rear),允许进行删除的一端称为队首(front),队列的插入操作通常称为入队操作,队列的删除操作通常称为出队操作——————————————-队列的抽象数据类型描述: 队列的基本操作与栈类似,主要有以下6种操作:原创 2016-11-22 09:43:33 · 744 阅读 · 0 评论 -
队列-链式队列
队列的链式存储结构也用不带头节点的单链表来实现。为了便于实现入队盒出队操作,需要引用两个指针front和rear来分别指向队尾元素和队首元素的结点。链式队列也引用了前面所讨论的Nod类,下面实现接口Queue的链式队列的java语言描述。package com.queueTest;import com.test1.Node;public class LinkQueue implements Q原创 2016-11-22 15:16:39 · 281 阅读 · 0 评论 -
字符串的基本操作及其实现
字符串的抽象数据类型描述:–字符串的置空操作 clear() –字符串判断空操作 isEmpty() —求字符串长度操作 length() —取字符操作 charAt(index) 读取并返回字符串中第index个字符值 —截取子串操作 substring(begin,end) 注意:前包含,后不包含。也就是[begin,end-1] —插入操作 insert(offs原创 2016-11-22 17:56:10 · 1326 阅读 · 0 评论 -
排序1-冒泡排序
排序的分类: 内部排序与外部排序。按照排序过程中所涉及的存储器的不同可分为内部排序和外部排序。内部排序是指待排序序列完全存放在内存中进行的排序过程,这种排序方法适合于数据量不太大的数据元素的排序。外部排序是指待排序的数据元素非常多,以至于它们必须存储在外部存储器上,这种排序需要访问外存储器,这样的排序称为外排序。 冒泡排序: 实例:如果要对一队棒球队员进行身高的排序,应该怎样做呢?冒泡排序所采原创 2016-11-22 21:38:53 · 301 阅读 · 0 评论 -
排序-选择排序
选择排序:进行选择排序就是把所有的队员扫一遍,从中挑出(或者选择)最矮的一个队员。最矮的这个队员和站在队列最左端的队员交换位置,即站到0号位置。现在最左端的队员是有序的了,不需要再交换位置了。 再次扫描队列时,就从1号位置开始,还是寻找最矮的,然后和1号位置的队员交换,这个过程一直持续到所有的队员都排定。public class SelectionSort { public stati原创 2016-11-22 23:49:31 · 260 阅读 · 0 评论 -
排序-插入排序
插入排序: 假设第一个元素是有序的(和图中部分有序类似),从第二个元素开始,将标记的元素(temp)插入到前面排 好序的队员中,要做到这一点,需要将部分已经排好序的队员右移以腾出空间。为了移动所需的时间,就先让被标记的元素出列(temp)(在程序中,就是用一个临时变量temp表示)public class InsertionSortTest{ public static void原创 2016-11-23 10:03:10 · 309 阅读 · 0 评论 -
排序--归并排序
归并排序 O(N*logN): 归并排序的思想是把一个数组分成两半排序每一半,然后用merge()方法把数组的两半归并成一个有序的数组;把每一半都分成两个四分之一,对每个四分之一部分排序,然后把他们归并成一个有序的一半;类似的,把每一对八分之一归并成一个有序的四分之一部分,每一对十六分之一部分归并成一个有序的八分之一部分,依次类推,反复的分隔数组,直到得到的子数组只含有一个数据项,这就是基值条件原创 2016-11-24 11:36:47 · 275 阅读 · 0 评论 -
排序-希尔排序
希尔排序: 当对0,4,8号数据项完成排序之后,算法向右移动一步,对1,5,9数据项进行排序。这个过程持续进行,直到所有的数据项都已经完成了4-增量排序,也就是说所有间隔为4的数据项之间都已经排列有序在完成以4为增量的希尔排序后,所有元素离他在最终有序序列中的位置都相差不到两个单元。这就是数组基本有序的含义,也正是希尔排序的奥秘所在。这种交错的内部有序的数据项集合,把完成排序所需的工作量降到了最小原创 2016-11-24 11:39:19 · 299 阅读 · 0 评论 -
排序-快速排序
快速排序:快速排序是最流行的排序算法,在大多数情况下,快速排序都是最快的,执行时间为O(N*logN)级。 快速排序算法本质上通过把一个数组划分为两个子数组,然后递归调用自身为每一个子数组进行快速排序实现的。 快速排序有三个基本的步骤: 1.把数组或者子数组分成左边(较小的关键字)的一组和右边(较大的关键字)的一组 2.调用自身对左边进行排序 3.再次调用自身对右边的一组进行排序。经过一次原创 2016-11-24 11:42:46 · 301 阅读 · 0 评论 -
二叉树 及其基本操作
为什么要使用树? 因为树既能像链表那样快速的插入和删除,也能像有序数组那样快速查找。 下面是一棵二叉搜索树(二叉查找树BST Binary Search Tree). 二叉查找树的特征可以这样描述:一个节点的左子节点的关键字值小于这个节点,右子节点的关键字值大于或者等于这个父节点。非平衡树,也就是说,它们大部分节点在根的一边或者另一边。 用java代码表示树: 和其他数据结构一样,有很多方原创 2016-11-24 16:16:16 · 462 阅读 · 0 评论 -
图示创建哈夫曼树的过程
字符编码: 计算机里每个字符在没有压缩的文本文件中由一个直接(如常见的ASCII码)或两个直接(如比较新的Unicode,它可以在各种语言中通用)表示,在这些方案中,每个字符需要相同的位数。下图列出里用ASCII码表示的一些字符,可以看到每个字符都用8个位来表示 有很多压缩数据的方法,对文本来说,最常用的方法是减少表示最常用字符的位数量,如英语中,E是最常用字母,所以用尽可能少的位为E编码是很合原创 2016-11-24 19:46:06 · 3464 阅读 · 2 评论 -
哈希表-线性探测
哈希表是一种数据结构,它可以提供快速的插入和查找操作。不论哈希表有多少数据,插入和删除(有时包括删除)只需要接近常量的时间,即O(1)的时间级。 哈希表运算非常快,在计算机程序中,如果需要在一秒钟内查找上千条记录,通常使用哈希表,哈希表的速度明显是树快。 哈希表也有一些缺点:它是基于数组的,数组创建后难于扩展。某些哈希表基本被填满时,性能下降非常严重,所以程序员必须要清楚原创 2016-11-28 11:41:27 · 929 阅读 · 0 评论 -
栈的应用-大数加法问题
问题:大数的加法问题,编程实现两个大数的加法运算。 整数是有最大上限的。所谓大数就是指超过整数最大上限的数,例如145266787787886626256166和733827332623637662772891就是两个大数,它们无法使用整形变量来保存,为了解决两个大数的求和问题,可以把两个加数看成是数字字符串,将这些数的相应数字存储着两个堆栈中,并从两个栈中弹出对应位的数字依次执行加法即可得到结果原创 2016-11-22 09:38:29 · 647 阅读 · 0 评论 -
栈的应用:分隔符匹配问题-编写判断java语句中分隔符是否匹配的程序
分隔符匹配问题:编写判断java语句中分隔符是否匹配的程序。一个分隔符和它匹配的分隔符可被其他的分隔符隔开,即分隔符允许嵌套,因此一个分隔符只有在其前面的所有右分隔符都被匹配后才可以进行匹配。 例如,条件语句: if ( i != (n[8] +1 ))中,第一个左圆括号必须与最后一个右圆括号相匹配,但是这只能在第二个左圆括号与倒数第二个右圆括号相匹配后才能进行;而第二个括号的匹配也只有原创 2016-11-22 09:35:34 · 967 阅读 · 0 评论 -
栈-链栈的基本操作及实现
链栈的存储结构可用单链表来实现,假设指针指向单链表的首结点,由于在栈中入栈河出栈操作只能在栈顶进行,不存在在单链表任意位置进行插入和删除操作的情况,所以在栈中不需要设置头结点直接将栈顶元素放在单链表的首部成为首结点链栈类的描述: 链栈中的结点类引用了链表中所讨论的Node类。下面是实现Stack的java语言描述 package com.stackTest;import com.test1.No原创 2016-11-22 09:33:27 · 3288 阅读 · 0 评论 -
深度优先搜索--以及图的基本操作
临接:如果两个顶点被同一条边连接,就称这个顶点是临接的。 路径:路径是边的序列 连通图:如果至少有一条路径可以连接起所有的顶点,那么称这个图是连通的。 邻接矩阵:邻接矩阵是一个二维数组,数组项表示两点之间是否存在遍。如果有N个顶点,邻接矩阵就是N*N的数组。邻接表: 邻接表是一个链表数组(或者链表的链表)。每个单独的链表表示邻有哪些顶点与当前顶点邻接。 在图中添加顶点和边: 为了向图原创 2016-11-29 17:34:17 · 1826 阅读 · 0 评论 -
最小生成树及其基本实现
最小生成树(MST Minimum Spanning Tree):用最少的边连接了所有的顶点。 最小生成树边的数量总比顶点V的数量小1. 即 E = V -1;创建最小生成树的算法与搜索算法几乎是相同的。它同样可以基于广度优先搜索或者深度优先搜索,本例使用深度优先搜索。 在执行深度优先搜索的过程中,记录走过的边,就可以创建一棵最小生成树。最下生成树算法与前面的深度优先搜索之间唯一的转载 2016-11-29 19:42:42 · 341 阅读 · 0 评论 -
有向图与拓扑排序
有向图的拓扑排序:拓扑排序是可以用图模拟的另一种操作。它可以用于表示一种情况,即某些项目或事件必须按照特定的顺序排列或发生。 如:课程的优先关系 有向图: 图可以表示这类关系,然而,图需要有一种前面没有涉及的属性:边有方向。这时,图叫做有向图。在有向图中,只能沿着边指定的方向移动。 在程序中,有向图和无向图的区别是有向图的边在邻接矩阵中只有一项。对于有向图,增加边的方法只需要一条语句: p原创 2016-11-29 21:39:42 · 1101 阅读 · 0 评论 -
骑士旅行问题-java解答
骑士旅行是一个古老而著名的象棋谜题。题目是在一个空的棋盘上移动一个 骑士,从一个方块到另一个,直到踏遍了棋盘的所有的方块。写一个程序, 用深度优先搜索解决这个问题。最好使棋盘的大小可变,这样可以在较小的 棋盘上解决这个问题。8*8 的棋盘中,用个人电脑大概需要几年的时间解决 这个问题。5*5 的棋盘只需要几分钟而已。 骑士只能根据象棋的规则进行移动,要么横向跳动一格纵向跳动两格 ,要么纵向跳动一原创 2016-12-01 11:02:21 · 1423 阅读 · 0 评论 -
带权图的最小生成树 及其java实现
如图所示:选择哪些边架设电缆,能使得安装有线电视系统的造价最低呢? 方法是利用最小生成树,它将有5条边(比城市数量少1),连接6个城市,并具有建立连接所需的最小代价。设计算法: 算法要点:下面是用图的术语重申一下算法。 从一个顶点开始,把它放入树的集合。然后重复做下面的事情: 1.找到从最新的顶点到其他顶点的所有边,这些顶点不能在树的集合中。把这些边放入优先级队列。 2.找出权值最小的边,原创 2016-12-01 11:08:14 · 1345 阅读 · 0 评论 -
最短路径问题—Dijkstra算法及其实现
shortPath数组和DistantanceParent类。 最短路径算法的关键数据结构是一个数组,它保持了从原点到其他顶点(终点的最短路径)。在算法的执行过程中这个距离是变化的,直到最后,它存储了从原点开始真正的最短距离,在程序中,这个数组叫做shortPath[]. 也就是最短路径不仅应该记录从原点到终点的最短路径,还应该记录走过的路径。幸运的是,不必要明确记录整个路径,只需要记录终点的父原创 2016-12-01 16:12:36 · 1696 阅读 · 0 评论 -
算法分析
1.算法分析: (1)算法的时间复杂度分析: 算法时间复杂度的高低直接反映算法执行时间的长短,而算法的执行时间需要通过依据编制该算法的程序在计算机上执行所消耗的时间来度量,影响一个程序的执行时间主要因素有以下几个方面: —算法本身所使用的策略 —问题规模即处理问题时所处理的数据元素的个数。 —程序设计所采用的语言工具 —编译程序所产生的机器代码质量。 —计算机执行指令的硬件速度 —程原创 2016-11-21 11:27:28 · 383 阅读 · 0 评论 -
线性表1-顺序表
概念:线性表是由n个元素所构成的有限序列。 对于同一个线性表,其每一个数据元素的值虽然不同,但必须具有相同的数据类型;同时,数据元素之间具有一种线性的“一对一”的逻辑关系,即: (1)第一个数据元素没有前驱,这个数据元素被称为开始节点 (2)最后一个数据元素没有后继,这个数据元素被称为终端节点。 (3)除了第一个元素与最后一个元素以外,其他元素有且仅有一个前驱和一个后继。线性表的抽象数据类型原创 2016-11-21 11:30:51 · 607 阅读 · 0 评论 -
线性表2-单向链表
链表的链式存储及其实现: 顺式存储的局限性: (1)若要为线性表扩充存储空间中,则需要创建一个地址连续的更大空间,并把原有的数据元素都复制到新的存储空间之中。 (2)因为顺式存储要求在逻辑上相邻的元素,在物理存储位置上也是相邻的,这就使得增删的数据元素会引起约平均一半的数据元素的移动。对于需要频繁执行插入和删除操作的线性表,通常采用链式存储结构。链式存储结构不要求逻辑上相邻的元素在物理上也相邻原创 2016-11-21 11:42:43 · 418 阅读 · 0 评论 -
线性表-双向链表
双向链表: 在单链表中的结点仅仅包含指向其后继结点的指针,所以要查找一个指定结点的后继结点,只要顺着它的后继指针即可一次找到,其时间复杂度是O(1) ,但若要查找一个指定结点的前驱结点,则要从单链表的表头开始顺着链一次查找,其时间复杂度是O(n),这是快速进行链表操作的一大障碍。为克服单向链表这一单向性缺点,可对单链表进行重新定义,使其结点具有两个指针域,一个指针指向前驱结点,另一个指针指向后继原创 2016-11-21 15:25:09 · 287 阅读 · 0 评论 -
线性表应用举例
编程实现学生成绩管理系统,次系统具有查询,修改,删除,增加和求全班各门课平均分的功能。要求采用顺序存储结构。 package com.test1;import java.awt.DisplayMode; import java.util.Scanner;public class StudentManageSystem extends SqList {//按顺序构造顺序表,其中参数maxS原创 2016-11-21 16:35:52 · 1590 阅读 · 0 评论 -
栈--顺序栈
栈的概念: 栈是一种特殊的线性表,栈中的数据元素以及数据元素之间的逻辑关系和线性表相同,两者的区别在于:线性表的插入和删除操作可以在表的任意位置进行,而栈的插入和删除操作只允许在表的任意位置进行,而栈的插入和删除操作只允许在表的尾端进行。其中,栈中允许进行插入和删除操作的一端称为栈顶(top),另一端称为栈底(buttom)。通常,我们将栈的插入操作称为入栈(push),而将删除操作称为出栈(po原创 2016-11-22 09:27:49 · 412 阅读 · 0 评论 -
哈希表-再哈希法
再哈希法: 为了消除原始聚集和二次聚集,可以使用另外一个方法:再哈希法,二次聚集产生的原因是,二次探测的算法产生的探测序列步长总是固定的:1,4,9,16… x现在需要的一种方法是产生一种依赖关键字的探测序列,而不是每个关键字都一样。那么,不同的关键字即使映射到相同的数组下标,也可以使用不同的探测序列。 方法是把关键字用不同的哈希函数原创 2016-11-28 11:44:02 · 6388 阅读 · 0 评论