algorithm - 存储 URL 列表的有效方法

标签 algorithm data-structures finite-automata compression

我需要存储万亿个 URL 列表,其中每个 URL 列表将包含约 50 个 URL。 将它们压缩以进行磁盘存储的最节省空间的方法是什么。

我在考虑先删除无用的信息,如“http://”,然后构建一个最小的有限状态自动机并保存它。

另一种选择是构建一个逗号分隔的 URL 字符串,并使用 GZIP 或 BZ2 等常规压缩方式压缩该字符串。

如果我不关心速度,哪种解决方案会产生最佳压缩效果。

最佳答案

考虑到 URL 的数量以及它们中的大多数使用或多或少相同的结构和命名模式这一事实,我会选择使用索引和分词器。 首先使用分词器收集尽可能多的单词并将它们保存在索引中。然后,您可以用列表中的索引替换每个标记:

http://www.google.com/search?q=hello+world (42 bytes)== 会给你

http://=> 1 万维网。 => 2 google.com => 3 搜索 => 4 你好 => 5 世界 => 6

URL 将变为:1,2,3,'/',4,'?','q','=',5,'+',6

鉴于许多 URL 将是一个公共(public)大域的子域,并且其中大多数将使用相同的常用英语单词(想想所有关于我们的页面或职业...),您可能会结束建立一个不太大的索引(英语中大约有 50000 个常用词,法语中有 70000 个)。

然后您可以压缩索引和标记化的 URL 以获得更多空间。

解析 URL 和构建索引的算法复杂度为 O(n) 和 O(nlogn)。

关于algorithm - 存储 URL 列表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22259381/

相关文章:

algorithm - 内存分配器的 "killer adversary"?

algorithm - 寻找唯一的(只出现一次)元素haskell

open-source - 自动机设计软件

python - 在Python中的圆圈内插入文本

algorithm - 如何用 8 个字符将当前日期和时间表示为最接近的秒数?

JavaScript 按值过滤

java - 表示多对多关系的数据结构

c++ - 建立索引 : Copies or pointers?

compilation - 为什么在 NFA 中使用 epsilon 转换?

javascript - 动态规划 : Code Wars: twice linear: algorithm times out