百度空间 | 百度首页 
               
 
查看文章
 
在线好友列表与数据结构(2) - Radix Tree
2008-09-11 19:57
Presence and Data Structure - Part II

1) Hash table
在讨论Radix Tree之前先看下 hash table, 它是目前大家都很熟悉使用非常广泛的一种数据结构。它的算法复杂度是O(1)

/**
* Roster item cache - table: key jabberid string; value roster item.
*/
protected ConcurrentHashMap<String, RosterItem> rosterItems =
new ConcurrentHashMap<String, RosterItem>();

(Openfire class org.jivesoftware.openfire.roster.Roster)

2) Radix Tree

(图片来源:Wikipedia)

Radix Tree 是如图所示一种数据结构,对于小量范围有一定相似度的字符串具有较高的insert/delete/lookup性能。它的这几个操作算法复杂度是 O(k), k指key长度。与hash table相比,虽然O(k) > O(1)。但是 hash table的O(1)没有考虑计算hash所需时间及hash冲突的时间
。因此在某些情况下Radix Tree性能比hash table好也不足为奇。

性能比较

我们使用Google code中的 Radix Tree Java Library实现,
hash table使用Java Collection中的HashMap

1千万数据,每50个为一组,插入50个5位长的随机数,在达到30个之后再每次删除一个元素。考虑到实际应用中号码段可能会趋于集中,而且为了更好的测试Radix Tree,测试再在所有的号码前加上固定前缀1000。

执行时间:
HashMap 2秒
RadixTree 20秒

虽然构造的测试场景有利于Radix Tree, 但是测试结果是Radix Tree完全不适合此场景。而且还有不足的是上述Radix Tree库没有实现iterator()接口。

参看:
在线好友状态列表与数据结构(1)-list
在线好友列表与数据结构(3) - 平衡二叉树

类别:编程 | 添加到搜藏 | 浏览() | 评论 (3)
 
最近读者:
 
网友评论:
2
2008-09-13 21:16 | 回复
你可以看看prefuse的Table表结构相同实现。 相信这种每个用户数据量不大的好友,大量查询,少量删除增加的场合下,这个是一种很好的解决方案。 表的一行就是一个好友。对好友的号码(纯数字)建RB-Tree的索引。查好友时通过索引。同时增删也很快,并且最坏的情况是可以知道的。 这个开源项目的动画图形后台数据结构,所有的动画都是实时的,后台的数据结构也是证明相当快的。或者你把你的测试用例发给我,我来测试一下。
 
3
2008-09-22 23:08 | 回复
我后续文章会比较
 
4
2008-10-25 07:08 | 回复
Radix Tree只是在查询的时候快,插入和删除并不见得有多快。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu