我想在M个不同的位置计算一个二元函数。二元函数的维数是D
,因此计算它的函数空间是指数2^D
(也就是说,它的输入都是[0,1]^D
“字符串”)。我希望它的计算在M
唯一/不同的点上,这些点均匀/随机地分布在输入空间中。如果我愿意,我知道如何生成所有的排列(本质上只是将0或1附加到所有之前已经计算过的排列上)。(伪)代码。但是,这是指数型的,我只需要一个分数M
点,而不是全部{
while i < n:
b_D = randomly_generate_bit_array_length(D) # simply selects each bit randomly with 1/2 prob of choosing 0 or 1.
if not b_n in HashTable[b_D]:
HashTable[b_D] = b_D
i++
然而,根据我得到的答案,here算法似乎是指数型的。如果我的算法的运行时间只是M
,而不是指数依赖于D的东西,有没有更好的方法来实现这一点?在
请注意,在我们有M
点之前尝试生成所有置换是不可接受的,因为我需要置换在二进制数组中随机分布。i、 如果我们从[0,0,...,0]
开始,然后生成[1,0,...,0]
直到得到{
要生成所有排列:
^{pr2}$
就像在评论中提到的,如果你使用你的
D=256
和M=120,000
那么你的generate random and filter碰撞实际上是O(MD),因为你根本不会有任何碰撞。在如果你想要大量的数组,你几乎只有机会发生碰撞。正如您可能从birthday paradox中了解到的那样,您需要大约sqrt(| space |)元素,以便有50%的几率发生任何碰撞。所以对于D=256,您需要询问M=2128=340282366920938463463374607431768211456数组。只有50%的机会发生任何碰撞。在
相关新闻:就在几天前the first public SHA-1 collision出版了。这仅仅是160位,许多非常聪明的人花了大量的时间和计算机能力来有意地发现一个碰撞。你真的没有任何实际机会意外地用256个随机位产生碰撞。在
相关问题 更多 >
编程相关推荐