随笔分类 - Data Structures & Algorithms
摘要:一、树的路径长度两个节点之间的路径长度(PL)是连接两节点的路径上的分支数。如图1中,节点7、8到29的PL都为2,节点15、14到29的PL都为1.树的外部路径长度:各叶节点到根节点的路径长度之和(EPL)。如图1中,叶节点有7、8、14,分别到根节点的路径为2、2、1,那么EPL为5.树的内部路...
阅读全文
摘要:希尔排序: 针对于插入排序来说,复制的次数太多,在标记的左边部分数据项都是排过序的,在每次往右移动,新的数据项要移动到左边正确的位置,造成中间数据项都必须往右移动一位,这步骤对每个数据项都执行了将近N次复制,平均每次移动 N/2,总共是 N2/2次复制。因此排序的执行效率是O(N2)。 希尔排序通过...
阅读全文
摘要:最小生成的树 图中的所有顶点(V)只用最少数量的边(E)保证它们彼此连通,就组成最小生成的树。 注意,最小生成的树边(E)的数量总比顶点(V)的数量少1,即:E =V - 1 ; 记住,不必关心边的长度,不需要找到最短路径,而是找最少数量的边。(在带权图中会发生改变) 创建最小生成的树的算法与遍历几...
阅读全文
摘要:图(Graph) 图(graph)是一种比线性表、树更为复杂的数据结构。在线性表中,数据元素之间呈线性关系,即每个元素只有一个直接前驱和一个直接后继。在树型结构中,数据元素之间有明显的的层次关系,即每个结点只有一个直接前驱,但可有多个直接后继,而在图结构中,每个结点即可有多个直接前驱,也可有多个直接...
阅读全文
摘要:链地址法 开放地址法中,通过哈希表中寻找一个空白单元解决冲突问题。另一个方法是在哈希表的每个单元中设置一个链表,某个数据项的关键字还是像通常一样映射到哈希表的单元中,而数据项本身插入到这个单元的链表中。不需要在哈希表中寻找空白单元。 链地址法的装填因子与开放地址法不同,在链地址法中,需要在有N个单元...
阅读全文
摘要:哈希表是一种数据结构,它可以提供快速的插入和删除操作。无论哈希表有多少数据,插入、删除只需要接近常量的时间,即 O(1) 的时间级。明显比树还快,树的操作通常需要O(N)的时间级。 缺点:它是基于数组的,数组创建之后难以维护。某些哈希表被基本填满时,性能下降非常严重。而且也没有提供一种方法可以以任何...
阅读全文
摘要:分治算法: 递归的二分查找就是分治算法的一个例子。把一个大问题分成两个相对更小的问题,并且去解决每一个小问题。对每一个小问题也是同样的解决方法:再把每个小问题分成更小的问题,并且解决它们。这个过程一直持续下去。分治算法常常是一个方法,而这个方法含有两个对自身的调用,分别对应于问题的两个部分。 归并排...
阅读全文
摘要:第一列:*第二列:**第三列:***第四列:****。。。求N列中 * 的个数? 我们发现:1)最后一列,它的值是N。2)总个数 = N + 所有剩余列的和。 public int triangle(int c) { return c + getCount(c - 1); }以上的代码是错误的,递归...
阅读全文
摘要:堆:实现了优先级队列的一种数据结构。由它实现的优先级队列的插入和删除的时间复杂度都是 O(logN),尽管这样删除的时间变慢一些,但插入的时间快很多。当速度非常重要,且有很多插入操作时,可以选择堆来实现优先级队列。堆的特点:1)完全的二叉树,除了树的最后一层不需要满的,其它的每一层从左到右都是满的。...
阅读全文
摘要:二叉树效率: 在查找过程中,需要访问每层的一个节点,所以只要知道有多少层就知道操作多长时间。假设是一个满树:如表中显示 节点数 层 数 1 1 3 2 ...
阅读全文
摘要:二叉树遍历实现: 下面简单介绍一下几种算法和思路:先序遍历:1. 访问根结点2. 按先序遍历左子树;3. 按先序遍历右子树;4. 例如:遍历已知二叉树结果为:A->B->D->G->H->C->E->F 中序遍历:1. 按中序遍历左子树;2. 访问根结点;3. 按中序遍历右子树;4. 例如遍历已知...
阅读全文
摘要:二叉树,结合了两种数据结构的优点:一种是有序数组,一种是链表。在树中查找数据项的速度和在有序数组查找一样快;并且插入和删除数据项的速度和链表一样快。 1)在有序数组插入数据太慢:通过二分查找找到该位置,但每次所有比新数据大的坐标都要往后移动一位。不适合于频繁插入和删除数据的操作。2)在链表查找太慢:...
阅读全文
摘要:小结:1)链表包含一个 LinkList 对象和许多个 Link 对象。2)LinkList对象都包含一个引用,这个引用通常叫first ,它指向链表的第一个链接点。3)每个 LinkList对象包含数据和一个引用,该引用叫做next ,它指向链表的下一个链接点。4)next字段为null ,表示已经到链表的结尾。5)在表头插入链接点需要把新的链接点的next指向原来第一个链接点,然后把first指向新的链接点。6)在表头删除链接点,需要first =first.next();7)为了遍历整个链表,从 first开始,然后从一个链接点指向下一个链接点,方法是用每个链接点的 next找到下一个链
阅读全文
摘要:假设你要遍历一张链表,然后需要的每个链接点上执行一些操作。例如一张链表存储职工表,需要提高拿最低工资员工的薪水,这样无法做出来。若是数组,这种操作很容易。可以用数组下标跟踪每个数据项,并进行操作,再指向下一个坐标。链表虽然可以用 find() 找出指定的链接点,但是这种需要频繁比较,而且多次遍历。1 for(int i = 0 ; i < emps.length; i++){2 Emp emp = emps[i];3 if(emp.getSalary() < 1800){4 emp.setSalary(1800);5 ...
阅读全文
摘要:链表的效率:在表头插入和删除数据项很快,仅需要改变一两个引用值,所花费时间O(1)。平均起来,删除、查找、在指定的链接点插入仅需要搜索一半的数据,需要O(N)次比较。在数据执行这些操作也需要O(N)次比较,但链表更快一些,因为插入删除数据项时,链表不需要移动其它数据项。链表比数组优越的重要方面在于链表需要多少内存就用多少内存,并且可以扩展到其它所有可用的内存。数组的大小从创建时就定义好,所以经常由于数组太大导致效率低下,或者数组太小空间溢出。向量是一种可扩展的数组,但它只允许以固定的大小增长扩展(溢出时增长一倍数组容量),在内存使用率比链表的低。ADT:抽象数据类型,是指一些数据以及对这些数据
阅读全文
摘要:双端链表:与单链表非常相似,但添加了一个特性:对最后一个链接点的引用,就像跟单链表的第一个链接点引用一样。(insertFirst)单链表对最后的一个链接点也可以引用,方法是遍历到表尾,找到最后一个链接点,但是效率太低了,所以提出双端链表。 1 public class Link { 2 3 private int iData; 4 private double dData; 5 private Link next; 6 7 public Link(int i, double d) { 8 this.iData = i; 9 ...
阅读全文
摘要:在链表中,每个数据项都被包含在(Link)中,一个链接点是某个类的对象,这个类可以叫做Link。每个Link对象都包含一个对下一个链接点引用的字段(next)。 1 public class Link {2 public int iData;3 public double dDa...
阅读全文
摘要:队列:先进先出 在现实中,买电影票排队,当前面的的人买完票离开之后,后面的人都要往前移动一步。在计算机中也可以这么类似的做法,但是效率很低。所以,我们用了队列中的队头(front)和队尾(rear)指针保持所有的数据项不变。 循环队列:在往队列中插入一个新的数据项,rear箭头往上移动,移向数组下标...
阅读全文
摘要:栈:先进后出,后进先出。 1 public class Stack { 2 3 private int maxSize; 4 private int[] stackArray; 5 private int top; 6 7 public Stack(int s){ 8 this.maxSize = s; 9 stackArray = new int[maxSize];10 top = -1;11 }12 13 public void push(int d){14 stackArr...
阅读全文
摘要:冒泡排序: 假设一个数组 int[] array 长度为5,坐标为:[0]、[1]、[2]、[3]、[4] ,每相邻两位数比较。第一次比较:[0]与[1]、[1]与[2]、[2]与[3]、[3]与[4] (array[4] 已是最大)第二次比较:[0]与[1]、[1]与[2]、[2]与[3]第三次比...
阅读全文
浙公网安备 33010602011771号