Python中是否有基数/ patricia / critbit树?

时间:2011-01-16 18:44:11

标签: python patricia-trie

我有大约10,000个单词用作一组反向索引到大约500,000个文档。两者都被规范化,因此索引是整数(单词id)到一组整数的映射(包含单词的文档的id)。

我的原型使用Python的集合作为明显的数据类型。

当我搜索文档时,我找到了N个搜索词及其相应的N组的列表。我想在这N组的交集中返回文档集。

Python的“交叉”方法实现为成对缩减。我想我可以通过并行搜索排序集来做得更好,只要该库提供了一种在 i 之后获得下一个条目的快捷方式。

我一直在寻找类似的东西。多年前我写过PyJudy,但我不再保留它了,我知道要把它带到一个我再次感到舒服的阶段需要做多少工作。我宁愿使用其他人经过良好测试的代码,我希望能够支持快速序列化/反序列化。

我找不到任何,或者至少没有任何Python绑定。有avltree可以满足我的需求,但是由于即使是成对的集合合并也比我想要的要长,我怀疑我想用C / C ++完成所有操作。

你知道编写为Python的C / C ++扩展的任何radix / patricia / critbit树库吗?

如果失败了,我应该包装哪个最合适的库? Judy Array网站在6年内没有更新,2007年5月发布了1.0.5。(虽然它确实构建得很干净,所以也许它只是工作。)

(编辑:为了澄清我在API中寻找的东西,我想要类似的东西:

def merge(document_sets):
    probe_i = 0
    probe_set = document_sets[probe_i]
    document_id = GET_FIRST(probe_set)

    while IS_VALID(document_id):
        # See if the document is present in all sets
        for i in range(1, len(document_sets)):
            # dynamically adapt to favor the least matching set
            target_i = (i + probe_i) % len(document_sets)
            target = document_sets[target_i]
            if document_id not in target_set:
                probe_i = target_id
                probe_set = document_sets[probe_i]
                document_id = GET_NEXT(probe_set, document_id)
                break
        else:
            yield document_id

我正在寻找实现GET_NEXT()的东西来返回在给定条目之后发生的下一个条目。这对应于Judy1N以及其他Judy数组的类似条目。

此算法动态适应数据应优先支持低命中集。对于我使用的数据类型,给出了5-10% increase in performance。) )

2 个答案:

答案 0 :(得分:5)

是的,有一些虽然我不确定它们是否适合您的用例:但似乎没有一个是您要求的。

BioPython在C中实现了Trie。

啊,这是一个很好的讨论,包括基准:http://bugs.python.org/issue9520

其他(一些非常陈旧的)实现:

http://pypi.python.org/pypi/radix

  

py-radix是一个实现   基数树的数据结构   存储和检索IPv4和IPv6   网络前缀。

https://bitbucket.org/markon/patricia-tree/src

  

Python的Python实现   帕特里夏树

http://pypi.python.org/pypi/trie

  

前缀树(trie)实现。

http://pypi.python.org/pypi/logilab-common/0.50.3

  

patricia.py:Python实现   PATRICIA trie(实用算法)   检索编码的信息   字母和数字)。

答案 1 :(得分:3)

我最近为datrie添加了迭代支持,您可以尝试一下。