散列函数,在同一个存储桶中散列类似的字符串

时间:2010-08-06 10:14:50

标签: string hash similarity

我正在搜索“坏”哈希函数: 我想散列字符串并将相似的字符串放在一个桶中。

你能给我一个暗示从哪里开始我的研究吗? 一些方法或算法名称......

2 个答案:

答案 0 :(得分:3)

你的问题并不容易。两个想法:

此解决方案可能过于复杂,但您可以尝试傅里叶变换。将输入文本视为函数的一系列样本,然后运行傅里叶变换将输入转换为频域。低频部分是文本的一般要点,高频部分是微小的变化。

这有点类似于jpeg压缩的作用:扔掉细节,然后留下重要的东西。如果你有两个几乎完全相同的图像并且jpeg大大压缩它们,你通常会获得相同的输出。

pHash使用与此类似的方法。

同样,这将是一个非常复杂的方法。

第二个想法:minHash

minHash的想法是,当输入相同时,你选择一些可能相同的标记。然后计算所有标记输出的向量。如果两个输入具有相似的矢量,则输入相似。

例如,计算文本中“the”一词出现的次数。如果它是偶数,0,如果它是奇数,1。现在计算“数学”这个词在文本中出现的次数。同样,0表示偶数,1表示奇数。这样做很多话。

现在您处理所有文本,每个文本都会输出“011100010101”等输出。如果两个文本相似,则它们将具有相似的输出字符串,仅相差1或2位。您可以使用多变量分区trie(MVP)有效地搜索输出。

这也可能对你的问题有点过分。

答案 1 :(得分:-1)

这取决于“类似字符串”的含义?

但是如果你找到这么糟糕的那个,你必须自己构建它。

示例:

  • 你可以创建10个桶(0到9) 并按照他们的长度对字符串进行分组 mod 10

  • 使用 strcmp()之类的函数,并按照与定义的字符串的差异对它们进行分组