Python程序员面试算法宝典---解题总结: 第4章 数组 4.26 如何对磁盘分区

# -*- 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()

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/94123071