随笔分类 - 《Algorithms (Fourth Edition)》读书笔记
《Algorithms (Fourth Edition)》读书笔记
摘要:3.1.4 无序链表中的顺序查找符号表中使用的数据结构的一个简单选择是链表,每个结点存储一个键值对,如以下代码所示。get()的实现即为遍历链表,用equals()方法比较需被查找的键和每个节点中的键。如果匹配成功我们就返回null。put()的实现也是遍历链表,用equals()方法比较需被查找的...
阅读全文
摘要:3.1.3 用例举例在学习它的实现之前我们还是应该先看看如何使用它。相应的我们这里考察两个用例:一个用来跟踪算法在小规模输入下的行为测试用例和一个来寻找更高效的实现的性能测试用例。3.1.3.1 行为测试用例为了在小规模的的输入下跟踪算法的行为,我们用一下测试用例测试我们对符号表的所有实现。这段代码...
阅读全文
摘要:3.1.2 有序的符号表典型的应用程序中,键都是Comparable的对象,因此可以使用a.compare(b)来比较a和b两个键。许多符号表的实现都利用Comparable接口带来的键的有序性来更好地实现put()和get()方法。更重要的事在这些实现中,我们可以认为符号表都会保持键的有序并大大扩...
阅读全文
摘要:3.1符号表符号表最主要的目的就是将一个键和一个值联系起来。用例能够将一个键值对插入符号表并希望在之后能够从符号表的所有键值对中按照键值姐找到对应的值。要实现符号表,我们首先要定义其背后的数据结构,并指明创建并操作这种数据结构以实现插入、查找操作所需要的算法。查找在大多数应用程序中都至关重要,许多编...
阅读全文
摘要:2.4.5 堆排序我们可以把任意优先队列变成一种排序方法。将所有元素插入一个查找最小元素的有限队列,然后再重复调用删除最小元素的操作来将他们按顺序删去。用无序数组实现的优先队列这么做相当于进行一次插入排序。用基于堆底优先队列这样做等同于哪种排序?一种全新的排序方法!我们就用堆来实现一种经典的排序算法...
阅读全文
摘要:· 学后心得体会与部分习题实现心得体会:曾经只是了解了优先队列的基本性质,并会调用C++ STL库中的priority_queue以及 java.util.PriorityQueue中的优先队列封装类,但是没有看过源码,也并不曾知道实现方法用到了堆结构。优先队列通过堆进行插入元素和删除最小元素的两种...
阅读全文
摘要:命题Q。对于一个含有N个元素的基于堆叠优先队列,插入元素操作只需要不超过(lgN + 1)次比较,删除最大元素的操作需要不超过2lgN次比较。证明。由命题P可知,两种操作都需要在根节点和堆底之间移动元素,而路径的长度不超过lgN。对于路径上的每个节点,删除最大元素需要两次比比较(除了堆底元素),一次...
阅读全文
摘要:2.4.4 堆的算法我们用长度为 N + 1的私有数组pq[]来表示一个大小为N的堆,我们不会使用pq[0],堆元素放在pq[1]至pq[N]中。在排序算法中,我们只能通过私有辅助函数less()和exch()来访问元素,但因为所有的元素都在数组pq[]中,我们在2.4.4.2节中会使用更加紧凑的实...
阅读全文
摘要:2.4.3 堆的定义数据结构二叉堆能够很好地实现优先队列的基本操作。在二叉堆的数组中,每个元素都要保证大于等于另两个特定位置的元素。相应地,这些位置的元素又至少要大于等于数组中的两个元素,以此类推。如果我们将所有元素画成一棵二叉树,将每个较大元素和两个较小的元素用边连接就可以很容易看出这种结构。定义...
阅读全文
摘要:2.4.2初级实现我们知道,基础数据结构是实现优先队列的起点。我们可以是使用有序或无序的数组或链表。在队列较小时,大量使用两种主要操作之一时,或是所操作元素的顺序已知时,它们十分有用。因为这些实现相对简单,我们在这里只能给出文字描述。2.4.2.1数组实现(无序)或许实现优先队列的最简单方法就是使用...
阅读全文
摘要:许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者是不一定要以此就将他们排序。很多情况下我们会手机一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素。如此这般。在这种情况下,一个合适的数据结构应该支持两种操作:删除最大元素和插入元素。这种数据类型叫做优先队...
阅读全文
浙公网安备 33010602011771号