对于有插入(范围插入)、 删除(范围删除)、 下标获取要求性能最好的数据结构是什么?

2022-06-30 16:38:55 +08:00
 wdc63

现在开发的项目对性能比较敏感,有一个列表结构频繁地会通过索引获取对象,通过下标或对象本身删除列表中的一个或多个对象,在列表中间某个位置、尾部插入一个或多个对象,请问能不能实现这种数据结构让每种方法都以 O(1)的方式进行。

2125 次点击
所在节点    程序员
28 条回复
aguesuka
2022-06-30 19:24:00 +08:00
这段代码能 O(1) 地 [添加元素返回下标] , [通过下标获得元素], [通过下标删除元素].
但是列表是无序的, 不能保证删除的幂等性.

https://github.com/aguesuka/torrent-finder/blob/dev-nio2/src/main/java/cc/aguesuka/maguet/util/ArrayHeapSpace.java
RicardoY
2022-06-30 20:53:05 +08:00
块状链表这个场景应该蛮快的,如果数据量不是太大的话,复杂度比你要求的高一点
hsfzxjy
2022-06-30 21:17:59 +08:00
了解下跳表 skip list
joetse
2022-06-30 23:15:19 +08:00
只有完美哈希可以做到,前提是无限内存
dqzcwxb
2022-06-30 23:32:55 +08:00
世间安得双全法
AllenHua
2022-07-01 09:43:18 +08:00
优先保证插入和删除是 o(1) 应该就是链表为主的结构了,但又要保证查询是 o(1) 应该是做不到的,在查询上妥协一些应该是比较理想的方案
qbqbqbqb
2022-07-01 11:51:07 +08:00
所有方法都 O(1)是不行的
可以做到所有方法都是 O(log n)

主要有两大类:
* 跳跃表( skip list ),单次操作时间复杂度为期望 O(log n),实现较为简单
* 带有 order statistics 的平衡二叉搜索树(包括 AVL, 红黑树, Splay 等多种实现),根据实现的不同,单次操作时间复杂度为期望、均摊或严格 O(log n),实现较为复杂
wdc63
2022-07-01 23:40:46 +08:00
@qbqbqbqb
@AllenHua
@aguesuka
@MoYi123
感谢,已经放弃用下标取得对象的方法了,用下标的方法主要是为了方便前台用户交互部分获取数据的逻辑,现在就用 hashset ,改写了前台的逻辑,直接获取到对象而不是下标,再在逻辑部分进行处理。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/863239

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX