给定这种排序算法,您如何表达其时间复杂度?
#!/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
Answers:
O(n log(n))
考虑调度程序的工作)。但是,与大多数排序算法不同,该算法使CPU空闲了一段时间,因此,CPU时间的复杂性是O(n)
要迭代并启动睡眠线程/进程,再加O(n log n)
上调度程序中的CPU时间来管理下一个队列。唤醒。也就是说,O(n log n)
CPU时间是吞吐量成本,而O(max(input) + n log (n))
挂钟时间是延迟成本。
我认为paxdiablo最接近,但不是出于正确的原因。时间复杂度忽略了实际硬件上的问题,例如缓存大小,内存限制,在这种情况下,进程数和调度程序的操作受到限制。
基于Wikipedia页面的时间复杂度,我会说答案是您无法确定运行时复杂度,因为如果将其定义为:
通常通过对算法执行的基本运算的数量进行计数来估算时间复杂度,其中基本运算需要固定的时间来执行。因此,算法花费的时间量和执行的基本运算的数量最多相差一个常数。
那么我们就不能谈论该算法的运行时间复杂性,因为基本操作所花费的时间差异很大,以至于所花费的时间相差一个常数以上。
该算法的时间复杂度和过程复杂度均为O(braindead)
:
(2,9,9,9,9,9,...,9,9,1)
不会排序1
和2
正确。在这种情况下,时间复杂度无关紧要。没有比“错误”更好的优化了。可以使用复杂度分析在数据集大小变化时比较算法,但是当算法一开始就很荒唐时就不可以:-)
O(n log n)
假设内核中有一个有效的唤醒队列算法。我认为这仍然归结为O(n log n)
CPU时间,可能还有非常差的挂钟时间。
我和Jordan在一起,除了我认为挂钟时间复杂度最好用O(2 ^ m)表示,其中m是每个项目的大小,而不是O(max(input))。
如果每个项目的大小为m,则最大项目的整数值为2 ^ m(减1,但没有人关心)。通过构造,该算法要求建立时间小于1(恒定)。
因此,挂钟时间复杂度O(2 ^ m),操作计数复杂度O(n)。
考虑到建立时间的改进算法可能具有挂钟时间复杂度O(2 ^ m + n)。例如,它可以在开始时记下当前时间,进行计算base_time = start_time + k*len(list)
(对于某个适当的常数k),然后让线程休眠直到time base_time+i
。那么k*len(list)
显然是O(n)并且i
像以前一样是O(2 ^ m),总共是O(2 ^ m + n)。