我正在阅读这篇论文(第 3 页和第 8 页):http ://acl.ldc.upenn.edu/P/P05/P05-1077.pdf其中定义了一个置换函数来生成签名的置换。签名是一串位,如“1001”
它将置换函数定义如下:
但是,当我应用它时,它不起作用。假设我有字符串“1001”,它的索引是 {0,1,2,3}。目的是使索引排列为例如 {2,3,0,1}。设 p = 7, a = 1 和 b = 2。现在我需要排列索引:
pi(0) = (0+2) mod 7 = 2
pi(1) = (1+2) mod 7 = 3
pi(2) = (2+2) mod 7 = 4 <<<<<< 这里问题开始了,因为它生成了一个超出索引空间的错误值
pi(3) = (3+2) mod 7 = 5 <<<<<< 这里也一样
所以我最终得到了新的索引 {2,3,4,5} 这是无效的,因为我首先没有 4 和 5 作为索引。
我的解决方案有什么问题?难道我做错了什么?
我在 stackoverflow 上看到过生成字符串所有排列的帖子。但我想使用特定的排列函数生成一个排列。因为我想对多个字符串使用相同的置换函数。然后我希望能够使用不同的参数创建另一个置换函数,并将新的置换函数应用于同一组字符串/签名。
编辑:我在python中发现这段代码应用了相同的想法,但不幸的是我以前从未使用过python,所以我希望有人能看到有什么不同:
class Permutation(object):
def __init__(self, maximumValue):
if not isPrime(maximumValue): raise Exception('Maximum value should be prime')
self.p, self.a, self.b = maximumValue, random.choice(range(maximumValue)[3::2]), random.choice(range(maximumValue))
def applyFunction(self, x): return (self.a*x+self.b)%self.p
def __eq__(self, other): return self.a==other.a and self.b==other.b and self.p==other.p
def __str__(self): return 'p: %s, a: %s, b: %s'%(self.p, self.a, self.b)
代码来自这里:https ://github.com/kykamath/streaming_lsh/blob/master/streaming_lsh/classes.py