Time complexity 睡眠种类的时间复杂度是多少?

Time complexity 睡眠种类的时间复杂度是多少?,time-complexity,Time Complexity,给定这种排序算法,您如何表示其时间复杂性 O(最大输入)+n) 复杂性似乎难以表达,因为大多数排序算法都是数据不可知的。它们的时间尺度取决于数据量,而不是数据本身 正如前面所指出的,这不是一个可靠的数据排序算法。如果你阅读该线程,你会发现你的问题已经得到了回答。时间复杂度为O(max(input)),操作复杂度(操作数)为O(n)该算法的时间复杂度和过程复杂度均为O(braindead): 如果数据集中有足够大的值,你将等待答案,直到太阳爆炸(264秒是半万亿年多一点) 有了足够大的数据集大

给定这种排序算法,您如何表示其时间复杂性

O(最大输入)+n)

复杂性似乎难以表达,因为大多数排序算法都是数据不可知的。它们的时间尺度取决于数据量,而不是数据本身


正如前面所指出的,这不是一个可靠的数据排序算法。

如果你阅读该线程,你会发现你的问题已经得到了回答。时间复杂度为
O(max(input))
,操作复杂度(操作数)为
O(n)

该算法的时间复杂度和过程复杂度均为
O(braindead)

  • 如果数据集中有足够大的值,你将等待答案,直到太阳爆炸(264秒是半万亿年多一点)
  • 有了足够大的数据集大小,您将(a)达到进程限制;和(b)发现早睡会在后一个开始之前结束,这意味着集合
    (2,9,9,9,9,9,…,9,9,1)
    不会正确排序
    1
    2

在这种情况下,时间复杂性是不相关的。你不能得到比“错误”更少的优化。当数据集大小发生变化时,可以使用复杂度分析来比较算法,但当算法一开始就很可笑时,就不能这样做:-)

我认为paxdiablo是最接近的算法,但原因不正确。时间复杂性忽略了实际硬件上的问题,例如缓存大小、内存限制,在本例中,还忽略了有限的进程数和调度程序的操作

基于这一点,我认为答案是,您无法确定运行时复杂性,因为如果它被定义为:

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


那么我们就不能讨论这个算法的运行时复杂性了,因为基本操作所花费的时间相差太大,以至于所花费的时间相差超过一个常数。

似乎没有人提到的一点是这些
睡眠
是如何实现的。最终,它们会在某个地方的调度程序中结束,而操作的复杂性将取决于所使用的调度算法。例如,如果将
sleep
s作为事件放在优先级队列中,则很可能会得到与heapsort等价的结果,复杂性为O(n log n)。一个简单的调度算法可能会导致O(n^2)。

虽然看起来是线性的,但我认为复杂性仍然是O(log(n)*max(input))

当我们谈论渐近时间复杂性时,它意味着当n无限大时需要花费多少时间

基于比较的排序算法不能快于O(n*log(n)),而睡眠排序实际上是基于比较的:

进程睡眠n秒,然后醒来。操作系统需要从所有睡眠过程中找到剩余睡眠时间最少的睡眠时间,如果时间到了,就叫醒这个人

这将需要一个优先级队列,它需要O(logN)时间插入一个元素,O(1)查找最小元素,O(logN)删除最小元素


当n变得非常大时,唤醒一个进程需要超过1秒的时间,这使得它比O(n)大。

我支持Jordan,但我认为挂钟的时间复杂度最好用O(2^m)表示,其中m是每个项目的大小,而不是O(max(input))

如果每个项目的大小为m,则最大的项目的整数值为2^m(减去1,但没有人关心)。通过构造,该算法要求设置时间小于1(常数)

因此,挂钟时间复杂度O(2^m),操作计数复杂度O(n)


考虑到设置时间的改进算法可能具有挂钟时间复杂度O(2^m+n)。例如,它可以在开始时记录当前时间,计算
base\u time=start\u time+k*len(列表)
(对于某些适当的常数k),然后让线程睡眠到time
base\u time+i
。然后
k*len(list)
显然是O(n),而
i
和以前一样是O(2^m),总共是O(2^m+n)。

我认为它需要是O(max(input)+n),其中是输入量。如果遍历所有输入所需的时间比处理最大输入所需的时间长,那么O(max(input))将不正确。否?可以通过规范化数据来降低复杂性。将所有输入除以max(input)。这会给你一个墙上时钟时间的大O界限(尽管考虑到调度程序的工作,它可能应该是
O(n log(n))
)。但与大多数排序算法不同,这种算法会让CPU在一段时间内处于空闲状态,因此CPU时间的复杂性是迭代并启动休眠线程/进程的
O(n)
,加上调度程序中管理下一个唤醒队列的
O(n log n)
CPU时间。i、 e.
O(n log n)
CPU时间是吞吐量成本,但是
O(max(input)+n log(n))
wall clock time是延迟成本。我认为这是一个与现实世界的实际情况无关的问题绝对是一个很好的学术问题。如果它引发了思考,就像它对我所做的那样,那么它一定有价值。我希望我能编辑我的评论,读一读“一个有趣的问题”,这就是我的意思,哦,这是一个答案,当然,但我不知道让它继续工作是否正确,您需要放大睡眠时间,以便连续数字之间的最小时间差大于排队等待所有睡眠的时间。这可能是
O(nlogn)
假设内核中有一个有效的唤醒队列算法。我认为这仍然让道指沸腾
#!/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