Algorithms(fourth edition)——无向图】的更多相关文章

1.设计图基本操作API 2.用什么数据结构来表示图并实现API 要求:(1)要预留足够空间 (2)实例方法实现要快 三个选择: 邻接矩阵:布尔矩阵,不满足条件一,而且无法表示平行边 边的数组:不满足条件二 邻接表矩阵:满足两个要求,bingo 用bag数据结构实现链表.…
最大公约数(Greatest Common Divisor, GCD),是指2个或N个整数共有约数中最大的一个.a,b的最大公约数记为(a, b).相对应的是最小公倍数,记为[a, b]. 在求最大公约数的几种方法中,欧几里得算法(辗转相除法)最为出名: 计算(a, b), 若b是0,则最大公约数为a:否则.将a除以b得到余数r,a和b的最大公约数就是b和r的最大公约数,即:(a, b) = (b, r) public static int gcd(int a ,int b){ if(b ==…
3.1.4 无序链表中的顺序查找 符号表中使用的数据结构的一个简单选择是链表,每个结点存储一个键值对,如以下代码所示.get()的实现即为遍历链表,用equals()方法比较需被查找的键和每个节点中的键.如果匹配成功我们就返回null.put()的实现也是遍历链表,用equals()方法比较需被查找的键.如果匹配成功我们就用第二个参数指定的值更新和改键现关联的值,否则我们就用给定的键值对创建一个新的节点并将其插入到链表的开头.这种方法也被称为顺序查找:在查找中我们一个一个地顺序遍历符号表中的所有…
2.4.5 堆排序 我们可以把任意优先队列变成一种排序方法.将所有元素插入一个查找最小元素的有限队列,然后再重复调用删除最小元素的操作来将他们按顺序删去.用无序数组实现的优先队列这么做相当于进行一次插入排序.用基于堆底优先队列这样做等同于哪种排序?一种全新的排序方法!我们就用堆来实现一种经典的排序算法——堆排序(Heap sort). 堆排序可以分为两个阶段.在堆的构造阶段中,我们将原始数组重新组织安排进一个堆中:然后在下沉排序阶段,我们从堆中按递减顺序取出所有元素并得到排序结果.为了和我们已经…
· 学后心得体会与部分习题实现 心得体会: 曾经只是了解了优先队列的基本性质,并会调用C++ STL库中的priority_queue以及 java.util.PriorityQueue<E>中的优先队列封装类,但是没有看过源码,也并不曾知道实现方法用到了堆结构. 优先队列通过堆进行插入元素和删除最小元素的两种高效操作来维护元素集合,每个操作的时间都为对数级(logN).堆结构及其操作符合优先队列的全部特点,另附有高效率,用来描述与实现优先队列再合适不过. 在学习过程中,在对于堆结构众多操作的…
命题Q.对于一个含有N个元素的基于堆叠优先队列,插入元素操作只需要不超过(lgN + 1)次比较,删除最大元素的操作需要不超过2lgN次比较. 证明.由命题P可知,两种操作都需要在根节点和堆底之间移动元素,而路径的长度不超过lgN.对于路径上的每个节点,删除最大元素需要两次比比较(除了堆底元素),一次用来找出较大的子节点,一次用来确定该子节点是否需要上浮. 对于需要大量混杂的插入和删除最大元素操作的典型应用来说,命题Q意味着一个重要的性能突破(详见优先队列增长数量级表).使用有序或是无序数组的优…
Immutable Strings Objects of the String class are immutable. If you examine the JDK documentation for the String class, you’ll see that every method in the class that appears to modify a String actually creates and returns a brand new String object c…
3.1.3 用例举例 在学习它的实现之前我们还是应该先看看如何使用它.相应的我们这里考察两个用例:一个用来跟踪算法在小规模输入下的行为测试用例和一个来寻找更高效的实现的性能测试用例. 3.1.3.1 行为测试用例 为了在小规模的的输入下跟踪算法的行为,我们用一下测试用例测试我们对符号表的所有实现.这段代码会从标准输入接受多个字符串,构造一张符号表来将i 和第i 个字符串相关联,然后打印符号表.我们假设所有的字符串都只有一个字母.一般我们会使用”S E A R C H E X A M P L E”…
3.1.2 有序的符号表 典型的应用程序中,键都是Comparable的对象,因此可以使用a.compare(b)来比较a和b两个键.许多符号表的实现都利用Comparable接口带来的键的有序性来更好地实现put()和get()方法.更重要的事在这些实现中,我们可以认为符号表都会保持键的有序并大大扩展它的API,根据键的相对位置定义更多实用的操作.例如,假设键是时间,你肯呢个会对最早或是最晚或是给定时间段内的所有键等感兴趣.在大多数情况下实现put()和get()方法背后的数据结构都不难实现这…
3.1符号表 符号表最主要的目的就是将一个键和一个值联系起来.用例能够将一个键值对插入符号表并希望在之后能够从符号表的所有键值对中按照键值姐找到对应的值.要实现符号表,我们首先要定义其背后的数据结构,并指明创建并操作这种数据结构以实现插入.查找操作所需要的算法. 查找在大多数应用程序中都至关重要,许多编程环境也因此将符号表实现为高级的抽象数据结构,包括Java——我们会在3.5节中讨论Java的符号表实现.下标给出的例子是在一些典型的应用场景中可能出项的键和值.我们马上会看到一些参考性的用例.3…