【问题标题】:Is my heap sort algorithm time complexity analysis correct?我的堆排序算法时间复杂度分析是否正确?
【发布时间】:2015-07-10 02:17:41
【问题描述】:

算法如下:

void heapSort(int * arr, int startIndex, int endIndex)
{
    minHeap<int> h(endIndex + 1);

    for (int i = 0; i < endIndex + 1; i++)
        h.insert(arr[i]);

    for (int i = 0; i < endIndex + 1; i++)
        arr[i] = h.deleteAndReturnMin();
}

insert()deleteAndReturnMin() 方法都是 O(log n)。 endIndex + 1 可以称为 n 个元素。因此,鉴于这些信息,我是否正确地说第一个和第二个循环都是 O(n log n),因此整个算法的时间复杂度是 O(n log n)?更准确地说,总时间复杂度是否为 O(2(n log n))(不包括初始化)?我正在学习大 O 表示法和时间复杂度,所以我只是想确保我理解正确。

【问题讨论】:

  • 两者在O(2(n log n))中无意义
  • 对于所有实数 c > 0 的任何 big-oh 复杂度类 O(c * f(n)) = O(f(n))。所以我们会写成 O(nlogn)。跨度>
  • @moreON 谢谢我了解大 O 符号。我只是想确保为了更准确,如果那是正确的?
  • 这个答案解释了原因:stackoverflow.com/a/22188943/290617
  • 在任何意义上都不是“更准确”。完全一样。

标签: c++ algorithm big-o time-complexity heapsort


【解决方案1】:

你的分析是正确的。

鉴于您提供的两种方法都是对数时间,您的整个运行时间是对数时间迭代 n 元素 O(n log n) 总计。您还应该意识到,Big-O 表示法忽略了常数因子,因此因子 2 是没有意义的。

请注意,您的代码中存在错误。输入似乎表明数组从startIndex 开始,但startIndex 在实现中被完全忽略。

您可以通过将堆大小更改为endIndex + 1 - startIndex 并从int i = startIndex 循环来解决此问题。

【讨论】:

  • 谢谢你是对的。我没有考虑到能够从特定索引开始排序。
猜你喜欢
  • 2017-01-24
  • 2021-08-25
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
相关资源
最近更新 更多