可变长度免费列表

时间:2016-07-15 13:53:18

标签: algorithm

free list的概念通常用于重用空间,所以如果我有一个固定长度值的文件并且删除了一个,我把它放在一个空闲列表中。然后,当我需要插入新值时,我从列表中取一个并将其放在那个位置。

但是我对如何为可变长度的值实现空闲列表感到有点困惑。如果我删除该值并将位置及其长度放在空闲列表中,如何检索新值的“最佳”候选者?

使用普通列表将是O(n)时间复杂度。使用树(长度为关键)将使log(n)。有没有更好的方法可以提供O(1)

1 个答案:

答案 0 :(得分:1)

是的,哈希表!因此,您有一个大的哈希表,其中包含空闲块的大小作为键,值是包含指向相应大小的块的指针的数组。所以每次你释放一个块:

hash[block.size()].append(block.address())

每次分配一个空闲块:

block = hash[requested_size].pop()

此方法存在的问题是块大小太多。因此,散列将填满数百万个密钥,浪费大量内存。

因此,您可以拥有一个列表并迭代它以找到合适的块:

for block in blocks:
    if block.size() >= requested_size:
        return blocks.remove(block)

内存效率高但速度慢,因为您可能需要扫描数百万个块。

所以你要做的就是结合这两种方法。如果将分配量子设置为64,则包含256个大小类的哈希可用于最多64 * 256 = 16 kb的所有分配。块大于存储在树中的块,它允许您插入和删除O(log N)。