递归的深度和一个事实?
depth of recursion and one fact?
我看到这段文字:
出现一个问题:
但是你在正常的快速排序中看到,当我们在一个子数组中有 1 个元素而在下一个子数组中有 n-1 个其他元素时,我们在使用堆栈时得到 O(n) 的深度。这与这个事实形成对比?问题出在哪里?
我对这个话题的误解点在哪里?
重要的部分是“元素的常数分数”。如果遇到退化的 Quicksort 情况,其中分区将常量 number(例如 1)个元素放在分区的一侧,您将获得 O(n^2) 时间复杂度。
但是如果每次分区调用都在一侧放置一个常量 分数(例如 99%)的元素,您仍然会得到 O(n log n)(尽管有更大的常数因子)。
您误解了“常数分数”的含义。这并不意味着您将常量 number 个元素放在一个分区中,而将其余元素放在另一个分区中。如果将 k
个元素放在一个分区中,则 分数 为 k/n
,即 而不是 常量。
另一方面,如果您总是将 1/k
个元素(对于某些常量 k
)放在一个分区中,对于足够大的 n
来说,这是一个 线性 个元素。对于 k = 100000
,一侧仍然是 n/100000
个元素,另一侧仍然是 99999/100000 n
个元素。
我看到这段文字:
出现一个问题:
但是你在正常的快速排序中看到,当我们在一个子数组中有 1 个元素而在下一个子数组中有 n-1 个其他元素时,我们在使用堆栈时得到 O(n) 的深度。这与这个事实形成对比?问题出在哪里?
我对这个话题的误解点在哪里?
重要的部分是“元素的常数分数”。如果遇到退化的 Quicksort 情况,其中分区将常量 number(例如 1)个元素放在分区的一侧,您将获得 O(n^2) 时间复杂度。
但是如果每次分区调用都在一侧放置一个常量 分数(例如 99%)的元素,您仍然会得到 O(n log n)(尽管有更大的常数因子)。
您误解了“常数分数”的含义。这并不意味着您将常量 number 个元素放在一个分区中,而将其余元素放在另一个分区中。如果将 k
个元素放在一个分区中,则 分数 为 k/n
,即 而不是 常量。
另一方面,如果您总是将 1/k
个元素(对于某些常量 k
)放在一个分区中,对于足够大的 n
来说,这是一个 线性 个元素。对于 k = 100000
,一侧仍然是 n/100000
个元素,另一侧仍然是 99999/100000 n
个元素。