泡泡洗牌-加权洗牌

可以设想对冒泡排序进行修改,其中“交换”以概率随机发生p,而不是通过执行比较。结果可以称为“泡沫洗牌”。靠近前面的元素可能会保留在那里,但有机会移到列表的后面。

修改从互联网上窃取的冒泡排序,您可以想出以下内容:

import random

def bubble_shuffle(arr, p):
    arr = copy.copy(arr)
    n = len(arr) 
  
    # Traverse through all array elements 
    for i in range(n-1): 
    # range(n) also work but outer loop will repeat one time more than needed. 
  
        # Last i elements are already in place 
        for j in range(0, n-i-1): 
  
            # traverse the array from 0 to n-i-1 
            # Swap if random number [0, 1] is less than p
            if random.random() < p:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

这个算法是 n 平方阶的……但是一个元素出现在任何特定位置的概率应该是可以提前计算的,所以它不需要“n 平方”。有没有更有效的方法可以采取?

我考虑过从几何分布中采样并将其添加到原始索引中(​​加上(len(n)-i-1)/len(n)打破平局),但这并没有给出相同的动态。

以上是泡泡洗牌-加权洗牌的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>