什么是随机算法?
使用随机数来决定下一步在逻辑中要做什么的算法称为随机算法。例如,在随机快速排序中,我们使用一个随机数来选择下一个枢轴(或者我们随机地对数组进行随机排序)。在Karger的算法中,我们随机选择一条边。
如何分析随机算法?
一些随机算法具有确定性的时间复杂度。例如,Karger算法的此实现的时间复杂度为O(E)。这种算法称为“蒙特卡洛算法”,在最坏的情况下更易于分析。
另一方面,其他随机算法(拉斯维加斯除外)的时间复杂度取决于随机变量的值。这种随机算法称为拉斯维加斯算法。通常针对预期的最坏情况对这些算法进行分析。为了计算最坏情况下的预期时间,最坏情况下需要考虑所使用随机变量的所有可能值,并且需要评估每个可能值所花费的时间。所有评估时间的平均值是预期的最坏情况下的时间复杂度。以下事实通常有助于此类算法的分析。
期望线性
到成功为止的预期试用次数。
例如,下面考虑QuickSort的随机版本。
中心枢轴是这样一种枢轴,它以使一侧至少有1/4个元素的方式划分阵列。
// Sorts an array arr[low..high]
randQuickSort(arr[], low, high)
1. If low >= high, then EXIT.
2. While pivot 'x' is not a Central Pivot.
(i) Choose uniformly at random a number from [low..high].
Let the randomly picked number number be x.
(ii) Count elements in arr[low..high] that are smaller
than arr[x]. Let this count be sc.
(iii) Count elements in arr[low..high] that are greater
than arr[x]. Let this count be gc.
(iv) Let n = (high-low+1). If sc >= n/4 and
gc >= n/4, then x is a central pivot.
3. Partition arr[low..high] around the pivot x.
4. // Recur for smaller elements
randQuickSort(arr, low, sc-1)
5. // Recur for greater elements
randQuickSort(arr, high-gc+1, high)
在我们的分析中重要的是,步骤2花费的时间为O(n)。
找到中央支点之前,while循环运行了多少次?
随机选择的元素是中心枢轴的概率为1 / n。
因此,while循环运行的预期次数为n(有关详细信息,请参见此内容)。
因此,步骤2的预期时间复杂度为O(n)。
最坏情况下的整体时间复杂度是多少?
在最坏的情况下,每个分区对数组进行分割,以使一侧具有n / 4个元素,另一侧具有3n / 4个元素。递归树的最坏情况高度是Log 3/4 n,即O(Log n)。
T(n) < T(n/4) + T(3n/4) + O(n)
T(n) < 2T(3n/4) + O(n)
Solution of above recurrence is O(n Log n)
请注意,上述随机算法不是实现随机快速排序的最佳方法。这里的想法是简化分析,因为它很容易分析。
通常,随机快速排序是通过随机选择一个枢轴(无循环)来实现的。或通过改组数组元素。预期该算法在最坏情况下的时间复杂度也是O(n Log n),但是分析很复杂,麻省理工学院教授本人在这里的演讲中也提到了这一点。
随机算法|第2组(分类和应用)
参考:
http://www.tcs.tifr.res.in/~workshop/nitrkl_igga/randomized-lecture.pdf