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

Algorithm 应该使用什么样的数据结构来存储重复单词的大型句子(可能是数百万个单词),algorithm,data-structures,Algorithm,Data Structures,我遇到一个问题。 有一个句子(假设包含数百万个单词)和重复的单词(例如,句子是:“我的名字是拉姆,我的名字是希亚姆,拉姆是一名工程师,希亚姆也是一名工程师”等等) 目标是: 内存应得到有效利用(单词只能存储一次) 句子必须能够从数据结构中重新构造 有人能建议什么样的数据结构最适合这个要求吗。如果这些是唯一的要求,我会使用一个简单的字节数组 关键在于前处理和后处理。作为预处理器,我将使用一个好的字符串压缩器,如GZIP或7z。正如您所期望的那样,后处理器只会解压缩数据。因为一个单词只能存储一次,自

我遇到一个问题。 有一个句子(假设包含数百万个单词)和重复的单词(例如,句子是:“我的名字是拉姆,我的名字是希亚姆,拉姆是一名工程师,希亚姆也是一名工程师”等等)

目标是:

  • 内存应得到有效利用(单词只能存储一次)
  • 句子必须能够从数据结构中重新构造

  • 有人能建议什么样的数据结构最适合这个要求吗。

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


    关键在于前处理和后处理。作为预处理器,我将使用一个好的字符串压缩器,如GZIP或7z。正如您所期望的那样,后处理器只会解压缩数据。

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

    一种可能的方法是使用这三种数据结构:
    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) 将索引处V2的字符串追加到字符串
    3) 按从开始到结束的顺序对V1中的每个整数重复执行


    注意:要注意空格、换行符等特殊字符,请将它们作为单独的单词计算

    恰恰相反。它将占用很少的空间,实际上几乎是任何普通字符串所能获得的最小空间。我们不想压缩和解压缩。让原始数据存储在内存中。@KaushalendraMishra您希望编辑您的问题并说明该要求,因为在一般情况下,这种方法将占用尽可能少的内存。@oleksii认为是消耗输入流,而不是加载所有内容。看来情况并非如此。似乎这更像是一个编程练习,而不是获得最佳效果solution@KaushalendraMishra考虑到这两个要求,压缩/解压缩正是正确的做法。但是你不喜欢这个解决方案,这对我来说意味着,除了(1)将它存储在一个小空间中和(2)能够重建它之外,你还需要对这个句子做其他事情。例如,您可能希望能够回答关于一个单词出现多少次的查询,或者搜索它以查找子字符串。如果是的话,应该提到这些用途。