我有一种算法,想找到它的时间和空间复杂性。 算法是
Algorithm for Scheduling
INPUT:P1,P2, PN // N processes
do
Sort processes in ascending according to their burst time
TQ = median of burst time of processes
For (i=1 to N )
Assign TQ to Process Pi
If Burst time of process i < TQ
remove Process i from array
Else
BT of process i = BT of process i - TQ
Compute waiting time for all process in array
While (array of processes != empty)
如何计算该算法的时间和空间复杂度?
答案 0 :(得分:0)
在注释中,您声明需要 O(1)来更新进程的等待时间,因此这意味着以下行需要 O(N):< / p>
Compute waiting time for all process in array
关于remove
操作,您还建议它是 O(1),尽管您不应该将相应的等待时间设置为零,因为这会影响阵列上的其他操作(例如排序和获取中位数)。更好的方法是将最后一个进程复制到插槽i中,然后从数组中删除最后一个元素。就是 O(1)。
执行for
循环将花费 O(N)。在排序数组中找到中位数也是 O(N),因此在do
主体中,时间复杂度最大的操作是排序: O(N⋅logN)
在do
循环的每次迭代中,数组大小( N )减半。
所以我们有以下等式(省略了big-O表示法):
T(N) = N⋅log(N) + T(N/2)
= N⋅log(N) + (N/2)⋅log(N/2) + (N/4)⋅log(N/4) + ...
= N⋅(log(N) + (1/2)⋅log(N/2) + (1/4)⋅log(N/4) + ...)
现在 log(N / c) = log(N)-log(c),因此我们可以将术语归类如下:
= N⋅((1 + 1/2 + 1/4 + ...)⋅log(N) - log(2)/2 - log(4)/4 - log(8)/8 - ...)
= N⋅(2⋅log(N) - log(2)/2 - log(4)/4 - log(8)/8 - ...)
< 2N⋅log(N)
因此,我们开始认为T(N)至少为 O(N⋅log(N)),然后得出它最多为 O(N⋅log(N) )),因此我们对时间复杂度有严格的限制:
O(N⋅log(N))