随笔分类 - 算法
摘要:读写二进制数据 基因组数据的压缩 游程编码 位图 霍夫曼压缩 前缀码和单词查找树 构造前缀码的单词查找树 写入和读取单词查找树 使用前缀码压缩 使用前缀码展开 LZW压缩 LZW的单词查找树 LZW的单词查找树 LZW压缩的展开 对数据进行压缩能够有效节省保存信息所需的空间和传输信息所需的时间。虽然
阅读全文
摘要:使用正则表达式描述模式 非确定有限状态自动机NFA 模拟NFA的运行 NFA的表示 构造与正则表达式相对应的NFA NFA的模拟与可达性 除了查找子字符串,在很多时候并不知道被查找模式的完整信息,这时就需要用到正则表达式了。正则表达式在子字符串查找、合法性校验、网络爬虫等方面有着非常广泛的应用。 使
阅读全文
摘要:暴力子字符串查找算法 隐式回退 性能 显式回退 Knuth Morris Pratt算法 确定有限状态自动机 DFA的构造 性能 Boyer Moore算法 跳跃表的构建 性能 Rabin Karp指纹字符串算法 关键思想 Horner方法 性能 字符串的一种基本操作就是子字符串查找。比如在文本编辑
阅读全文
摘要:R向单词查找树 数据结构 查找 插入 查找所有键 通配符匹配 最长前缀 删除 R向单词查找树的性质 三向单词查找树 三向单词查找树的性质 同字符串的排序一样,利用字符串的性质开发的查找算法也比通用的算法更有效,这些算法可以用于在以字符串作为被查找键的场合。这类算法在面对巨量的数据时,仍然可以取得这样
阅读全文
摘要:键索引计数法 频率统计 将频率转换为索引 数据分类 回写 低位优先的字符串排序 高位优先的字符串排序 许多重要而熟悉的问题都是基于字符串处理的,比如信息处理(根据给定的关键字搜索网页、文档)、通信系统(发送文本消息、电子邮件、下载电子书)、编程系统(程序是由字符串组成的,再由编译器或解释器将字符串转
阅读全文
摘要:加权有向图 数据结构 加权有向边 加权有向图 最短路径 边的松弛 Dijkstra算法 地图或者导航系统是最短路径的典型应用,其中顶点对应交叉路口,边对应公路,边的权重对应经过一段路的成本(时间或距离)。在这个模型中,问题可以被归纳为:找出从一个顶点到达另一个顶点的成本最小的路径。此外,网络路由、任
阅读全文
摘要:最小生成树的应用 切分定理 贪心算法 加权无向图的数据结构 Prim算法 Kruskal算法 最小生成树的应用 加权图是一种为每条边关联一个权值的图模型,这种图可以表示许多应用,比如在一副航空图中,边表示航线,权值就可以表示距离或费用;在一副电路图中,边表示导线,权值就可以表示导线的长度或成本。在这
阅读全文
摘要:表示无向图的数据结构 邻接表数组 深度优先搜索 深度优先搜索寻找路径 深度优先搜索的性能特点 广度优先搜索 两种搜索方式的对比 图表示由相连的结点所表示的抽象模型,这个模型可以用来研究类似“能否从某个点到达指定的另一个点”、“有多少个结点和指定的结点相连”、“两个结点之间最短的连接是哪一条”。图的算
阅读全文
摘要:散列函数 基于拉链法的散列表 实现 性能 基于线性探测法的散列表 实现 性能 如果所有的键都是小整数,则可以用一个数组来作为无序的符号表,将键作为数组的索引,数组中对应的位置保存的值就是这个键对应的值。这样就可以快速访问任意的键了。散列表就是基于这种方法,但它能够处理更加复杂的数据类型。 使用散列的
阅读全文
摘要:二叉查找树 查找 插入 性能 有序性相关的操作 最大键、最小键 向上取整、向下取整 选择、排名 范围查找 删除操作 删除最大键、最小键 通用删除操作 二叉查找树 前面了解的无序链表和有序数组在性能方面至少在线性级别,无法用于数据量大的场合。接下来要学习的二叉查找树可以将链表插入的灵活性和有序数组查找
阅读全文
摘要:符号表 API 有序符号表 成本模型 无序链表中的顺序查找 实现 性能 有序数组中的二分查找 实现 性能 现代计算机和网络使人们能够访问海量的信息,而且各种计算设备正在源源不断地生成新的信息,高效检索这些信息的能力就成了处理它们的重要前提。接下来学习几种经典的查找算法。 符号表 符号表指的是一张用于
阅读全文
摘要:优先队列 初级实现 二叉堆 堆的有序化 由下至上的堆有序化 由上至下的堆有序化 基于堆的优先队列 堆排序 优先队列 许多情况下,不一定需要将元素全部排序,而只是需要取得当前元素中的最大或最小元素,然后再收集更多的元素,等需要时再取得最大或最小元素即可。在这种情况下,一个合适的数据结构应该支持两种操作
阅读全文
摘要:基本算法 代码 切分方法 性能特点 算法改进 切换到插入排序 三取样切分 针对重复元素的优化 三向切分 本节将要学习的快速排序,可以说是应用最广泛的排序算法了,很多语言如Java、C 的系统排序采用的便是快速排序。快速排序实现简单,而且适用于各种不同的输入数据,且在一般的应用中比其他排序算法都要快得
阅读全文
摘要:归并方法 自顶向下的归并排序 实现 性能分析 优化:切换到插入排序 自底向上的归并排序 归并方法 “归并”操作是将两个有序的数组合并成一个更大的有序数组,归并排序就是基于这一操作,先递归地将一个数组分成两半分别排序,然后将排序结果归并起来。 归并的代码如下: 这种归并方法用了一个辅助数组aux[],
阅读全文
摘要:排序通用代码 选择排序 插入排序 希尔排序 排序通用代码 通用代码支持任意实现了Comparable接口的数据类型的排序,不同的排序算法的差异体现在sort方法的实现上。 算法特点 插入排序所需的时间则是与输入数组的特点有很大关系的,最快的时候可以在线性时间内完成,最慢的时候却达到平方级别。 最好情
阅读全文
摘要:动态连通性问题 实现 通用代码 Quick Find算法 Quick Union算法 加权Quick Union算法 动态连通性问题 在基础部分的最后一节,作者用一个现实中应用非常广泛的案例,说明以下几点: 优秀的算法因为能解决实际问题而变得更为重要; 高效算法的代码也可以很简单; 理解某个实现的性
阅读全文
摘要:"栈" "可变长数组实现" "链表实现" "数组与链表的对比" "队列" "链表实现" 栈 下压栈(简称栈)是一种基于后进后出(LIFO)策略的集合类型。这里学习分别用数组和链表这两种基础数据结构来实现栈。 栈支持的基本操作有push,pop。 可变长数组实现 要用数组实现栈,可以声明一个int型的
阅读全文