我可以将字符串编码为整数,以保留字典字符串的接近度吗?

时间:2011-11-25 18:28:06

标签: algorithm hash hashcode

我想将不同长度的字符串(通常为1-100个字符)编码为整数,使得字典相似的字符串(它们在字典中将它们靠近在一起)产生紧密排列的整数,同时进一步确保这些整数在可能的整数值范围内合理均匀分布。

我认识到确保均匀分布可能需要在编码之前对可能的字符串进行某种调查。

有没有人对如何做到这一点有任何想法?

4 个答案:

答案 0 :(得分:3)

一般方法是使用字符串中的前n个字符,必要时使用零字节填充,作为整数。相应地减少你的字母表,你应该实现相当密集的包装。例: 假设您的输入字母表是Base64,其中/表示字符串的结尾。你将字符串'word /'哈希  通过将整数的六个最高位设置为48,接下来的六到40,依此类推。填充两个零,并且您有一个32位整数的精确表示。

按字典顺序排列的单词将具有相似的开头,从而具有相似的最重要位。

当然,超过5个字符的单词会发生哈希冲突,但这是无法避免的。

答案 1 :(得分:2)

压缩密钥在这里可能很有用。我们的想法是比较一组字符串并删除所有相似的位。它产生一组几乎唯一的键,小到足以适合整数。见"FAST: Fast Architecture Sensitive Tree Search on Modern CPUs and GPUs"的第6章。

所描述的算法并不总是保留字典顺序,但可以进行扩充以实现它。

修改

更一般的方法是将字符串字符拆分为独立部分(如果可能),然后确定这些部分的概率,并应用arithmetic coding

<强> EDIT2

为了在压缩密钥中加入更多的字符串,可能更喜欢使用某种entropy encoding,其中字符的编码涉及几个但不超过1 ... 2个字符的值(改进)压缩性太大会降低性能)。或者,如果整数键应足够短(如16位),最好使用熵方法预先计算所有键并将它们放入按字符串排序的集合中;在这种情况下,编码前缀可能会更长。

答案 2 :(得分:1)

您的要求非常紧张。如何使用最小的完美哈希函数?这确保了如果您按字典顺序给出字符串:

s1 < s2 < s3 < s4 < ... < sN

它们将被映射到[0..N-1]范围内的连续整数。见这些文件:

http://didawiki.cli.di.unipi.it/lib/exe/fetch.php/magistraleinformaticanetworking/ae/ae2010/01_appoggiomg-minordhash.pdf

http://vigna.dsi.unimi.it/ftp/papers/MonotoneMinimalPerfectHashing.pdf

答案 3 :(得分:1)

这是不可能的。假设您想出了一些函数来将字符串映射到整数。然后假设您将第一个输入字符串s1映射到整数i1,并将第二个输入字符串s2映射到i2。问题在于随后的输入字符串。你只有| i2 - i1 |的空间更多输入字符串介于s1和s2之间。但是没有办法保证你不会收到超过| i2 - i1 |落在s1和s2之间的字符串,至少不是实际的(对于单个案例的字符串最多100个字符,你必须使用大约26 ^ 100的整数)。