随笔分类 - 数据结构与算法
算法导论读书笔记(19)
摘要:算法导论读书笔记(19)目录最优二叉搜索树步骤1:一棵最优二叉查找树的结构步骤2:一个递归解步骤3:计算一棵最优二叉查找树的期望搜索代价最优二叉搜索树最优二叉搜索树 (optimal binary search tree)问题的形式化定义如下:给定一个由 n 个互异的关键字组成的序列 K = ,且关...
阅读全文
算法导论读书笔记(18)
摘要:算法导论读书笔记(18)目录最长公共子序列步骤1:描述最长公共子序列的特征步骤2:一个递归解步骤3:计算LCS的长度步骤4:构造LCSLCS问题的简单Java实现最长公共子序列某给定序列的子序列,就是将给定序列中零个或多个元素去掉后得到的结果。其形式化定义如下:给定一个序列 X = ,另一个序列 Z...
阅读全文
算法导论读书笔记(17)
摘要:算法导论读书笔记(17)目录动态规划概述钢条切割自顶向下的递归实现使用动态规划解决钢条切割问题子问题图重构解钢条切割问题的简单Java实现动态规划概述和分治法一样, 动态规划 (dynamic programming)是通过组合子问题的解而解决整个问题的。分治法是将问题划分成一些独立的子问题,递归地...
阅读全文
算法导论读书笔记(16)
摘要:算法导论读书笔记(16)目录动态顺序统计检索具有给定排序的元素确定一个元素的秩区间树步骤1:基础数据结构步骤2:附加信息步骤3:维护信息步骤4:设计新操作动态顺序统计之前介绍过 顺序统计 的概念。在一个无序的集合中,任意的顺序统计量都可以在 O ( n )时间内找到。而这里我们将介绍如何在 O ( ...
阅读全文
算法导论读书笔记(15) - 红黑树的具体实现
摘要:算法导论读书笔记(15) - 红黑树的具体实现目录红黑树的简单Java实现红黑树的简单Java实现/** * 红黑树 * * 部分代码参考自TreeMap源码 */public class RedBlackTree { protected TreeNode root = null; pr...
阅读全文
算法导论读书笔记(14) - 二叉查找树的具体实现
摘要:算法导论读书笔记(14) - 二叉查找树的具体实现目录二叉查找树的简单Java实现二叉查找树的简单Java实现/** * 二叉查找树 * 部分代码参考自TreeMap的源码 */public class BinarySearchTree { protected TreeNode root = ...
阅读全文
算法导论读书笔记(13)
摘要:算法导论读书笔记(13)目录红黑树旋转插入情况1 : z 的叔父结点 y 是红色的情况2 : z 的叔父结点 y 是黑色的,而且 z 是右孩子情况3 : z 的叔父结点 y 是黑色的,而且 z 是左孩子删除情况1 : x 的兄弟 w 是红色的情况2 : x 的兄弟 w 是黑色的,且 w 的两个孩子都...
阅读全文
算法导论读书笔记(12)
摘要:算法导论读书笔记(12)目录二叉查找树查询二叉查找树查找最大关键字元素和最小关键字元素前趋和后继插入和删除插入删除二叉查找树如下图所示,一棵二叉查找树是按二叉树结构来组织的。这样的树可以用链表结构来表示,其中每一个结点都是一个对象。结点中除了 key 域和卫星数据外,还包含域 left , righ...
阅读全文
算法导论读书笔记(8)
摘要:算法导论读书笔记(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...
阅读全文
算法导论读书笔记(10)
摘要:算法导论读书笔记(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...
阅读全文
算法导论读书笔记(9)
摘要:算法导论读书笔记(9)目录选择问题最小值和最大值随机选择算法最坏情况线性时间的选择选择问题在一个由 n 个元素组成的集合中,第 i 个 顺序统计量 (order statistic)是该集合中第 i 小的元素。例如,在一组元素所组成的集合中, 最小值 是第 1 个顺序统计量( i = 1 ), 最大...
阅读全文
算法导论读书笔记(11)
摘要:算法导论读书笔记(11)目录散列表简介直接寻址表散列表链接法解决碰撞链接法散列的分析散列函数除数散列法乘法散列法全域散列开放寻址法线性探查二次探查双重散列对开放寻址散列的分析。散列表简介在很多应用中,都要用到一种动态集合结构,它仅支持 INSERT , SEARCH 和 DELETE 字典操作。而 散列表 (hash table)就是实现字典的一种有效的数据结构。在最坏情况下,从散列表中查找一个元素的时间与在链表中查找一个元素的时间相同,都是 Θ ( n ),但在实践中,散列技术的效率是很高的。在一些合理的假设下,从散列表中查找一个元素的期望时间是 O ( 1 )。散列表是普通数组的推广。因为
阅读全文
算法导论读书笔记(7)
摘要:算法导论读书笔记(7)目录快速排序快速排序的简单Java实现快速排序的性能最坏情况划分最佳情况划分快速排序的随机化版本比较排序快速排序快速排序是一种原地排序算法,对包含 n 个数的输入数组,最坏情况运行时间为 Θ ( n2 )。虽然这个最坏情况运行时间比较差,但快速排序通常是用于排序的最佳的实用选择。这是因为其平均性能相当好:期望的运行时间为 Θ ( n lg n ),且 Θ ( n lg n )记号中隐含的常数因子很小。像合并排序一样,快速排序也是基于分治模式的。下面是对一个子数组 A [ p .. r ]排序的分治过程的三个步骤:分解:数组 A [ p .. r ]被划分成两个(可能为空)
阅读全文
算法导论读书笔记(3)
摘要:算法导论读书笔记(3) 目录 渐近符号 Θ 记号 O 符号 Ω 记号 o 记号 ω 记号 函数间的比较 渐近符号 当输入规模大到使运行时间只和增长的量级有关时,就是在研究算法的 渐近 效率。就是说,从极限角度看,我们只关心算法运行时间如何随着输入规模的无限增长而增长。 表示算法的渐近运行时间的记号是
阅读全文
算法导论读书笔记(5)
摘要:算法导论读书笔记(5)目录堆保持堆的性质建堆堆排序算法堆结构和堆排序算法的简单Java实现练习6.2-26.2-5堆(二叉) 堆 数据结构是一种数据结构,它可以被视为一棵完全二叉树。树中每个结点与数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层从左子树开始填。表示堆的数组 A 是一个具有两个属性的对象: A.length 是数组中元素的个数, A.heap-size 是存放在 A 中的堆元素个数。此处有 A.heap-size = A [ i ]。即某个结点的值至多和其父结点一样大。这样,堆中的最大元素就存放在根结点中。最小堆的组织方式刚好相反,最小堆特性是指除了根以外的每个结
阅读全文
算法导论读书笔记(6)
摘要:算法导论读书笔记(6)目录优先级队列练习6.5-76.5-8优先级队列堆的一个很常见的应用:作为高效的 优先级队列 (priority queue)。队列也有两种:最大优先级队列和最小优先级队列。优先级队列 是一种用来维护由一组元素构成的集合 S 的数据结构,这一组元素中的每一个都有一个关键字 ke...
阅读全文
算法导论读书笔记(2)
摘要:算法导论读书笔记(2)目录分治法归并排序分治法分析归并排序算法的分析练习2.3-22.3-42.3-52.3-7思考题在归并排序中对小数组采用插入排序逆序对脚注分治法算法设计的方法有很多。插入排序 使用的是 增量 (incremental)方法:在排好子数组 A [ 1 .. j - 1 ]后,将元素 A [ j ]插入,形成排好序的子数组 A [ 1 .. j ]。此外,有很多算法在结构上是 递归 的:为了解决一个给定的问题,算法要一次或多次地递归调用其自身来解决相关子问题。这些算法采用的是 分治策略 (divide-and-conquer):将原问题划分成 n 个规模较小而结构与原问题相似
阅读全文
算法导论读书笔记(4)
摘要:算法导论读书笔记(4)目录最大子数组问题分治法解决最大子数组问题最大子数组问题的简单Java实现最大子数组问题分析最大子数组问题假设你要投资挥发性化学品公司。就像这家公司生产的化学品那样,该公司的股价也相当的不稳定,而且你一次只能买入一股并在之后的某个时间点卖出。为了弥补这种限制,你可以知道未来几天的股价。你的目标就是最大化你的收益。下图显示的是公司17天之内的股价。当然,你会想要在最低点买入,在最高点卖出。但不幸的是,上图中的最低点发生在最高点之后。又或者换一种策略:找出最高点和最低点,从最高点向左找之前的最低点,从最低点向右找之后的最高点,分别找出这两种情况的最大收益,然后取值大的那个序对
阅读全文
算法导论读书笔记(1)
摘要:算法导论读书笔记(1)目录算法插入排序循环不变式与插入算法的正确性算法分析插入排序算法的分析练习2.1-22.1-32.1-42.2-2算法所谓 算法 (algorithm)就是定义良好的计算过程,它取一个或一组值作为 输入 ,并产生出一个或一组值作为 输出 。亦即,算法就是一系列的计算步骤,用来将...
阅读全文

浙公网安备 33010602011771号