基于大小分割文件的优化问题

朱塞佩

我正面临一个优化问题,我想找到一种能够解决该问题的算法。

提示:文件大小的总和至少大于15 MB。因此,总大小为[15 MB;+∞]。为简单起见,将无限作为100 GB,

问题:我有一个文件列表,大小在3 KB到4 MB之间。我必须压缩这些文件,并且需要保证在将它们压缩在一起之前,文件大小的总和在15 MB到150 MB之间。有没有已知的算法可以解决这个问题?为了不使算法在计算需求方面花费太多,可以接受的是不将组块的数量最小化(因此,每个组块不必强制尽可能大)。

谢谢朱塞佩

大卫·艾森斯塔

我们可以调整众所周知的首次拟合递减算法来执行此操作。

import random

K = 1000
B = 1
KB = K * B
MB = K * KB


class File:
    def __init__(self):
        self.size = random.randrange(3 * KB, 4 * MB)


class Chunk:
    def __init__(self, max_chunk_size):
        self.free = max_chunk_size
        self.files = []

    def add(self, file):
        if self.free < file.size:
            return False
        self.free -= file.size
        self.files.append(file)
        return True

    def enlarge(self, delta_free):
        assert delta_free >= 0
        self.free += delta_free

    def size(self):
        return sum(file.size for file in self.files)


def first_fit_decreasing(files, min_chunk_size, max_chunk_size):
    chunks = []
    for file in sorted(files, key=lambda file: file.size, reverse=True):
        for existing_chunk in chunks:
            if existing_chunk.add(file):
                break
        else:
            if len(chunks) >= 2:
                chunks[-2].enlarge(min_chunk_size)
            new_chunk = Chunk(max_chunk_size - min_chunk_size)
            new_chunk.add(file)
            chunks.append(new_chunk)
    if chunks[-1].size() < min_chunk_size:
        chunks[-2].enlarge(min_chunk_size)
        for file in chunks[-1].files:
            chunks[-2].add(file)
        del chunks[-1]
    return chunks


def test(n):
    files = [File() for i in range(n)]
    min_chunk_size = 15 * MB
    max_chunk_size = 150 * MB
    chunks = first_fit_decreasing(files, min_chunk_size, max_chunk_size)
    assert sorted(id(file) for file in files) == sorted(
        id(file) for chunk in chunks for file in chunk.files
    )
    for chunk in chunks:
        assert min_chunk_size <= chunk.size() <= max_chunk_size
    print(len(chunks), "chunks")
    print(sum(chunk.free for chunk in chunks) / MB, "MB free")


if __name__ == "__main__":
    for t in range(1000):
        test(150)
    test(10000)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

文件复制,基于大小

来自分类Dev

优化:缩小C或C ++中的文件大小

来自分类Dev

使用pysftp优化检索文件大小的性能

来自分类Dev

了解地图文件,优化大小

来自分类Dev

文件大小内容长度问题

来自分类Dev

硬链接重复文件仅基于大小

来自分类Dev

RabbitMQ基于文件大小的日志轮转默认大小

来自分类Dev

Windows文件关联基于文件类型和大小

来自分类Dev

使用Windows批处理基于文件大小删除重复文件

来自分类Dev

C,Wav文件块大小问题

来自分类Dev

Phonegap www文件夹和优化问题

来自分类Dev

文件分配大小问题:磁盘上的大小大于预期

来自分类Dev

基于多次出现的分隔符分割文件

来自分类Dev

Python中基于模式分割输入文件时的IndexError

来自分类Dev

如何使用python基于音符音高分割midi文件?

来自分类Dev

基于时间的算法优化

来自分类Dev

在列表上使用map2来解决基于均值方差矩阵的凸优化问题

来自分类Dev

Laravel基于文件的缓存的大小限制是多少?

来自分类Dev

棒-文本换行-基于图像文件的大小

来自分类Dev

我可以扩大基于文件的磁盘映像的大小吗?

来自分类Dev

如何基于未压缩的文件大小grep打包?

来自分类Dev

将音频文件分割成任意大小

来自分类Dev

将文件分割成大小大于127的块

来自分类Dev

将音频文件分割成任意大小的片段

来自分类Dev

将文件分割成大小大于127的块

来自分类Dev

文件大小优化-如何在网站上检测可疑文件?

来自分类Dev

VBA文件复制基于列表到特定目录的问题

来自分类Dev

Angular 2-基于文件的应用程序的路由问题

来自分类Dev

android位图大小依赖关系基于分辨率或文件大小

Related 相关文章

热门标签

归档