另一种选择 - 至少如果您愿意自己实现一个 - 是Page table。这通常在虚拟内存系统中用于将虚拟地址映射到物理地址,如果您的地址空间是稀疏填充的,并且使用的地址是集群的,那么它的效果最好。如果使用的地址是随机分布的,这将不太有效。
页表的基本方法与Trie相同- 递归细分。页表有一些固定的层数,每个节点都是一个固定大小的数组。如果给定子节点的条目为空,则该节点覆盖的所有叶子都为空。页表的主要优点是查找速度很快,只需要一些位移和取消引用。
让我们看一个 2 级页表的简单 Python 实现:
class Pagetable(object):
def __init__(self, num_bits=8):
"""Creates a new Pagetable with num_bits bits per level.
Args:
num_bits: The number of bits per pagetable level.
A 2 level pagetable will be able to store indexes between 0 and 2^(num_bits*2).
"""
self.num_bits = num_bits
self.mask = (1 << num_bits) - 1
self.root = [None] * (2 ** num_bits)
def __getitem__(self, idx):
page = self.root[idx >> self.num_bits]
return page and page[idx & self.mask]
def __setitem__(self, idx, val):
page = self.root[idx >> self.num_bits]
if not page:
page = self.root[idx >> self.num_bits] = [None] * (2 ** self.num_bits)
page[idx & self.mask] = val