【问题标题】:Time complexity of a randomized algorithm for finding a frequently-occurring element?用于查找频繁出现的元素的随机算法的时间复杂度?
【发布时间】:2013-11-09 12:29:26
【问题描述】:

我总是无法分析随机算法的运行时间。如果有人可以向我解释这一点,我将不胜感激。

以我写的以下代码为例;

它检查数组中至少出现 n/4 次的元素。 (n 是数组的大小)。它从数组中选择一个随机数,检查它是否出现 n/4 次。如果是,它会返回它。否则它会删除所有出现的元素并继续。

假设数组中至少有一个这样的元素至少出现 n/4 次。

elements_left = n ;

    frequency ( A[] )
      {
        k -> pick a random element from A[] ;
        int count = 0;
        int delete_count = 0;

        for (i=0 ; i < elements_left ; i++)
          {  
            if (a[i] = k)
                count++ ;
          }

        if (count >= n/4)
            return A[i] ;
            exit ;

        else
          {
            for (i=0 ; i < elements_left ; i++)
              {  
                if (A[i] = k)
                    delete (A[i]) ;
                    delete_count ++ ;
              }

            elements_left = n - delete_count ;
          }

        frequency (A[])
      }

该算法的最坏情况运行时间和预期运行时间是多少,您将如何推导出它?

谢谢。

【问题讨论】:

    标签: performance algorithm random big-o time-complexity


    【解决方案1】:

    思考这个问题的一种方法如下:在算法的每次迭代中,您将做 O(n) 工作来检查您随机选择的元素是否是您想要的元素。如果是这样,你就完成了。如果没有,您需要做一些工作以从数组中删除该元素的所有其他副本。您上面的伪代码并没有真正指定您如何删除它们(我不知道这意味着删除单个数组元素),但我假设运行时是 O(n),因为可以删除那个时间元素的所有副本。

    现在的问题是,按照预期,需要多少轮才能找到元素?由于该元素有 1/4 的概率被选中,因此预计需要 4 次尝试才能找到它。每次尝试都会做 Θ(n) 工作 - 总元素总数在 n/4 和 n 之间 - 因此运行时间将是 Θ(n) 的期望值(Θ(n) 的四次迭代工作。)

    希望这会有所帮助!

    【讨论】:

    • 你能解释一下'每次尝试都 Θ(n) 工作 - 总有 n/4 和 n 个元素之间'这行吗?你所说的预期是什么意思?
    • @AbhijitBadjatya-“预期”一词与“平均”同义。当您谈论平均案例分析时,您正在查看运行时的预期值。此外,如果某个数组元素出现 n/4 次或更多次,则该算法在删除错误选择的元素时永远不会将数组的大小减小到 n/4 以下,因此数组大小始终在 n 之间(在开始时) ) 和 n/4 (在最坏的情况下,如果所有的选择都不好。)
    【解决方案2】:

    templatetypedef's answer 描述了一个元素出现 n/4 次的情况。

    最坏情况的运行时间是 O(n^2),如果所有项目都是唯一的,就会发生这种情况。

    平均情况很难确定。假设数组包含 100 个项目。除了一个出现 15 次之外,所有的都是唯一的。因此,您必须进行至少 40 次递归调用才能删除足够的项目,以使该单个项目作为结果返回。但是在第一次迭代中,您将有 15/100 的机会删除最常见的项目。下次有 15/99 的机会等时。很有可能(几乎可以肯定)当您进行 40 次选择时,您会选择最常见的项目并将其从数组中删除。

    所以,如果你知道有一个元素出现了 n/4 次,那么预期的运行时间是 O(n)。否则运行时间高度依赖于项目的分布,最坏情况下的运行时间为 O(n^2)。

    【讨论】:

    • 这很有帮助。如果我不从数组中删除元素,你能解释一下复杂性会如何变化吗?相反,我只检查随机元素是否出现 n/4 次,如果它没有继续选择下一个随机元素。
    • 如果选择不成功后不删除元素,那么在没有元素出现n/4次的情况下,算法永远不会终止。如果有一个元素至少出现 n/4 次,那么算法仍然是 O(n)。
    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 2014-12-11
    • 2017-04-12
    • 2021-07-08
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多