随笔分类 - 数据结构
1
摘要:图也是一种数据结构,用来表示多对多的关系,两个节点(顶点)之间的连接称之为边 从一个顶点到另一个顶点的所经过的边连起来称之为路径 图的两种表现方式:二维数组(邻接矩阵),链表(邻接表) 图的深度优先遍历(DFS): 访问初始顶点找到最近的一个顶点,再以这个顶点为初始顶点继续找最近的顶点,以递归的方式
阅读全文
摘要:当二叉树的数据量非常大的时候他的速度就会有一定的影响这时候就引进了多叉树 多叉树通过对树的高度进行缩减来达到优化的目的 2-3树是最简单的B-树,特点如下 所有叶子节点都在同一层 有两个子节点的叫二节点,此节点要么有2个子节点要么没有 有三个子节点的叫三节点,此节点要么有3个子节点要么没有 2-3树
阅读全文
摘要:平衡二叉树是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树 平衡二叉树解决了二叉排序树的查询效率问题(连续递增数据创建二叉排序树时),平衡二叉树的实现方法有红黑树,AVL树,替罪羊树等 平衡二叉树的难点在于左右旋转,这里用 new 代表新节点 old 代表旧
阅读全文
摘要:二叉排序树对于任何一个非叶子节点都要求比左子节点大,比右子节点下,相同可放入左子节点或右子节点 对于删除情况,直接删除叶子节点和删除只有一颗子树的情况都比较好处理,对于第3种情况删除2棵子树详细记录一下 找到要删除的节点的父节点和他右子树找到最小值,最小值记录在临时变量里,删除最小节点,替换 pub
阅读全文
摘要:赫夫曼编码用于数据文件的压缩,压缩率在20%~90%之间,称之为最佳编码 将原始数据转换为ASCII编码后再转二进制属于定长编码 同样数据使用变长编码,按照各个字符出现次数进行编码,出现次数越多则编码越小(字符的编码都不能是其他字符编码的前缀,这样的编码叫做前缀编码),从而实现数据的压缩 步骤:和创
阅读全文
摘要:给定N个权值作为N个叶子节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为赫夫曼树 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近 节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘机 树的带权路径长度(WPL):所有叶子节点的带权路径长
阅读全文
摘要:线索化二叉树的特点是:每一个节点都有前驱和后继节点(第一个和最后一个除外)所以查找某一节点会很容易 缺点:也很明显就是在插入新节点和删除时过于麻烦,实际应用需自己取舍 public class ThreadedBinaryTreeDemo { public static void main(Stri
阅读全文
摘要:特点: 1.只考虑完全二叉树 2.第n个的左节点为2*n+1 3.第n个的右节点为2*n+2 4.第n个的父节点为(n-1)/2 n为第几个元素 public class ArrBinaryTreeDemo { public static void main(String[] args) { int
阅读全文
摘要:前序遍历:根节点,左子树,右子树 中序遍历:左子树,根节点,右子树 后序遍历:左子树,右子树,根节点 二叉树的遍历规则:在前中后序遍历中先左子树,后右子树的规则不变,变的只有根节点的顺序 public class BinaryTreeDemo { public static void main(St
阅读全文
摘要:哈希表(散列表)根据关键码值(Key)直接访问,加快查找的速度。 简单来说就是把数据分组,在进行查找的时候直接在对应的组里进行查找,以此减少查找数据时对不必要查找数据时所浪费的时间 package hashtab; import java.util.Scanner; public class Has
阅读全文
摘要:递归是指在定义自身的同时又出现了对自身的引用。如果一个算法直接或间接地调用自己,则称这个算法是一个递归算法。任何一个有意义的递归算法总是由两部分组成:递归调用与递归终止条件。 生活中比较形象例子:当你拿起一个镜子正对着另一个镜子照,俄罗斯套娃等 优点:代码简单 缺点:是效率比较低,当一个问题的体量太
阅读全文
摘要:import java.util.ArrayList; import java.util.List; import java.util.Stack; public class PolandNotation { public static void main(String[] args) { //中缀
阅读全文
摘要:public class Calculator { public static void main(String[] args) { String expressoin = "7*2*2-5+1-5+3-4"; ArrayStack2 numStack = new ArrayStack2(10);
阅读全文
摘要:关于栈的解释百科上已经说得很明白了,这里直接引用一下: 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除
阅读全文
摘要:单向环形链表(Josepfu) 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始顺时针自1报数,报到m时停止报数,报m的那个人出列,他的密码作为新
阅读全文
摘要:双向链表中不同于单向链表,有两个指针域,一个负责向后连接,一个负责向前连接 相对于单向链表来说:查找更加方便,但添加删除相对复杂 package linkedlist; public class DoubleLinkedListDemo { public static void main(Strin
阅读全文
摘要:单向链表是链表的一种,特点是链表的方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点; 优点:单个节点创建方便,节点删除方便,节点访问方便 public class S
阅读全文
摘要:当队列尾部插入元素满了,头部又删掉了一些元素,这种情况下,就会误认为已满无法存入数据,而实际上头部删除了元素已经留出了空间。 这时候环形队列就解决了这样的一个问题,环形队列的 front 指针始终指向当前队列的第一个元素;rear 指针始终指向最后一个元素后一个的位置(也可以理解为第一个元素的前一个
阅读全文
摘要:用数组模拟队列 用两个变量来记录队列的前后 front:随着数据的输出而改变 rear:随着数据的输入而改变 当添加数据时候 指针往后移动 rear + 1 当 front == rear 时队列为空 若指针 rear 小于队列的最大下标则存入,否则无法存入,队列满判断:rear == maxSiz
阅读全文
摘要:稀疏数组:当一个数组中的大部分数据为相同数据时,可以用稀疏数组保存 方法:记录几行几列和不同值的个数,再把不同值的数据单独罗列出来,从而达到压缩的目的 没有什么难点,所以直接上代码了 1 public class SparesArray { 2 public static void main(Str
阅读全文
1

浙公网安备 33010602011771号