我已经看到几个答案指向“按顺序排列”功能,这确实很重要,但没有一个突出另一个大功能,即“使用键 >= 这个查找第一个条目”。即使没有真正需要从那里“走”,这也有很多用途。
例如(这出现在最近的 SO 答案中),假设您想生成具有给定相对频率的伪随机值 - 即,给您一个 dict d
:
{'wolf': 42, 'sheep': 15, 'dog': 23, 'goat': 15, 'cat': 5}
并且需要一种方法来生成 'wolf' 的概率为 42 out of 100(因为 100 是给定的相对频率的总和),'sheep' 15 out of 100,等等;并且不同值的数量可能非常大,相对频率也是如此。
然后,将给定值(以任何顺序)存储为树形图中的值,对应的键是该点的“总累积频率”。IE:
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
wherefirstGTKey
是一个方法,它返回第一个条目(在这个假设的例子中,带有.key
和属性),键 > 给定参数。.value
例如,我已经将这种方法用于存储为 B 树的大文件(使用 egbsddb.bt_open
和set_location
方法)。