Другой вариант - по крайней мере, если вы хотите реализовать его самостоятельно - это Страница таблицы . Это обычно используется в системах виртуальной памяти для сопоставления виртуальных адресов с физическими адресами, и это лучше всего работает, если ваше адресное пространство мало заполнено, а используемые адреса кластеризованы. Если используемые адреса распределены случайным образом, это будет менее эффективно.
Базовый подход к таблице страниц такой же, как Trie - рекурсивное подразделение. Таблица страниц имеет фиксированное количество уровней, и каждый узел представляет собой массив фиксированного размера. Если запись для данного подузла равна нулю, все листья, покрываемые этим узлом, равны нулю. Основным преимуществом таблицы страниц является то, что поиск выполняется быстро, требуя лишь нескольких сдвигов и разыменований.
Давайте посмотрим на простую реализацию 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