`
Hooopo
  • 浏览: 329117 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Autocompete with Trie

    博客分类:
  • Ruby
阅读更多
像微薄里面用户输入一个@会从服务器取出匹配的用户login name什么的。这种场景用前缀树比较节省空间并且效率高。fast trie——A super fast, efficiently stored Trie for Ruby。据作者说速度是灰常的快。。
地址:https://github.com/tyler/trie
gem install fast_trie


require 'trie'

TRIE = Trie.new

#初始化数据
User.all.each do |user|
  TRIE.add(user.login_name, 0)
end

#js调用autocomplete
def autocomplete
    children = sort_by_weight(TRIE.children(params[:prefix]))

    respond_to do |format|
      format.js { render(:string => JSON.dump(children)) }
    end
  end

根据用户的输入行为给某个key增加权重(用于搜索排序):
def incr_weight(login_name, n = 1)
  weight = TRIE.get(login_name) || 0
  TRIE.add(login_name, weight + n)
end

#根据权重给结果排序
def sort_by_weight(login_name_list)
  login_name_list.sort_by{|login_name|  TRIE.get(login_name)}
end


这东西的性能不错啊 这是测试数据,看样子比那个redis的autocomplete要简单高效呀:
引用
Performance Characteristics

Here are some quick benchmarks on my 2.4ghz Intel Core 2 Duo MacBook Pro:

For keys that are 5 characters long:
31,344 adds/second
1,827,408 searches/second
38,453 prefixes searches/second

For keys that are 10 characters long:
30,653 adds/second
1,802,649 searches/second
13,553 prefix searches/second

For keys that are 20 characters long:
30,488 adds/second
1,851,461 searches/second
5,855 prefix searches/second

For keys that are 40 characters long:
30,710 adds/second
1,838,380 searches/second
2,762 prefix searches/second


不过好像不能被序列化。这样在多进程部署的时候有点麻烦呀。再研究一下。。
3
1
分享到:
评论
1 楼 Hooopo 2011-04-20  

相关推荐

    trie-0.1.1.tar

    trie-0.1.1.tar

    trie树的实现(C)

    trie.c中定义了trie树的操作函数; trie.h为相应的头文件; test.c用于测试相关的函数。 在trie.c中,关于查找定义了两个函数,一个是find(),一个是search(),二者的区别是,前者仅判断一个字符串是否在树中出现,...

    用Trie树实现词频统计和单词查询

    一个简单的C语言程序:用Trie树实现词频统计和单词查询

    hat-trie, 一种有效的trie实现.zip

    hat-trie, 一种有效的trie实现 hat 这是Askitis和Sinha的hat trie数据结构的ANSI实现,它是一个非常高效的( 空间和时间) 现代变体。这里实现的版本将字节数组映射到单词( 。例如,无符号的longs ),它可以以用来存储...

    Python实现Trie树

    用Python实现Trie树的应用,并可以对英汉词典进行导入和检索、添加和删除,最终可以将导入的英汉词典保存到本地磁盘。内附两个.py文件,分别是tree.py和d_gui.py,tree.py是类和方法,d_gui.py是图形界面;一个.txt...

    Trie树 linux32 SDK V3.0

    2、Trie树SDK中的API支持以下功能 1)插入节点 2)精确删除节点 3)正向模糊匹配 4)反向模糊匹配 5)精确查询节点 6)获取头(尾)节点 7)删除头(尾)节点 8)排序 9)支持多级树 10)支持强大的查询节点功能 ...

    基于双数组Trie_树中文分词研究

    对双数纽Trie 树(Double-Array Trie)分词算法进行了优化:在采用Trie 树构造 双数纽Trie 树的过程中,优先处理分支节点多的结点,以减少冲突;构造一个空状态序列; 将冲突的结点放入Hash表中,不需要重新分配...

    trie树模板,acm竞赛

    trie树模板,acm竞赛,可以进行适当的修改就可以解决问题,在进行字符串处理的时候尤其能用到。

    从trie树谈到后缀树

    网上大神的总结,从trie树谈到后缀树,常用的字符串匹配算法

    双数组Trie树算法优化及其应用研究.

    Double Array Trie是TRIE树的一种变形,它是在保证TRIE树检索速度的前提下,提高空间利用率而提出的一种数据结构,本质上是一个确定有限自动机(deterministic finite automaton,简称DFA)。 所谓的DFA就是一个能实现...

    C++/C Trie树算法

    用C实现的数据结构Trie树算法 实验的函数的trie树的插入 搜索和删除

    实现Trie_java_

    实现一个Trie

    Algorithm-trie.zip

    Algorithm-trie.zip,trie(又称前缀树)c实现。具有常量时间字符串前缀查找。,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。

    Trie 树实现的源码

    Trie 树实现的源码,用C++编写实现,做自然语言处理的朋友可以参考一下

    基本Trie树的实现

    Trie是一种树型数据结构,用于存储字符串,可以实现字符串的快速查找。Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 适用范围:统计和排序大量的字符串

    trie数组的算法实现

    libdatrie是一个泰国人写的构建双数组TRIE树的开源代码。

    双数组 DoubleArray Trie树的数组实现 双数组字典

    Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现。它本质上是一个确定的有限状态自动机(DFA),每个节点代表自动机的一个状态。在...

    double-array-trie原理与算法

    double-array-trie原理与算法实现探索,dat算法分析

    实现trie树的C/C++模板

    建立trie树,并进行相关操作,包括 insert:插入一个字符串,重复插入无效 remove:删除指定的字符串,如果不存在,则不进行操作 find:判断是否有指定的字符串

Global site tag (gtag.js) - Google Analytics