摘要:
算法导论读书笔记(8)目录计数排序计数排序的简单Java实现基数排序基数排序的简单Java实现桶排序计数排序计数排序 假设 n 个输入元素中的每一个都是介于0到 k 之间的整数,此处 k 为某个整数。当 k = O ( n )时,计数排序的运行时间为 Θ ( n )。计数排序的基本思想就是对每一个输入元素 x ,确定出小于 x 的元素个数。有了这一信息,就可以把 x 直接放到它在最终输出数组上的位置上。COUNTING-SORT(A, B, k)1 let C[0 .. k] be a new array2 for i = 0 to k3 C[i] = 04 for j = 1... 阅读全文
摘要:
算法导论读书笔记(2)目录分治法归并排序分治法分析归并排序算法的分析练习2.3-22.3-42.3-52.3-7思考题在归并排序中对小数组采用插入排序逆序对脚注分治法算法设计的方法有很多。插入排序 使用的是 增量 (incremental)方法:在排好子数组 A [ 1 .. j - 1 ]后,将元素 A [ j ]插入,形成排好序的子数组 A [ 1 .. j ]。此外,有很多算法在结构上是 递归 的:为了解决一个给定的问题,算法要一次或多次地递归调用其自身来解决相关子问题。这些算法采用的是 分治策略 (divide-and-conquer):将原问题划分成 n 个规模较小而结构与原问题相似 阅读全文
摘要:
算法导论读书笔记(3) 目录 渐近符号 Θ 记号 O 符号 Ω 记号 o 记号 ω 记号 函数间的比较 渐近符号 当输入规模大到使运行时间只和增长的量级有关时,就是在研究算法的 渐近 效率。就是说,从极限角度看,我们只关心算法运行时间如何随着输入规模的无限增长而增长。 表示算法的渐近运行时间的记号是 阅读全文
摘要:
算法导论读书笔记(4)目录最大子数组问题分治法解决最大子数组问题最大子数组问题的简单Java实现最大子数组问题分析最大子数组问题假设你要投资挥发性化学品公司。就像这家公司生产的化学品那样,该公司的股价也相当的不稳定,而且你一次只能买入一股并在之后的某个时间点卖出。为了弥补这种限制,你可以知道未来几天的股价。你的目标就是最大化你的收益。下图显示的是公司17天之内的股价。当然,你会想要在最低点买入,在最高点卖出。但不幸的是,上图中的最低点发生在最高点之后。又或者换一种策略:找出最高点和最低点,从最高点向左找之前的最低点,从最低点向右找之后的最高点,分别找出这两种情况的最大收益,然后取值大的那个序对 阅读全文
摘要:
算法导论读书笔记(5)目录堆保持堆的性质建堆堆排序算法堆结构和堆排序算法的简单Java实现练习6.2-26.2-5堆(二叉) 堆 数据结构是一种数据结构,它可以被视为一棵完全二叉树。树中每个结点与数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层从左子树开始填。表示堆的数组 A 是一个具有两个属性的对象: A.length 是数组中元素的个数, A.heap-size 是存放在 A 中的堆元素个数。此处有 A.heap-size = A [ i ]。即某个结点的值至多和其父结点一样大。这样,堆中的最大元素就存放在根结点中。最小堆的组织方式刚好相反,最小堆特性是指除了根以外的每个结 阅读全文
摘要:
算法导论读书笔记(6)目录优先级队列练习6.5-76.5-8优先级队列堆的一个很常见的应用:作为高效的 优先级队列 (priority queue)。队列也有两种:最大优先级队列和最小优先级队列。优先级队列 是一种用来维护由一组元素构成的集合 S 的数据结构,这一组元素中的每一个都有一个关键字 ke... 阅读全文
摘要:
算法导论读书笔记(7)目录快速排序快速排序的简单Java实现快速排序的性能最坏情况划分最佳情况划分快速排序的随机化版本比较排序快速排序快速排序是一种原地排序算法,对包含 n 个数的输入数组,最坏情况运行时间为 Θ ( n2 )。虽然这个最坏情况运行时间比较差,但快速排序通常是用于排序的最佳的实用选择。这是因为其平均性能相当好:期望的运行时间为 Θ ( n lg n ),且 Θ ( n lg n )记号中隐含的常数因子很小。像合并排序一样,快速排序也是基于分治模式的。下面是对一个子数组 A [ p .. r ]排序的分治过程的三个步骤:分解:数组 A [ p .. r ]被划分成两个(可能为空) 阅读全文
摘要:
算法导论读书笔记(1)目录算法插入排序循环不变式与插入算法的正确性算法分析插入排序算法的分析练习2.1-22.1-32.1-42.2-2算法所谓 算法 (algorithm)就是定义良好的计算过程,它取一个或一组值作为 输入 ,并产生出一个或一组值作为 输出 。亦即,算法就是一系列的计算步骤,用来将... 阅读全文