free list的概念通常用于重用空间,所以如果我有一个固定长度值的文件并且删除了一个,我把它放在一个空闲列表中。然后,当我需要插入新值时,我从列表中取一个并将其放在那个位置。
但是我对如何为可变长度的值实现空闲列表感到有点困惑。如果我删除该值并将位置及其长度放在空闲列表中,如何检索新值的“最佳”候选者?
使用普通列表将是O(n)
时间复杂度。使用树(长度为关键)将使log(n)
。有没有更好的方法可以提供O(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)。