# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第4章 数组 4.26 如何对磁盘分区
题目:
有N个磁盘,每个磁盘大小为D[i](i=0...N-1),现在要在这N个磁盘上
"顺序分配"M个分区,每个分区大小为P[j](j=0...M-1),顺序分配的意思是:
分配一个分区P[j]时,如果当前磁盘剩余空间足够,则在当前磁盘分配;
如果不够,则尝试下一个磁盘,直到找到一个磁盘D[i+k]可以容纳该分区,
分配下一个分区P[j+1]时,则从当前磁盘D[i+k]的剩余空间开始分配,
不在使用D[i+k]之前磁盘未分配的空间,如果这M个分区不能在这N个磁盘完全分配,
则认为分配失败,请实现函数 , is_allocable判断给定N个磁盘(数组D)和
M个分区(数组P),是否会出现分配失败的情况?举例:
磁盘为[120, 120, 120],分区为[60, 60, 80, 20, 80]可分配,
如果为[60, 80, 80, 20, 80],则分配失败。
分析:
最简单的方法就是对分区数组进行遍历,对每个分区,
判断当前磁盘的剩余空间是否可以分配,如果不可以分配,
则遍历下一个磁盘;
如果磁盘全部遍历完成,但还存在分区未分配,则分配失败。
一种快速判断是否可以分配的方式就是:
判断分区和,磁盘空间和的大小,如果分区和>磁盘空间和,
则肯定不能分配。
关键:
参考:
Python程序员面试算法宝典
'''
def is_allocable(N, M):
if not N:
return False
if not M:
return True
nIndex = 0
sizeN = len(N)
left = N[0]
for need in M:
# 如果所有磁盘全部分配掉了,则说明不能分配
if nIndex >= sizeN:
return False
# 如果当前磁盘可以分配
if left >= need:
left -= need
else:
# 如果当前磁盘不可以分配,则切换到下一个磁盘
while left < need:
nIndex += 1
if nIndex >= sizeN:
return False
left = N[nIndex] if nIndex < sizeN else 0
if left >= need:
left -= need
break
return True
def process():
N = [120, 120, 120]
M = [60, 60, 80, 20, 80]
result = is_allocable(N, M)
print result
M = [60, 80, 80, 20, 80]
result = is_allocable(N, M)
print result
M = [130]
result = is_allocable(N, M)
print result
if __name__ == "__main__":
process()