随机算法
对于一个算法,它的平均执行速度很快,但很可能存在一些特定的输入,使得算法效率很低。如果这样的输入经常出现,那么算法的实际执行效率就会低于期望的效率。为了避免这样的情况,我们常常采用随机算法。
不失一般性地,假设给定一个数组 A,包含元素 1~n,我们讨论如何构造 A 的随机排列。
注意:我们让随机发生在算法上,而不是在输入分布上。
Permute-By-Sorting
一个通常的方法是:
- 为数组的每个元素 A[i] 赋一个随机的优先级 P[i],
- 然后依据优先级对数组 A 中的元素进行排序。
1 | import random |
这种随机算法的时间复杂度取决于排序算法的选择。如果采用的是归并、快排,那么时间复杂度可以达到 **O(n·lgn)**。
Randomize in Place
产生随机排列的更好方法是:原址排列给定数组。
过程如下:
- 在进行第 i 次迭代时,元素 A[i] 是从元素A[i] 到 A[n] 中随机选取的。
- 且第 i 次迭代以后, A[i]不再改变。
1 | import random |