zoukankan      html  css  js  c++  java
  • 基数树的应用

    1. 电子词典和单词的自动补齐

       如百度的搜索引擎,当用户输入内容后,会列出一些可能的候选搜索项。

    那么我们接下来看看如何使用基数树来实现电子词典

         我们假设词典中保存了key-Value对,key是英文单词或词组,对应的value是解释。

         当用户输入“a”的时候,词典不只给出a的意思,而且还提供一列候选单词的列表。

         查找算法为:

                             如果待查找的字符串为空,我们从当前的节点扩展出n个字节点作为候选项

                              否则递归的在有公共前缀的子分子中查找。

      

     1  def  patricia_lookup(tree,key,n):
     2      if tree is None:
     3          return None
     4      prefix = ""
     5      while True:
     6          match = False
     7          for k, tr in tree.children.items():
     8              #如果key时k的前缀,则通过expand方法返回以keykey为前缀的单词
     9              if string.find(k,key) == 0:
    10                  return expand(prefix+k,tr,n)
    11              #如果k是key的前缀,则另prefix += k,在子分支中继续查找key[len(k):]
    12              if string.find(key,k) == 0:
    13                  match = True
    14                  key = key[len[k]:]
    15                  tree = tr
    16                  prefix += k
    17                  break
    18          if not match:
    19              return None
    20  def expand(prefix,t,n):
    21      res = []
    22      q =[(prefix,t)]
    23      while len(res) < n and len(q) >0:
    24          (s, p) = q.pop(0)
    25          if p.value is not None:
    26              res.expand((s,p.value))
    27          for k, tr in p.children.items():
    28              q.append((s+k, tr))
    29      return res

     例子2:T9输入法

     1 import string
     2 T9map ={
     3     '2':"abc",'3':"def",'4':"ghi",'5':"jkl",
     4     '6':"mno",'7':"pqrs",'8':"tuv",'9':"wxyz"
     5 }
     6 
     7 def patricia_lookup_t9(t,key):
     8     if t is None or key == "":
     9         return None
    10     q = [("",key,t)]
    11     res =[]
    12     while len(q)>0:
    13         (prefix,key,t) = q.pop(0)
    14         for k, tr in t.children.items():
    15             digits = T9map(k)
    16             if string.find(key,digits) == 0:
    17                 if key == digits:
    18                     res.append((prefix+k,tr.value))
    19                 else:
    20                     q.append((prefix+k,key[len(k):],tr))
    21     return res
  • 相关阅读:
    poj 3661
    hdu 4291 && hdu 4296
    codeforces LCM Challenge
    ural 1286
    Exhange2007 专题(一)特性 部署
    Research Http error code
    Exhange2007 专题(二)通过Web service对Exhange进行二次开发
    YouTube 架构学习体会
    .net framework 4.0环境下遇到版本不同编译不通过的解决办法
    利用ASP.NET MVC2进行网站验证
  • 原文地址:https://www.cnblogs.com/lytyq/p/7664053.html
Copyright © 2011-2022 走看看