【发布时间】:2023-03-31 19:29:01
【问题描述】:
我正在寻找一种具有高效插入、删除和查找的数据结构,二叉树通常可以满足这种要求,但是我的项目不是根据它们的值排序的——而是我需要根据它们的实际值对它们进行排序插入位置(即像一个数组)。所有操作都将基于此位置访问、插入或删除项目,就像使用数组一样。
- getItem(int position)
- addItem(int insertPosition, object item)
- removeItem(int position)
所以基本上问题是插入/删除一个项目会导致它之后的所有项目的索引移动 1。显然存储索引永远不会产生比 O(n) 更好的结果,所以基本的二叉树/哈希表已经不存在了.
是否有一种结构能够在亚线性时间内实现所有这些操作?我一直认为可以以某种方式调整二叉树,并且我会通过让每个节点存储其左分支中的节点数来支持按索引查找。
【问题讨论】:
-
可能我理解错了,为什么不能用数组呢?
-
只使用一个对象,因为您不需要自动维护索引。它会比数组快,比手工编写的花哨代码快得多。
-
@dandavis 大概,在特定位置调用“addItem”会改变所有后续元素的位置。
-
有什么理由不使用以位置作为键的哈希表? (如果这在 javascript 中可能只是一个通用对象)。如果您需要在中间添加时移动位置,我认为您在 addItem 低于 O(N) 时运气不佳,因为根据定义,它平均需要执行 N/2 次操作。
-
@dandavis,根据定义,点移位是一项线性任务,所以如果这是一个要求,我认为他不能在这里做他想做的事。
标签: javascript .net data-structures