【问题标题】:Worst Case Complexity for Pseudocode伪代码的最坏情况复杂性
【发布时间】:2015-03-10 20:35:15
【问题描述】:

我们有以下伪代码来查找数组中的kth 最小数。

partition(A, begin, end)
   x = A[end]
   i = begin – 1
   for j = begin to end – 1
      if A[j] <= x
         i = i + 1
         swap(A[i], A[j])
         swap(A[i + 1], A[end])
   return i + 1

select(A, begin, end, k)
   m = partition(A, begin, end)
   s1 = m – begin
   s2 = end – m
   s = s1 + s2 + 1
   if s1 >= k
      return select(A, begin, m – 1, k)
   else if s – s2 == k
      return m
   else
      return select(A, m + 1, end, k – s + s2)

swap() 函数只是以引用传递的方式交换它的参数,并且它需要恒定的时间。对于长度为 n 的数组,big-O 表示法中最坏情况下的复杂度可能是多少?

【问题讨论】:

  • 看起来像家庭作业。回答不会有帮助。并且需要猜测,因为这不是我所知道的编程语言。
  • 到目前为止你的分析是什么?
  • 提示:每个select() 直接执行一个partition()。一些select()s 递归。 partition() 的最坏情况成本是多少,可以达到的最大递归深度是多少?
  • 在最坏的情况下,select 可以递归到大端(大减端)然后它停止。在这种情况下,每个选择都会进行分区。我可以错吗?我认为最大深度是 N。

标签: performance algorithm big-o


【解决方案1】:

大 O 表示法很简单,因为它可以让您大致了解复杂性,当然是基于最坏的情况。

当你对事物进行分区时,通常意味着你有 O log(n),当你查看时意味着你有 O n,当你有嵌套循环时,你将有 O n^x,其中 x 是数量在嵌套循环中,2 个循环意味着 O n^2,三个循环意味着 O n^3,依此类推。检查您的伪代码中的案例,您将得到答案。

我可能是错的,但我看到在最坏的情况下,您正在循环 A 的所有元素并对其进行分区,因为它们都是相反的,这意味着 O nlog(n) 可以简单地表示为 O日志(n)。

为了更好地理解算法,我推荐这个Standford course

希望这会有所帮助。

【讨论】:

  • 我从你的帖子中了解到:我在分区中有一个 for 循环,所以它是 O(n)。除此之外,我有分区,所以我有 O(logn)。递归呢?
  • 递归是您必须循环遍历数组的方式。 1个循环表示n,2个循环表示2n,1个嵌套循环表示n^2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多