Fork me on GitHub

  2014年4月12日
摘要: 算法导论读书笔记(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... 阅读全文
posted @ 2014-04-12 18:54 sungoshawk 阅读(796) 评论(0) 推荐(0) 编辑
摘要: 算法导论读书笔记(11)目录散列表简介直接寻址表散列表链接法解决碰撞链接法散列的分析散列函数除数散列法乘法散列法全域散列开放寻址法线性探查二次探查双重散列对开放寻址散列的分析。散列表简介在很多应用中,都要用到一种动态集合结构,它仅支持 INSERT , SEARCH 和 DELETE 字典操作。而 散列表 (hash table)就是实现字典的一种有效的数据结构。在最坏情况下,从散列表中查找一个元素的时间与在链表中查找一个元素的时间相同,都是 Θ ( n ),但在实践中,散列技术的效率是很高的。在一些合理的假设下,从散列表中查找一个元素的期望时间是 O ( 1 )。散列表是普通数组的推广。因为 阅读全文
posted @ 2014-04-12 18:54 sungoshawk 阅读(5430) 评论(0) 推荐(2) 编辑
摘要: 算法导论读书笔记(10)目录栈和队列栈队列链表有根树的表示二叉树分支数无限的有根树栈和队列栈和队列都是动态集合。栈实现了一种 先进先出 的策略。类似地,队列实现了一种 后进先出 的策略。栈作用于栈上的 INSERT 操作称为 压入 ( PUSH ),而无参的 DELETE 操作常称为 弹出 ( POP )。可以使用一个数组 S [ 1 .. n ]来实现一个至多有 n 个元素的栈。如下图所示,数组 S 有个属性 S.top ,它指向最近插入的元素。STACK-EMPTY(S)1 if S.top == 02 return TRUE3 else4 return FALSEPUSH... 阅读全文
posted @ 2014-04-12 18:54 sungoshawk 阅读(547) 评论(0) 推荐(0) 编辑
摘要: 算法导论读书笔记(9)目录选择问题最小值和最大值随机选择算法最坏情况线性时间的选择选择问题在一个由 n 个元素组成的集合中,第 i 个 顺序统计量 (order statistic)是该集合中第 i 小的元素。例如,在一组元素所组成的集合中, 最小值 是第 1 个顺序统计量( i = 1 ), 最大... 阅读全文
posted @ 2014-04-12 18:54 sungoshawk 阅读(862) 评论(0) 推荐(0) 编辑
摘要: 算法导论读书笔记(4)目录最大子数组问题分治法解决最大子数组问题最大子数组问题的简单Java实现最大子数组问题分析最大子数组问题假设你要投资挥发性化学品公司。就像这家公司生产的化学品那样,该公司的股价也相当的不稳定,而且你一次只能买入一股并在之后的某个时间点卖出。为了弥补这种限制,你可以知道未来几天的股价。你的目标就是最大化你的收益。下图显示的是公司17天之内的股价。当然,你会想要在最低点买入,在最高点卖出。但不幸的是,上图中的最低点发生在最高点之后。又或者换一种策略:找出最高点和最低点,从最高点向左找之前的最低点,从最低点向右找之后的最高点,分别找出这两种情况的最大收益,然后取值大的那个序对 阅读全文
posted @ 2014-04-12 18:53 sungoshawk 阅读(1079) 评论(0) 推荐(0) 编辑
摘要: 算法导论读书笔记(3) 目录 渐近符号 Θ 记号 O 符号 Ω 记号 o 记号 ω 记号 函数间的比较 渐近符号 当输入规模大到使运行时间只和增长的量级有关时,就是在研究算法的 渐近 效率。就是说,从极限角度看,我们只关心算法运行时间如何随着输入规模的无限增长而增长。 表示算法的渐近运行时间的记号是 阅读全文
posted @ 2014-04-12 18:53 sungoshawk 阅读(1159) 评论(1) 推荐(0) 编辑
摘要: 算法导论读书笔记(2)目录分治法归并排序分治法分析归并排序算法的分析练习2.3-22.3-42.3-52.3-7思考题在归并排序中对小数组采用插入排序逆序对脚注分治法算法设计的方法有很多。插入排序 使用的是 增量 (incremental)方法:在排好子数组 A [ 1 .. j - 1 ]后,将元素 A [ j ]插入,形成排好序的子数组 A [ 1 .. j ]。此外,有很多算法在结构上是 递归 的:为了解决一个给定的问题,算法要一次或多次地递归调用其自身来解决相关子问题。这些算法采用的是 分治策略 (divide-and-conquer):将原问题划分成 n 个规模较小而结构与原问题相似 阅读全文
posted @ 2014-04-12 18:53 sungoshawk 阅读(1859) 评论(0) 推荐(2) 编辑
摘要: 算法导论读书笔记(7)目录快速排序快速排序的简单Java实现快速排序的性能最坏情况划分最佳情况划分快速排序的随机化版本比较排序快速排序快速排序是一种原地排序算法,对包含 n 个数的输入数组,最坏情况运行时间为 Θ ( n2 )。虽然这个最坏情况运行时间比较差,但快速排序通常是用于排序的最佳的实用选择。这是因为其平均性能相当好:期望的运行时间为 Θ ( n lg n ),且 Θ ( n lg n )记号中隐含的常数因子很小。像合并排序一样,快速排序也是基于分治模式的。下面是对一个子数组 A [ p .. r ]排序的分治过程的三个步骤:分解:数组 A [ p .. r ]被划分成两个(可能为空) 阅读全文
posted @ 2014-04-12 18:53 sungoshawk 阅读(2234) 评论(0) 推荐(0) 编辑
摘要: 算法导论读书笔记(6)目录优先级队列练习6.5-76.5-8优先级队列堆的一个很常见的应用:作为高效的 优先级队列 (priority queue)。队列也有两种:最大优先级队列和最小优先级队列。优先级队列 是一种用来维护由一组元素构成的集合 S 的数据结构,这一组元素中的每一个都有一个关键字 ke... 阅读全文
posted @ 2014-04-12 18:53 sungoshawk 阅读(811) 评论(2) 推荐(0) 编辑
摘要: 算法导论读书笔记(5)目录堆保持堆的性质建堆堆排序算法堆结构和堆排序算法的简单Java实现练习6.2-26.2-5堆(二叉) 堆 数据结构是一种数据结构,它可以被视为一棵完全二叉树。树中每个结点与数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层从左子树开始填。表示堆的数组 A 是一个具有两个属性的对象: A.length 是数组中元素的个数, A.heap-size 是存放在 A 中的堆元素个数。此处有 A.heap-size = A [ i ]。即某个结点的值至多和其父结点一样大。这样,堆中的最大元素就存放在根结点中。最小堆的组织方式刚好相反,最小堆特性是指除了根以外的每个结 阅读全文
posted @ 2014-04-12 18:53 sungoshawk 阅读(1311) 评论(0) 推荐(0) 编辑
摘要: 算法导论读书笔记(1)目录算法插入排序循环不变式与插入算法的正确性算法分析插入排序算法的分析练习2.1-22.1-32.1-42.2-2算法所谓 算法 (algorithm)就是定义良好的计算过程,它取一个或一组值作为 输入 ,并产生出一个或一组值作为 输出 。亦即,算法就是一系列的计算步骤,用来将... 阅读全文
posted @ 2014-04-12 18:52 sungoshawk 阅读(2697) 评论(1) 推荐(3) 编辑