发掘双数组Trie (Double Array Trie)的能力

阅读更多关于《发掘双数组Trie (Double Array Trie)的能力》

描述 Double Array Trie 的文章有很多,我在这里从另一个视角来讲 Double Array Trie。首先,是 base 和 check 的更深层含义,然后再详细说一下由此引申出来的问题。 继续阅读

AC 自动机的实现

阅读更多关于《AC 自动机的实现》

关于 AC 自动机,有太多的文章在讲述它的原理,讲述者借此来展示自己的算法能力。但其实AC自动机的原理很简单,真正困难的地方在于一个高效的实现!对于任何一个基础算法,一个好的实现都要尽量满足:

* 速度快 这几点排名不分先后
* 内存小
* 接口灵活、通用
* 使用简单、易上手

继续阅读

一个模式识别问题

阅读更多关于《一个模式识别问题》

任意两个字符串 s, t,如果能找到一种替换方式,对 t 中的每个字符 a ,用 s 中的一个字符 b 替换,最后得到一个字符串 t’,如果 t’ 与 s 相同,用符号计作 s->t;如果 s->tt->s,我们称 s 与 t 等价。

例如,下面 4 个字符串就是(互相)等价的: 继续阅读

binary tree walk

阅读更多关于《binary tree walk》

简单,优美,的代码,你能看出来哪些是二叉树的后序、前序、中序遍历吗?你还知道二叉树有什么遍历方法? 继续阅读

搜索引擎关键字智能提示的一种实现(原网页的备份)

阅读更多关于《搜索引擎关键字智能提示的一种实现(原网页的备份)》

美团原网页:

http://tech.meituan.com/pinyin-suggest.html

对比我们的纠错算法,美团的这个算法正好是一个反面教材,它集中展现了互联网时代糙快猛的核心价值观,以下是它的原文备份:


问题背景

搜索关键字智能提示是一个搜索应用的标配,主要作用是避免用户输入错误的搜索词,并将用户引导到相应的关键词上,以提升用户搜索体验。 继续阅读

原地排序-更简洁的算法

阅读更多关于《原地排序-更简洁的算法》

在我以前的这篇文章中:原地排序与链表翻转

解决这个问题是先把链表翻转,然后再循环左移,原理是清楚了,可是稍显繁琐。今天得知该问题的另一个解法: 继续阅读

原地排序与链表翻转

阅读更多关于《原地排序与链表翻转》

有个长度为 n 的 (key,val) 数组 a,其中 key 是 int 类型,并且其值在 [0, n) 之间(前闭后开,包括 0 不包括 n),该数组按 key 是乱序的,但没有重复 key。

题目要求:对 a 原地按 key 排序,可以使用常数个临时变量,不允许使用其它额外空间,时间复杂度必须是O(n) 继续阅读

m 分查找

阅读更多关于《m 分查找》

一个比较产生两个决策结果,二-决策的计算机硬件实现更高效。

我们可以想象给一个 array, 一个 key, 在某台 god machine 上有一个操作:cmp-multi  array, key, n, m

继续阅读

排列的分解

阅读更多关于《排列的分解》

离散数学里面大家都学过群,群里面有种很基本并且很重要的叫做置换群,置换群的元素本质上就是一个排列(英文 permutation group, 直译过来应该是排列群)。大家应该都学过当初要把 (4 1 5 2 3) 分解成 (1 4 2)(3 5),这个叫做群的 k-cycle 分解,也就是说,一个排列(置换群的一个元素)可以 继续阅读

穷举搜索

阅读更多关于《穷举搜索》

对于一些困难的问题,我们只能穷举(brut force)搜索,是的,我们知道“穷举搜索”这个词,可是,具体怎么穷举呢?

很多问题可以归结到图的搜索,对于图的搜索,大家应该都知道 DFS 和 BFS, 继续阅读