📜  随机算法|第一组(介绍和分析)

📅  最后修改于: 2021-04-23 17:53:57             🧑  作者: Mango

什么是随机算法?

使用随机数来决定下一步在逻辑中要做什么的算法称为随机算法。例如,在随机快速排序中,我们使用一个随机数来选择下一个枢轴(或者我们随机地对数组进行随机排序)。在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