字典树用于单词联想

最近要做一个单词联想的功能,经过调研选择使用字典树,节省空间,查找快。

贴上代码

class Trie(object):
    def __init__(self):
        self.path = {}
        self.value = None
        self.valid = False

    def __setitem__(self, key, val):
        head = key[0]
        if head in self.path:
            node = self.path[head]
        else:
            node = Trie()
            self.path[head] = node

        if len(key) > 1:
            remains = key[1:]
            node.__setitem__(remains, val)
        else:
            node.value = val
            node.valid = True

    def __getitem__(self, key):
        head = key[0]
        if head not in self.path:
            raise KeyError(key)
        else:
            node = self.path[head]

        if len(key) > 1:
            remains = key[1:]
            try:
                return node.__getitem__(remains)
            except KeyError:
                raise KeyError(key)
        elif node.valid:
            return node.value
        else:
            raise KeyError(key)

    def get(self, key, default=None):
        try:
            return self.__getitem__(key)
        except KeyError:
            return default

    def __contains__(self, key):
        try:
            self.__getitem__(key)
            return True
        except KeyError:
            return False

    def __keys__(self, prefix=[], seen=[]):
        result = []
        if self.valid:
            is_str = True
            val = ‘‘
            for k in seen:
                if type(k) != str or len(k) > 1:
                    is_str = False
                    break
                val += k
            if is_str:
                result.append(val)
            else:
                result.append(prefix)

        if len(prefix) > 0:
            head = prefix[0]
            prefix = prefix[1:]
            if head in self.path:
                nextpaths = [head]
            else:
                nextpaths = []
        else:
            nextpaths = self.path.keys()

        for key in nextpaths:
            nextseen = []
            nextseen.extend(seen)
            nextseen.append(key)
            result += self.path[key].__keys__(prefix, nextseen)

        return result

    def keys(self, prefix=[]):
        return self.__keys__(prefix)

    def __iter__(self):
        for item in self.keys():
            yield item

        raise StopIteration

trie = Trie()
trie[‘abc‘] = 1
trie[‘salt‘] = 1
trie[‘hello‘] = 1
trie[‘alter‘] = 1
print trie[‘abc‘]
print trie.keys()
print trie.keys(‘a‘)
for key in trie:
    print key

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Courier }
span.s1 { }

>> 1

>> [‘abc‘, ‘alter‘, ‘hello‘, ‘salt‘]

>> [‘abc‘, ‘alter‘]

>> abc

>> alter

>> hello

>> salt

代码参考 https://github.com/bdimmick/python-trie/blob/master/trie.py

时间: 2024-08-04 09:25:03

字典树用于单词联想的相关文章

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

Trie树&mdash;字典树(单词查找树)

Trie树,又称字典树,单词查找树.它来源于retrieval(检索)中取中间四个字符构成的.用于存储大量的字符串以便支持快速模式匹配.主要应用在信息检索领域. Trie有三种结构:标准Trie(standard trie),压缩Trie,后缀Trie(suffix trie). 1.标准Trie 标准Trie树的结构:所有含有公共前缀的字符串将挂在树中同一个结点下.实际上trie简明的存储于串集合汇总的所有公共前缀.加入有这样一个字符串集合X{bear,bell,bid,bull,buy,se

【字典树应用】联想用户最想输入的词汇

第一章:抛砖引玉 字典树是一种基于链表的数据结构,以统计词频并返回用户最想输入的词汇为例,分享一下字典树的应用心得. 刚建立的用户词库,用户输入两次"hilili", 输入一次"hilucy",此时用户再次输入"hi",我们应该联想到用户可能要输入的单词是"hilili",以下为统计示例图. 字典树是一种兼顾空间和时间的数据结构,利用公共前缀节约空间,减少比较次数以提高查询和插入效率. 字典树的常见用途:保存大量字符串并进行统

trie树(字典树)

1. trie树,又名字典树,顾名思义,它是可以用来作字符串查找的数据结构,它的查找效率比散列表还要高. trie树的建树: 比如有字符串"ab" ,"adb","adc"   可以建立字典树如图: 树的根节点head不存储信息,它有26个next指针,分别对应着字符a,b,c等.插入字符串ab时,next['a'-'a']即next[0]为空,这是申请一个结点放在next[0]的位置,插入字符串db时,next['d'-'a']即next[3]

字典树基础

1.概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tri:/ "tree",也有人读为/tra?/ "try".  Trie树的基本性质可以归纳为: (1)根节点不包含字符,除根节点以外每个节点只包含一个字符. (2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串. (3)每个节点的所有子节点包含的字符

Trie树(字典树)(1)

Trie树.又称字典树,单词查找树或者前缀树,是一种用于高速检索的多叉树结构. Trie树与二叉搜索树不同,键不是直接保存在节点中,而是由节点在树中的位置决定. 一个节点的全部子孙都有同样的前缀(prefix),也就是这个节点相应的字符串,而根节点相应空字符串.普通情况下.不是全部的节点都有相应的值,仅仅有叶子节点和部分内部节点所相应的键才有相关的值. A trie, pronounced "try", is a tree that exploits some structure in

字典树(Trie)的java实现

一.定义 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话

字典树以及模板

字典树又称为单词查找树.用于统计排序大量字符串(不限于字符串),利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高.字典树的性质: 1.根节点不包含任何字符(空根节点) 2.从根节点到某一节点路径上的字符连起来就是一个字符串 3.每个节点的所有子节点包含的字符串不相同. 一般的每一个节点需要一个统计量count,来记录当前前缀重复的次数.每个节点还可以用一个布尔变量标记当前节点是否构成单词.Trie主要操作有插入单词,删除单词,查找单词. #define _C

算法导论:Trie字典树

1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/tra?/ “try”. Trie树可以利用字符串的公共前缀来节约存储空间.如下图所示,该trie树用10个节点保存了6个字符串pool.prize.preview.prepare.produce.progress 在该trie树中,字符串preview,prepa