Cryptography 将单词映射到数字

Cryptography 将单词映射到数字,cryptography,information-retrieval,Cryptography,Information Retrieval,我在IRE(信息检索和提取)课程中做数据索引。现在,我存储的不是索引中的术语,而是对应于术语的映射termID。如果术语的长度为15,则术语的大小为15字节,即120位,而如果我使用termID而不是term,则我肯定可以将其存储在120位以下。一种可能的方法是维护(术语,termID)的字典,其中termID的值为1..n,其中n是术语的数量。这种方法的问题是: 我必须将这本字典保存在ram中,字典大小可以是GBs 要查找与术语对应的termID,需要O(log(n)),其中n是字典中的术语数


我在IRE(信息检索和提取)课程中做数据索引。现在,我存储的不是索引中的术语,而是对应于术语的映射termID。如果术语的长度为15,则术语的大小为15字节,即120位,而如果我使用termID而不是term,则我肯定可以将其存储在120位以下。一种可能的方法是维护(术语,termID)的字典,其中termID的值为1..n,其中n是术语的数量。这种方法的问题是:

  • 我必须将这本字典保存在ram中,字典大小可以是GBs
  • 要查找与术语对应的termID,需要O(log(n)),其中n是字典中的术语数
  • 我可以做一个函数,将一个术语作为输入,并返回O(1)中的映射(加密)吗?。如果有一些冲突也没关系(只是猜测在速度和内存交换方面的一些冲突是一个很好的权衡。顺便说一句,我不知道这会对我的搜索结果产生多大影响)


    还有其他更好的方法吗?

    我想你已经或多或少地给出了答案,说“如果有一些碰撞就可以了”。诀窍是散列。您可以先减少搜索词中的“字符”数。例如,删除数字和特殊字符。之后,您可以合并大写和小写字符。最后,您可以应用一些简单的替换,例如,替换德文übei ue(实际上是源代码)。这样做之后,你可能会得到像32位这样的东西。然后可以在单个字节中表示一个四个字符的字符串。如果为每个单词保留4个字节,则需要处理较长的单词。在那里,您基本上可以求助于
    xor
    每个4字节块

    另一种方法是为字典做一些混合的事情。如果你只为10k个最常用的单词编一本词典,你很可能已经涵盖了大部分文本。因此,您只需要将词典的一部分保存在内存中,而对于大多数单词,您可以在hardisc上使用词典,甚至可以忽略它们