是否有任何数据结构或算法可以有效地将元素插入到数组的任意位置,如 O(1)或 O(log(n))复杂?在 C ++ 中,有一个链表数据结构,它可以有效地在 O(1)复杂度的iterator
位置插入一个元素,但是要得到{{ 1}}到那个位置需要 O(n)这是非常昂贵的。那么有没有任何数据结构可以支持这个函数iterator
,它在位置void insert(int pos, int val)
之前插入一个元素val
,并且这个函数的复杂性很小?
答案 0 :(得分:2)
一些数据结构支持快速插入位置'操作
Rope或类似的自平衡树数据结构。
引擎盖下:一个自我平衡的树,每个节点都包含“' size'它的子树。
插入复杂性:O(logn)
。
C ++实现:SGI STL将绳索实现作为扩展。
Skip list或修改。
引擎:O(logn)
链接列表,其节点引用基础列表的元素,允许跳过下面列表中的元素
插入复杂性:O(logn)
。
C ++实施:https://codereview.stackexchange.com/questions/116345/skip-list-implementation
SQRT decomposition 基于技术链接列表的数据结构(我不知道它是否有名称)。
引擎盖下:带索引数组的双链表。索引数组有O(sqrt(n))
个元素引用列表的元素,允许一次跳过O(sqrt(n))
个元素。
插入复杂性:O(sqrt(n))
。