超级简单的数据压缩算法—LZW算法
摘要:1. 前文回顾 在字符串算法—数据压缩中,我们介绍了哈夫曼压缩算法(Huffman compression),本文将介绍LZW算法。 2. LZW算法 这个算法很简单,为了方便讲述,我们将采用16进制,写代码的时候在把它转回2进制就是了。 在16进制下:A:41; B:42; C:43; D:44;
阅读全文
字符串算法—数据压缩
摘要:本文将介绍哈夫曼压缩算法(Huffman compression)。 1. 前文回顾 在字符串算法—字符串排序(上篇)和字符串算法—字符串排序(下篇)中,我们讲述了字符串的排序方法; 在字符串算法—字典树中,我们讲述了如何在一堆字符串中寻找某个字符串的方法; 在字符串算法—字符串搜索和字符串算法—正
阅读全文
字符串算法—正则表达式
摘要:1. 前文回顾 在字符串算法—字符串搜索中,我们实现了从一堆字符中搜索某个字符串的高效算法。 但如果要在一堆字符中找具有某些规律的字符串(要找的字符串是不确定的,但有规律),该如何设计算法? 本文将介绍NFA算法来解决此问题。 2. 正则表达式 首先,有规律的字符串是长什么样的呢?例如:ABBBBB
阅读全文
字符串算法—字符串搜索
摘要:1. 前文回顾 在字符串算法—字典树(Tries)中,我们实现了在一堆字符串中寻找某个字符串的高效算法。但如果要从一段字符中,寻找某个字符串呢? 我们可以用字符串算法—字符串排序(下篇)中的后缀排序法(suffix arrays)来寻找关键词,但它消耗的内存有点大(毕竟要建一个超大的数组)。 为了解
阅读全文
字符串算法—字典树
摘要:本文将介绍字符串的查找算法:R-way tries和ternary search tries(TST)。 1. 前文回顾 在字符串算法—字符串排序(上篇)和字符串算法—字符串排序(下篇)中,我们介绍了字符串的排序方法。 但如果我们只想进行字符串的查找工作而不想排序呢? 提到查找,我们自然而然地就想起
阅读全文
字符串算法—字符串排序(下篇)
摘要:本文将介绍3区基数快速排序、后缀排序法。 1. 前文回顾 在字符串算法—字符串排序(上篇)中,我们介绍了键索引计数法、LSD基数排序、MSD基数排序。 但LSD基数排序要求需排序字符串的长度一致;MSD基数排序虽然对字符串的长度没要求,但其递归循环里的每次循环都需要进行很多操作,且需要额外的空间。
阅读全文
字符串算法—字符串排序(上篇)
摘要:本文将介绍键索引计数法、LSD基数排序、MSD基数排序。 1. 字符串(String) 我们来简单回顾一下字符串。 众所周知,字符串是编程语言中表示文本的数据类型。它是一堆字符的组合,如 String S="String"。 我们可以知道字符串的长度:S.length()=6; 可以知道某个位置的字
阅读全文
图表算法—最短路径
摘要:1. 什么是最短路径(Shortest Path) 对于一个有向图(不了解有向图的,建议先看一下有向图),如果它的所有边都带有一定的数值(即带权),则会变成下面的样子 如果我们在点5,想去点6,应该怎么走最快?显然5-2-6这条路最短。这就是点5到点6的最短路径。 给定一个点,求这个点到所有其它点的
阅读全文
图表算法—最小生成树
摘要:1. 什么是最小生成树(Minimum Spanning Trees) 对于一个无向图,如果它的所有边都带有一定的数值(即带权),则会变成下面的样子 假设这些点都是城市,每个城市之间的连线代表城市间的道路,线上的数字代表着道路的长短。当然,修越长的道路就需要越多的资源。 那么如果要用最少的资源把所有
阅读全文
图表算法—有向图
摘要:1. 有向图(Directed Graphs) 有向图与无向图是很像的,如果对无向图不熟悉,建议先看一下无向图。 在讨论有向图的算法前,先讨论如何构建有向图。 构建有向图的方法基本与无向图的方法一模一样。 首先,有向图是长这样的: 也是有两个关键点: a. 这个有向图有哪些点 b. 哪些点可以通往哪
阅读全文
图表算法—无向图
摘要:1. 图表算法 本篇随笔写的是图表算法。图表可以大致分为两种:无向图和有向图。 无向图例子: 有向图例子: 从上述例子中可以看出,一个图表是由数个顶点和边组成的。 其中,无向图的边是没方向的,即两个相连的顶点可以互相抵达。 而有向图的边是有方向的,即两个相连的顶点,根据边的方向,只能由一个顶点通向另
阅读全文
搜索算法—哈希表
摘要:1.什么是哈希表(Hash Tables) 哈希表可以以极快的速度来查找、添加或删除元素(只需要数次的比较操作。)它比红黑树、二叉搜索树都要快得多。但是哈希表没有排序功能,类似的,如寻找最大值、最小值、中值这些行为都不能在哈希表中实现。 2.实现哈希表的前提条件 要想对一组元素做成哈希表形式的数据结
阅读全文
红黑树的删除
摘要:1.前文回顾 上一篇随笔写到了红黑树的实现及其各种功能的实现,本文将讲红黑树的删除。 上一篇随笔提到了二叉搜索树的删除功能在红黑树中虽然可以用,但会破坏红黑树的结构。 其实红黑树的删除功能是在二叉搜索树的删除功能上加上了重构结构的功能。因此,如果不熟悉二叉搜索树的删除功能和红黑树的,建议先看二叉搜索
阅读全文
搜索算法—红黑树
摘要:1.什么是红黑树(Red-BlackBalancedSearchTree) 红黑树本质上是二叉搜索树的改良版,因此,对二叉搜索树不了解的,建议先去看一下二叉搜索树。 二叉搜索树有个严重的缺陷:树本身并不平衡,很容易造成部分分支过长,而部分分支过短的情况,从而影响到了搜索速度。 二叉搜索树的一个极端例
阅读全文
搜索算法—二叉搜索树
摘要:1.什么是二叉搜索树(BinarySearchTrees) 如下图所示:15为树的根节点,10为15的左节点,20为15的右节点,下面的节点如此类推。 每个父节点都有两个子节点(子节点可能为空),左子节点比父节点小,右子节点比父节点大。 2.二叉搜索树的各种功能 一、节点 每个节点应该含有两个子节点
阅读全文
排序算法—堆排序
摘要:1.排序问题 现有一个含有N个数字的数组S,如何通过程序把这个数组变成有序的数组? 例如: 排序前:S:5,3,7,5,9,4,1,100,50 排序后:S:1,3,4,5,5,7,9,50,100 2.二叉堆(binary heaps) 进行堆排序前,需要先把数组排成二叉堆,故这里先介绍二叉堆。
阅读全文
快速排序改进——3区快速排序(3-way quicksort)
摘要:1.快速排序缺陷 快速排序面对重复的元素时的处理方法是,把它放在了左部分数组或右部分数组,下次进行分区时,还需检测它。如果需要排序的数组含有大量重复元素,则这个问题会造成性能浪费。 解决方法:新增一个相同区域,并把重复元素放进去,下次进行分区时,不对相同区域进行分区。 2. 3区快速排序(3-way
阅读全文
排序算法—快速排序
摘要:1.排序问题 现有一个含有N个数字的数组S,如何通过程序把这个数组变成有序的数组? 例如: 排序前:S:5,3,7,5,9,4,1,100,50 排序后:S:1,3,4,5,5,7,9,50,100 2.快速排序(Quicksort) 简单介绍: 快速排序内含一道重要的工序:分区(Partition
阅读全文
排序算法—归并排序
摘要:1.排序问题 现有一个含有N个数字的数组S,如何通过程序把这个数组变成有序的数组? 例如: 排序前:S:5,3,7,5,9,4,1,100,50 排序后:S:1,3,4,5,5,7,9,50,100 2.归并排序(merge sort) 不同于希尔排序,这里将介绍归并排序。 百度百科的定义:归并排序
阅读全文
排序算法—希尔排序
摘要:1.排序问题 现有一个含有N个数字的数组S,如何通过程序把这个数组变成有序的数组? 例如: 排序前:S:5,3,7,5,9,4,1,100,50 排序后:S:1,3,4,5,5,7,9,50,100 2.解决方法A 从第一项逐步读到最后一项。每读一项,便把它与之前读过的数字全部进行比较,并把它放在大
阅读全文
|
|
|