应该使用什么数据结构来存储重复单词的大句子(可能是数百万字)

时间:2015-06-11 14:26:05

标签: algorithm data-structures

我遇到了一个问题。 有一句话(比方说包含数百万字)和单词是重复的(例如句子是:"我的名字是ram,我的名字是shyam,ram是工程师,shyam也是工程师"依此类推)。

目标是:

  1. 应该有效地使用内存(单词应该只存储一次)
  2. 必须从数据结构中重新构造句子。
  3. 有人可以建议哪种数据结构最适合此要求。

3 个答案:

答案 0 :(得分:2)

如果这些是唯一的要求,我会使用一个简单的字节数组。

关键是预处理和后处理。作为预处理器,我将使用一个好的串压缩器,如GZIP或7z。正如您所料,后处理器只会解压缩数据。

答案 1 :(得分:0)

由于您只能存储一次单词,因此自然的解决方案是将每个唯一单词存储一次,并列出每个单词出现的索引。我会使用某种哈希表将字符串映射到无符号积分列表(数据类型中的字节数取决于文本的长度),积分是每个单词的位置。

答案 2 :(得分:0)

一种可能的方法是使用这三种数据结构:
1)整数向量(比如V1),用于存储V2中的单词索引 2)字符串的矢量(比如V2),用于存储不同的单词
3)用key = string和data = integer(比如M)映射,检查当前单词是新的还是已经出现,如果已经出现,则指向V2中的索引

存储步骤:
1)从句子中提取单词
2)检查地图M中是否已存在该词 - > 2.1)如果存在,获取该密钥的数据值并存储在索引中 - > 2.2)如果不存在,则在V2的末尾插入并获取索引,并在M中将索引存储为一对 3)将索引存储在V1的末尾 4)如果句子没有结束转到1)

重建的步骤:
创建空字符串数据结构以存储句子
1)从V1读取整数并存储在索引中 2)将 index 的V2字符串附加到 string
3)从开始到结束的顺序重复V1中的每个整数

注意:要处理空格,换行符等特殊字符,请将它们视为单独的单词。