首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Minhash实现如何查找用于排列的散列函数

Minhash实现如何查找用于排列的散列函数
EN

Stack Overflow用户
提问于 2013-09-24 16:50:51
回答 2查看 3.9K关注 0票数 5

我在实现minhashing时遇到了问题。在纸上和阅读中,我理解了这个概念,但我的问题是排列“技巧”。不是排列集合和值的矩阵,而是建议实现:“选择k(例如100)个独立的散列函数”,然后算法说:

代码语言:javascript
复制
for each row r 
    for each column c 
        if c has 1 in row r 
           for each hash function h_i  do
            if h_i(r) is a smaller value than M (i, c) then
            M(i, c) := h_i(r)

在不同的小示例和教学book中,他们只使用两到三个形式的散列函数(h = a*x +b mod p)。这很容易找到,但在实践中,我如何才能找到100个这样的独立函数呢?

在Java示例here中,只有一个散列函数生成的散列值,而不是多个散列函数,独立于行索引。区别在哪里?我现在的问题是如何找到这些独立的散列函数,或者如果只有一个散列函数的方法,如何在算法中处理这些值?

EN

回答 2

Stack Overflow用户

发布于 2013-10-09 04:10:34

一种简单的方法是使用参数散列族,如表散列函数(http://en.wikipedia.org/wiki/Tabulation_hashing)

在本书的示例(a*x+b mod p)中,通过选择不同的(a,b,p)集合,您可以拥有不同的散列函数。获得独立哈希函数的一种方法是选择(a,b,p)素数/联合素数,并且最好是大数字

票数 1
EN

Stack Overflow用户

发布于 2017-09-26 09:19:00

根据iampat的回答,您可以使用表格散列(http://en.wikipedia.org/wiki/Tabulation_hashing)。

另一个产生良好结果的非常有效的选择是使用单个高质量的散列函数(例如FNV_1a)来生成主散列,然后使用100种不同的异或和位数组合对其进行修改。

要生成每个散列,您需要获取主散列,按给定的距离对其进行位滚动,然后将其与给定值进行异或。对于100个散列函数中的每一个,随机选择bitroll和XOR值。有关详细信息,请参阅this discussion

有些人建议使用乘法而不是XOR,在这种情况下,您可能希望选择质数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18976924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档