Я видел несколько ответов, указывающих на функцию «обход в упорядоченной последовательности», которая действительно важна, но ни одна из них не выделяла другую важную функцию, а именно «найти первую запись с ключом> = this». У этого есть много применений, даже когда нет никакой реальной потребности "идти" оттуда.
Например (это появилось в недавнем SO-ответе), скажем, вы хотите сгенерировать псевдослучайные значения с заданными относительными частотами - то есть, вам, скажем, дано d
:
{'wolf': 42, 'sheep': 15, 'dog': 23, 'goat': 15, 'cat': 5}
и нужен способ генерировать «волка» с вероятностью 42 из 100 (так как 100 - это общее количество приведенных относительных частот), «овцы» 15 из 100 и т. Д .; и число различных значений может быть довольно большим, как и относительные частоты.
Затем сохраните заданные значения (в любом порядке) в качестве значений в древовидной карте с соответствующими ключами, которые являются «общей кумулятивной частотой» до этой точки. I.e.:
def preprocess(d):
tot = 0
for v in d:
tot += d[v]
treemap.insert(key=tot, value=v)
return tot, treemap
Теперь генерация значения может быть довольно быстрой (O(log(len(d)))
) следующим образом:
def generate(tot, treemap, r=random):
n = r.randrange(tot)
return treemap.firstGTkey(n).value
где firstGTKey
- это метод, который возвращает первую запись (с атрибутами .key
и .value
, в этом гипотетическом примере) с ключом> заданного аргумента. Я использовал этот подход, например, для больших файлов, хранящихся как B-деревья (например, bsddb.bt_open
и метод set_location
).