返回信息流☆─────────────────────────────────────☆
camelBUPT (迷茫的人) 于 (Tue Oct 27 09:49:56 2009) 提到:
☆─────────────────────────────────────☆
windfail (目采冥夕绛) 于 (Tue Oct 27 09:50:53 2009) 提到:
排序树?
☆─────────────────────────────────────☆
ericyosho (ericyosho) 于 (Tue Oct 27 10:21:27 2009) 提到:
平衡二叉树?
红黑树?
不懂也来凑热闹@@
☆─────────────────────────────────────☆
camelBUPT (迷茫的人) 于 (Tue Oct 27 10:27:30 2009) 提到:
http://blog.csdn.net/romandion/archive/2008/05/09/2421370.aspx
可以参考一下,不过我没看懂。
☆─────────────────────────────────────☆
camelBUPT (迷茫的人) 于 (Tue Oct 27 10:30:06 2009) 提到:
感觉像B-树。
【 在 camelBUPT 的大作中提到: 】
: http://blog.csdn.net/romandion/archive/2008/05/09/2421370.aspx
: 可以参考一下,不过我没看懂。
☆─────────────────────────────────────☆
allen0308 (明光村小村长) 于 (Tue Oct 27 10:35:01 2009) 提到:
若为非负整数,bitmap应该最好,O(1)
其他情况下RBT也不错,O(lgn)
☆─────────────────────────────────────☆
camelBUPT (迷茫的人) 于 (Tue Oct 27 10:38:32 2009) 提到:
需要的是支持高效插入,删除,查询的数据结构。
【 在 allen0308 的大作中提到: 】
: 若为非负整数,bitmap应该最好,O(1)
: 其他情况下RBT也不错,O(lgn)
☆─────────────────────────────────────☆
allen0308 (明光村小村长) 于 (Tue Oct 27 10:44:33 2009) 提到:
这还不够高效么?
bitmap---对于某数i,插入置bitmap[i]为1,删除置bitmap[i]为0,查询直接bitmap[i]==1即可,当然前提数非负非重复整数集
RBT--除线性的hashtable外,应该也算高效的了吧
【 在 camelBUPT 的大作中提到: 】
: 需要的是支持高效插入,删除,查询的数据结构。
☆─────────────────────────────────────☆
jmpesp (垃圾|人渣|缅甸果敢第一司令) 于 (Tue Oct 27 10:50:27 2009) 提到:
【 在 allen0308 的大作中提到: 】
: 这还不够高效么?
: bitmap---对于某数i,插入置bitmap[i]为1,删除置bitmap[i]为0,查询直接bitmap[i]==1即可,当然前提数非负非重复整数集
: RBT--除线性的hashtable外,应该也算高效的了吧
数据大了,这个bitmap的空间也不容小视吧?还有检索这个所谓的i因为数组是有序的,所以用二分查找复杂度也有O(lgn)吧,所以综合各个方面来讲,用Bitmap的复杂度应该不是O(1)。还有,频繁的增删,用bitmap会导致碎片是不是很大呢?
☆─────────────────────────────────────☆
camelBUPT (迷茫的人) 于 (Tue Oct 27 10:52:01 2009) 提到:
恩,也行哈。
不过貌似可以结合数组和链表来设计一种满足这种需求的数据结构。
【 在 allen0308 的大作中提到: 】
: 这还不够高效么?
: bitmap---对于某数i,插入置bitmap[i]为1,删除置bitmap[i]为0,查询直接bitmap[i]==1即可,当然前提数非负非重复整数集
: RBT--除线性的hashtable外,应该也算高效的了吧
☆─────────────────────────────────────☆
allen0308 (明光村小村长) 于 (Tue Oct 27 11:05:39 2009) 提到:
那就可以用数组做hash table,而当插入时发生collision的情况下,则可以用list来解决。
但最坏情况的复杂度不能保证
【 在 camelBUPT 的大作中提到: 】
: 恩,也行哈。
: 不过貌似可以结合数组和链表来设计一种满足这种需求的数据结构。
☆─────────────────────────────────────☆
allen0308 (明光村小村长) 于 (Tue Oct 27 13:17:24 2009) 提到:
恩,用bitmap时也要看数据集是什么样的,如果数很少,但范围很大则用bitmap就没必要了。空间需要权衡。
检索bitmap时直接判断bitmap[i]==1就可以找到i了,没必要二分,时间是有保证的。
碎片这个问题我不是很清楚的。
【 在 jmpesp 的大作中提到: 】
: 数据大了,这个bitmap的空间也不容小视吧?还有检索这个所谓的i因为数组是有序的,所以用二分查找复杂度也有O(lgn)吧,所以综合各个方面来讲,用Bitmap的复杂度应该不是O(1)。还有,频繁的增删,用bitmap会导致碎片是不是很大呢?
☆─────────────────────────────────────☆
Django (贱狗) 于 (Tue Oct 27 13:25:17 2009) 提到:
hash链表
跳表
☆─────────────────────────────────────☆
jmpesp (垃圾|人渣|缅甸果敢第一司令) 于 (Tue Oct 27 15:27:45 2009) 提到:
【 在 allen0308 的大作中提到: 】
: 恩,用bitmap时也要看数据集是什么样的,如果数很少,但范围很大则用bitmap就没必要了。空间需要权衡。
: 检索bitmap时直接判断bitmap[i]==1就可以找到i了,没必要二分,时间是有保证的。
: 碎片这个问题我不是很清楚的。
查找bitmap[i]==1这个不是那么简单吧。。。如果我要查找某条记录,也要经过一个检索过程吧?所以bitmap[i]==1如何时间有保证呢~~
☆─────────────────────────────────────☆
allen0308 (明光村小村长) 于 (Tue Oct 27 15:33:17 2009) 提到:
如果你说的记录是整数的话:
以32bits interger为例,查找整数i是否在bitmap中的操作为
int test(int i)
{
return bitmap[i>>5] & ( 1 << ( i & 0x1f ) ) ;
}
这当然是常数时间
【 在 jmpesp 的大作中提到: 】
: 查找bitmap[i]==1这个不是那么简单吧。。。如果我要查找某条记录,也要经过一个检索过程吧?所以bitmap[i]==1如何时间有保证呢~~
☆─────────────────────────────────────☆
jmpesp (垃圾|人渣|缅甸果敢第一司令) 于 (Tue Oct 27 15:39:13 2009) 提到:
【 在 allen0308 的大作中提到: 】
: 如果你说的记录是整数的话:
: 以32bits interger为例,查找整数i是否在bitmap中的操作为
: int test(int i)
: ...................
你看来不明白我意思了~~我的意思是说,假设我们要检索数组内的某一条记录,那么如何根据这个bitmap来保证时间?
☆─────────────────────────────────────☆
allen0308 (明光村小村长) 于 (Tue Oct 27 15:50:25 2009) 提到:
没太明白你的意思...具体点儿?
【 在 jmpesp 的大作中提到: 】
: 你看来不明白我意思了~~我的意思是说,假设我们要检索数组内的某一条记录,那么如何根据这个bitmap来保证时间?
☆─────────────────────────────────────☆
jmpesp (垃圾|人渣|缅甸果敢第一司令) 于 (Tue Oct 27 15:58:55 2009) 提到:
【 在 allen0308 的大作中提到: 】
: 没太明白你的意思...具体点儿?
举个例子吧,假设有序数组a[] = { 1,3,4,27,44,89,565,777,777,888...}
现在,我要对数据777进行删除,那么,你这个要获得对应的bitmap的i是不是要对数组有一个检索过程吧?
☆─────────────────────────────────────☆
allen0308 (明光村小村长) 于 (Tue Oct 27 16:08:43 2009) 提到:
你所说的是用数组存储
而我的意思是根本没有这个你说的这个整数数组,只有bitmap。将整数 1,3,4,27,44,89,565,777,777,888...对应到bitmap中相应的bit位上并置为1,其余位为0。删除777时将bitmap[777]置为0即可,置0方法类似test,常数时间。所以没有检索过程。
【 在 jmpesp 的大作中提到: 】
: 举个例子吧,假设有序数组a[] = { 1,3,4,27,44,89,565,777,777,888...}
: 现在,我要对数据777进行删除,那么,你这个要获得对应的bitmap的i是不是要对数组有一个检索过程吧?
☆─────────────────────────────────────☆
jmpesp (垃圾|人渣|缅甸果敢第一司令) 于 (Tue Oct 27 16:18:51 2009) 提到:
【 在 allen0308 的大作中提到: 】
: 你所说的是用数组存储
: 而我的意思是根本没有这个你说的这个整数数组,只有bitmap。将整数 1,3,4,27,44,89,565,777,777,888...对应到bitmap中相应的bit位上并置为1,其余位为0。删除777时将bitmap[777]置为0即可,置0方法类似test,常数时间。所以没有检索过程。
哇,这个。。。其实你这个就是hash~~这个空间占用会吓死人的~~
☆─────────────────────────────────────☆
allen0308 (明光村小村长) 于 (Tue Oct 27 16:23:24 2009) 提到:
呵呵,所以我说空间需要权衡的,就看数据集是什么样了,空间换时间嘛。32bits的interger理论上得占0.5G。
其实我觉得最好的方法应该是hash+list了
【 在 jmpesp 的大作中提到: 】
: 哇,这个。。。其实你这个就是hash~~这个空间占用会吓死人的~~
☆─────────────────────────────────────☆
jmpesp (垃圾|人渣|缅甸果敢第一司令) 于 (Tue Oct 27 16:31:49 2009) 提到:
【 在 allen0308 的大作中提到: 】
: 呵呵,所以我说空间需要权衡的,就看数据集是什么样了,空间换时间嘛。32bits的interger理论上得占0.5G。
: 其实我觉得最好的方法应该是hash+list了
恩,算法这种东西很值得考虑,权衡的东西太多了,还是得具体问题具体分析~~
☆─────────────────────────────────────☆
snowdown (公子陌离) 于 (Tue Oct 27 18:52:50 2009) 提到:
我觉得用AVL实现比较合适吧
这是一条镜像帖。来源:北邮人论坛 / cpp / #32849同步于 2009/12/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[合集] 需要保存一组有序数据,这组数据需要高速的检索,并增删
shenlei
2009/12/6镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
软件群里讨论过这个问题
hash + array
hashtable里存的是array的index
有序输出的时候遍历array O(n)
搜索的时候通过链表 O(1)
增删数据的时候对链表进行基于比较和交换的排序 在交换的过程中要交换hashtable中的index O(nlogn)
内存占用 O(n)+T(n) T(n)是hashtable所占用的空间 当存储元素大小大大超过整形数时 O(n)+T(n) = O(n)
在各方面都趋近理论上的下限了