首先,让我们做出两个可能显而易见但重要的假设:
_.random_item
可以选择最后一个位置。
_.random_item
选择概率为每个位置。1n+1
为了证明算法的正确性,您需要一个类似于此处使用的归纳参数:
- 对于单例列表,只有一种可能性,因此统一选择它。
- 假设从所有排列中均匀选择了元素的列表,则表明均匀选择了通过您的技术获得的元素的列表。nn+1
从这里开始,证明是错误的。请参阅下面的正确证明;我将其保留在此处,因为错误和后续步骤(正确的步骤)都可能具有教育意义。
派生必须保留的局部(即逐元素)属性很有用,因为争论整个置换过程很痛苦。观察到,如果每个元素在每个位置的概率均等,即均匀选择一个排列,即
∀π∈PermnPr(L=π)=1n!⟺∀i=1n ∀j=1nPr(Li=j)=1n(1)
其中并且为了简化符号,我们假设将插入列表中。n=|L|{1,…,n}
现在,让我们看看您的技术在插入第 st元素时的作用。我们必须考虑三种情况(在交换之后):n+1
- 列表中未交换的元素之一,即和i∈{1,…,n}j∈{1,…,n}
- 列表中的元素之一被交换,即和i=n+1j∈{1,…,n}
- 新元素,即和i∈{1,…,n+1}j=n+1
对于每种情况,我们计算元素在位置的概率;所有结果都必须是(由于而已足够)。令是前元素之一在旧列表中的任何位置(归纳假设)的概率,而的概率为(假设1、2)选择的任何职位。请注意,具有元素的列表的coice 和选择交换位置是独立的事件,因此联合事件的概率因子,例如ji1n+1(1)pn=1nnps=1n+1random_item
n
Pr(Li=j,i swapped)=Pr(Li=j)⋅Pr(i swapped)=pnps
对于。现在进行计算。i,j∈{1,…,n}
我们只考虑旧的元素。当且仅当该元素在上一次插入之前在位置并且未选择作为交换位置时,该元素在位置处 njii
Pr(Li=j)=pn(1−ps)=1n⋅nn+1=1n+1。
在这里,我们认为一个旧元素被交换到最后一个位置。元素可能在任何旧位置上,因此我们对在位置上的所有概率求和,然后选择作为交换位置,即jjii
Pr(Ln+1=j)=∑i=1npnps=∑i=1n1n⋅1n+1=1n+1
ii
Pr(Li=j)=ps=1n+1
事实证明,您的插入策略确实可以保持一致性。通过归纳的力量,证明您的算法创建了均匀分布的排列。
警告:如果插入的元素不是成对的,则此证明将失效。可区分的,因为那时第一个方程不再有效。但是您的算法仍然有效;每个重复的排列都是由相同数量的随机执行产生的。您可以通过标记重复项(即使它们可区分)来证明这一点,执行上述证明并去除标记(实际上);最后一步是将大小相等的排列组合折叠为相同的排列。
(1)
random_item
L(k){1,…,k}
π′∈Permn+1{1,…,n+1}
π′=(π(1),π(2),…,π(i−1),n+1,π(i+1),…,π(n),π(i))
π∈Permni∈{1,…,n+1}Pr(L(n)=π)=1n!random_item
i1n+1πi
Pr(L(n+1)=π′)=Pr(L(n)=π)⋅Pr(i swapped)=1(n+1)!
我们必须证明。通过归纳的力量,证明您的算法创建了均匀分布的排列。
- {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140