我在IRE(信息检索和提取)课程中对数据进行索引。现在我不是在索引中存储术语,而是存储termID,它是对应于术语的映射。如果项的长度为15,则术语的大小为15字节,即120位,而如果我使用termID而不是term,那么我绝对可以将它存储在少于120位中。其中一种可能的方法是维护(term,termID)的字典,其中termID将来自1..n,其中n是术语的数量。这种方法的问题是:
我可以创建一个以术语作为输入并返回O(1)中的映射(加密)的函数吗?如果碰撞很少就可以了(只是猜测一些碰撞以换取速度和记忆是一个很好的权衡.BTW我不知道它会对我的搜索结果产生多大的影响。)
还有其他更好的方法吗?
答案 0 :(得分:0)
我认为你已经或多或少地给出了答案,说“如果发生一些碰撞就没关系”。诀窍是散列。您可以先减少搜索字词中的“字符数”。例如,丢弃数字和特殊字符。之后,您可以合并大写和小写字符。最后,您可以应用一些简单的替换,例如取代德国übeiue(实际上是原产地)。这样做之后你可能会......像32bit。然后,您可以在单个字节中表示四个字符的字符串。如果为每个单词保留4个字节,则需要处理较长的单词。在那里你基本上可以使用每个4字节块的xor
。
另一种方法是为字典做一些混合操作。如果你只为10k最常用的单词构建一个字典,你很可能已经覆盖了大部分文本。因此,您只需要将字典的一部分保留在内存中,而对于大多数单词,您可以在硬盘上使用字典,甚至可以忽略它们。