睡眠排序的时间复杂度是多少?

jus*_*nhj 65 time-complexity

鉴于此排序算法,您如何表达其时间复杂度?

最初在这里介绍 (部分档案).

#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
    f "$1" &
    shift
done
wait

example usage:
./sleepsort.bash 5 3 6 3 6 3 1 4 7
Run Code Online (Sandbox Code Playgroud)

bla*_*lah 31

O(max(input)+n)

由于大多数排序算法都是数据不可知的,因此复杂性似乎很难表达.它们的时间与数据量成比例,而不是数据本身.

FWIW,如指出这里,这不是对数据进行排序可靠的算法.

  • 我认为它需要是O(max(输入)+ n)其中是输入量.如果迭代所有输入所花费的时间比处理最大输入所花费的时间要长,那么O(max(输入))会不正确吗? (3认同)
  • 您可以通过标准化数据来降低复杂性。将所有输入除以 max(input)。 (2认同)
  • 这给您的挂钟时间设置了一个大O限制(尽管考虑到调度程序的工作,它可能应该为O(n log(n)))。但是,与大多数排序算法不同,该算法使CPU在一段时间内处于空闲状态,因此,CPU时间的复杂性是O(n)来迭代和启动睡眠线程/进程,以及O(n log n)。调度程序中的CPU时间,用于管理下次唤醒队列。即** O(n log n)CPU时间是吞吐量成本,而O(max(input)+ n log(n))挂钟时间是等待时间成本。** (2认同)

ham*_*mar 21

似乎没有人解决的一点是如何sleep实施.最终,它们最终会出现在某个调度程序中,操作复杂性将取决于所使用的调度算法.例如,如果将sleeps作为事件放在优先级队列中,您可能会得到等同于heapsort的东西,其复杂度为O(n log n).天真的调度算法可能导致O(n ^ 2).


jus*_*nhj 17

我认为paxdiablo距离最近,但不是正确的原因.时间复杂性忽略了真实硬件上的问题,例如高速缓存大小,内存限制以及在这种情况下有限数量的进程和调度程序的操作.

基于时间复杂度维基百科页面我会说答案是你无法确定运行时的复杂性,因为如果定义为:

通常通过计算算法执行的基本操作的数量来估计时间复杂度,其中基本操作花费固定的时间量来执行.因此,算法所花费的时间量和基本操作的数量最多相差恒定因子.

然后我们不能谈论这个算法的运行时复杂性,因为基本操作所花费的时间是如此巨大的不同,所花费的时间将不同于一个常数因子.

  • *“时间复杂度通常由...估计”*但不必通过计算基本操作来“定义”。很可能会谈论休眠一定时间长度的算法的时间复杂度;您可以计算他们睡眠的时间,并对其应用渐近分析。 (4认同)

pax*_*blo 11

时间复杂度和该算法的过程复杂性都是O(braindead).

如果数据集中的足够大,您将等待一个答案,直到太阳爆炸.

有了足够大的数据集大小,你就可以了

  • (1)达到你的工艺限制; 和
  • (2)发现,早睡觉将完成后面的一些开始之前,这意味着该组(2,9,9,9,9,9,...,9,9,1)不会进行排序12正确.

在这种情况下,时间复杂度无关紧要.你不能得到任何不如"错误"的优化.

当数据集大小发生变化时,可以使用复杂性分析来比较算法,但是当算法首先是荒谬的时候就不行了:-)

  • 为了让它继续工作,你需要扩大睡眠时间,使连续数字之间的最小时间差大于所有睡眠排队的时间。假设内核中有一个有效的唤醒队列算法,这可能是“O(n log n)”。我认为这仍然归结为 `O(n log n)` CPU 时间,挂钟时间可能非常糟糕。 (2认同)