已编辑:我之前提到过“输入大小”,但我的意思是我已编辑帖子的“问题大小”。
有两种算法,冒泡排序和分布排序,我认为冒泡排序的问题大小为“ n-1”,因为操作执行了“ n-1”次,而分配排序的问题大小为“ n”。但是根据我的教授,他认为气泡排序问题的大小为“ n”,分布排序问题的大小为“ n-1”。我想知道我是对的吗?
我在网上查了一下,到处都说冒泡排序是“ n-1”次,分布排序是“ n”次,但是我的教授说的恰恰相反,我无法理解他。有人可以向我解释我是否错了?
Bubble sort:
Algorithm1 BubbleSort(A[0..n – 1])
// Input: Array A[0..n – 1] of numbers
// Output: Array A[0..n – 1] of numbers sorted in non-decreasing order
do
swapped ← false
for i ← 0 to n – 2 do
if A[i] > A[i+1] then
swap (A[i], A[i+1] )
swapped ← true
while swapped
return A
Distribution sort:
// Input: Array A[0..n – 1] of numbers between L and U (with L ≤ U)
// Output: Array S[0..n – 1] of A’s numbers sorted in non-decreasing order
for j ← 0 to U – L do D[j] ← 0
for i ← 0 to n – 1 do D[A[i] – L] ← D[A[i] – L] + 1
for j ← 1 to U – L do D[j] ← D[j – 1] + D[j]
for i ← n – 1 down to 0 do
j ← A[i] – L
S[D[j] – 1] ← A[i]
D[j] ← D[j] – 1
return S
我希望冒泡排序的问题大小为“ n-1”,分布排序的问题大小为“ n”,但根据我的教授,这是错误的。我想知道气泡排序和分布排序算法的问题大小的正确答案是什么?
答案 0 :(得分:2)
这既是-非常令人困惑的问题,也是非常令人困惑的答案。
在两种情况下,您都需要所有输入,因此输入大小为n
,这也与复杂度理论有关,其中n
具有与n-1
相同的复杂度,因此没关系。
在执行了多少次的情况下,冒泡排序最多执行O(n^2)
,分布排序对多个排序算法进行了分组,但是排序没有比O(n*log n)
快的>
PS:如果这是来自高中教授,那么他很有可能对复杂性理论也没有足够的了解。
答案 1 :(得分:0)
“问题大小”是指输入的大小。该算法不会影响它。
当您认为BubbleSort接受相同输入时,其输入大小与DistributionSort不同时,您的想法是错误的。问题/输入的大小就是问题/输入的大小。
当您试图找出 n 或 n-1 是正确的时,您也在错误地思考。我们甚至都没有指定任何单位- n 或 n-1 什么?而且在现实生活中的所有情况下,输入甚至还会占用一些恒定量的额外空间,而我们甚至都不算。 (堆栈框架指针等)
当我们不计算这些东西时,由于我们将仅在渐近符号的表达式中使用此“大小”,因此 n 和之间没有任何区别n-1 。