Sorting 计数已终止进程的数目

Sorting 计数已终止进程的数目,sorting,Sorting,我们在一台计算机中总共有n个进程,一个由x表示的新进程正在队列中等待。 我们还给出了所有n个进程的内存。 现在的任务是找到被新进程替换的最少已终止进程数。 假设n=5 (新进程的内存大小)x=9 内存占用了所有5个进程=2 1 3 4 5。 现在如果我们去掉4和5,那么最小计数是2(4+5=9)。 我在o(n^2)中尝试过这个,但我想要优化解决方案。 请提出建议。如果允许我们操作最初提供给我们的流程列表,您可以简单地按降序对流程列表进行排序。然后,问题归结为只是在列表上迭代,并对遇到的每个进程的

我们在一台计算机中总共有n个进程,一个由x表示的新进程正在队列中等待。 我们还给出了所有n个进程的内存。 现在的任务是找到被新进程替换的最少已终止进程数。 假设n=5 (新进程的内存大小)x=9 内存占用了所有5个进程=2 1 3 4 5。 现在如果我们去掉4和5,那么最小计数是2(4+5=9)。 我在o(n^2)中尝试过这个,但我想要优化解决方案。
请提出建议。

如果允许我们操作最初提供给我们的流程列表,您可以简单地按降序对流程列表进行排序。然后,问题归结为只是在列表上迭代,并对遇到的每个进程的内存分配求和。当您超过x(即新进程所需的分配)时,您只需返回当前索引+1,这是您迄今为止遇到(并终止)的进程数

下面是实现它的示例Python代码

def solve(processes, x):
    processes.sort(reverse=True)
    sum_of_freed_memory = 0
    for i in range(len(processes)):
        sum_of_freed_memory += processes[i]
        if sum_of_freed_memory >= x:
            return (i+1)
    return -1 # to not crash if/when total memory is smaller than x
您可以在工作中观察此代码,从而产生所需的输出

请注意,即使我们无法操作作为输入的原始列表,如果允许我们在解决方案中使用O(n)空间,我们也可以复制初始列表并在该副本上使用相同的算法。就代码而言,用下面给出的行替换函数solve()的第一行就可以了

    processes = sorted(processes, reverse=True)
这段代码采用的方法是贪婪的。在每一步中,它都以以下方式进行推理:如果我必须再杀死一个进程,那么在仍在运行的进程中,让我们杀死使用最大内存的进程,这样分配足够内存的可能性就最大了。换句话说,如果有一种方法可以通过杀死一个或多个进程来分配足够的空间,那么杀死使用最大内存的进程就可以了,而杀死其他进程可能是不够的。虽然这不是一个正式的证明,但我相信这一推理解释了该算法工作的原因


排序的复杂性是O(NlogN),遍历是O(N)。因此,算法的整体复杂度将是<强> O(nLogn)>/P>i,用C++中的排序方法解决这个问题。但是我们不允许使用任何S.T.L.所以这就是为什么我必须编写程序来对提供给我们的数组进行排序,这将增加我的代码的复杂性。如果两种实现都是正确的,那么您是自己编写排序函数还是使用给定的库是无关紧要的。唯一可能的差异是一个常数因子,考虑到在你的问题中使用它,它不会被认为是Big-O符号的复杂性增加。