返回   cpper编程论坛 > 算法
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2008-08-01
wqqafnd 的头像
高级会员
 
注册日期: 2004-10-08
帖子: 193
文章: 1
wqqafnd 正向着好的方向发展
发送 MSN 消息给 wqqafnd
默认 求大量数据 插入、删除 和 查询排序位置 的方案

有百万量级的数据,放入一个数据结构里,要求有快速的插入、删除和搜索操作,还要查询每个元素在所有元素中的排序位置序号,该怎样解决这个问题?

比如,对于(2,3,4,7,9)这几个数据,我不仅需要找到它们,还要知道每个数字在总数据中的排位(0,1,2,3,4)。由于需要随时插入、删除数据,用数组排序应该不可行。

我的想法是修改平衡二叉树(AVL或RB TREE)的实现,增加一个记录每个节点的左子(包括孙子等)个数的字段,在每次插入节点的时候修改路径上每个节点的值。但问题是旋转树的节点的时候,会比较复杂,而且还不知道是否可行(rb tree可能需要向上递归旋转),还有删除的时候可能更加麻烦。

我想问问还有其他的实现方法吗,或者求证一下我的想法是否可行,谢谢各位!
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2008-08-01
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,135
文章: 20
polyrandom 正向着好的方向发展
默认 回复: 求大量数据 插入、删除 和 查询排序位置 的方案

这个数据类型有序吗?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2008-08-04
wqqafnd 的头像
高级会员
 
注册日期: 2004-10-08
帖子: 193
文章: 1
wqqafnd 正向着好的方向发展
发送 MSN 消息给 wqqafnd
默认 回复: 求大量数据 插入、删除 和 查询排序位置 的方案

引用:
作者: polyrandom 查看帖子
这个数据类型有序吗?
当然是有序类型,为了简化可以当成是int。需要进行的操作是:插入新数据,删除已有数据,和查询特定数据在整个序列里的排序位置(序号)。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2008-08-04
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 843
文章: 7
bankrock 正向着好的方向发展
默认 回复: 求大量数据 插入、删除 和 查询排序位置 的方案

可以做到所有操作都是O(lgn)的算法在算法导论的14章讲过,简单的说是在RbTree里记录每个节点的子节点数,插入、删除、查找节点和查找排序位置都是O(lgn)时间复杂度
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2008-08-05
wqqafnd 的头像
高级会员
 
注册日期: 2004-10-08
帖子: 193
文章: 1
wqqafnd 正向着好的方向发展
发送 MSN 消息给 wqqafnd
默认 回复: 求大量数据 插入、删除 和 查询排序位置 的方案

引用:
作者: bankrock 查看帖子
可以做到所有操作都是O(lgn)的算法在算法导论的14章讲过,简单的说是在RbTree里记录每个节点的子节点数,插入、删除、查找节点和查找排序位置都是O(lgn)时间复杂度
开始我的想法也差不多,而且RB Tree已有现成的实现,只需修改一下。不过觉得:
1. 当元素量很大时,插入、删除操作需要修改的值个数(树的深度)比较多,因为只要是路径上的节点,都需要修改;
2. 旋转节点的时候比较麻烦,特别是删除算法本来就很复杂了。

后来跟同事讨论了一下,觉得使用B+ Tree可能会简单一些:
1. 本来每个叶子节点都记录了自己的元素个数,只需给内部节点的每个指针加一个字段,记录所指向的子树的节点个数就可以了;
2. 由于B+ Tree的深度比较少,插入、删除元素的时候需要修改的值个数会少一些;
3. B+ Tree没有旋转问题,只有分裂和合并节点,在内部节点的指针发生变化时,修改计数值比较容易;
4. 查询排序位置的复杂度也是O(lgn)。

不知各位觉得怎么样?或者有更好的办法。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2008-08-05
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 843
文章: 7
bankrock 正向着好的方向发展
默认 回复: 求大量数据 插入、删除 和 查询排序位置 的方案

理论上说时间复杂度都差不多,可能某个常数项小些,还是都编个模型实际比较一下吧。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 12:17 PM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0