我们在计算机中有n个进程,x表示的新进程正在队列中等待。 我们也给了所有n个进程的记忆。 现在的任务是找到被新进程替换的最小进程数。 假设n = 5 (新进程的内存大小)x = 9 和内存占用了所有5个进程= 2 1 3 4 5。 现在,如果我们删除4和5,则最小计数为2(4 + 5 = 9)。 我在o(n ^ 2)尝试了这个,但我想要优化解决方案。 请建议。
答案 0 :(得分:0)
好吧,如果我们被允许操作最初提供给我们的进程列表,您可以简单地按降序排序进程列表。然后,问题归结为只是迭代列表并总结您遇到的每个进程的内存分配。当你超过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
您可以在工作中here观察此代码,从而产生您想要的输出。
请注意,即使我们无法操作作为输入提供的原始列表,如果允许我们在解决方案中使用O(n)空间,我们也可以复制初始列表并在该副本上使用相同的算法。在代码方面,用下面给出的行替换函数solve()的第一行就可以了。
processes = sorted(processes, reverse=True)
此代码采用的方法是贪婪的。在每一步中,它都有以下方式的原因:如果我必须再杀死一个进程,然后在仍在运行的进程中,让那个使用最大内存的进程终止,因此,分配足够内存的可能性是最高的。换句话说,如果有一种方法可以通过再杀死一个进程来分配足够的空间,那么使用最大内存来杀死一个进程就可以了,而杀死其他一些进程可能是不够的。虽然这不是一个正式的证明,但我相信这个推理解释了为什么算法有效。
排序的复杂性为 O(NlogN),遍历为 O(N)。因此,算法的总体复杂性将是 O(NlogN)。