如何有效地将元素插入数组的任意位置?
Posted
技术标签:
【中文标题】如何有效地将元素插入数组的任意位置?【英文标题】:How to efficiently insert an element in an arbitrary position of an array? 【发布时间】:2017-06-14 09:04:03 【问题描述】:是否有任何数据结构或算法可以像 O(1) 或 O(log(n)) 那样有效地将元素插入到数组的任意位置复杂?在 C++ 中有一个链表数据结构,它可以在 O(1) 复杂度中有效地在 iterator
位置插入元素,但要获得 iterator
到该位置需要 O(n),这是非常昂贵的。那么是否有任何数据结构可以支持void insert(int pos, int val)
这个函数,它在pos
位置之前插入一个元素val
,并且这个函数的复杂度很小?
【问题讨论】:
小就什么?你想达到什么目的?您选择一种数据结构作为解决问题的工具。 一棵树可以做到这一点,但我在 STL 中没有看到任何东西。 一个链表有 O(1) 的插入,但是找到插入点往往会支配数组中的 O(n) 插入。如今的计算机只要在内存中是连续的,就可以非常快速地转移内容。大多数时候,数组(由std::vector
实现)是最快的选择。
如果array
是一个严格的要求,我认为你在这里不走运。没有办法在小于 O(n) 的位置 i
中插入元素(保留其余元素)。如果您正在寻找其他支持插入和查找的数据结构,其复杂性比在)。 “就在之前”是什么意思?这是否意味着数据必须位于连续的内存中?
我认为如果您还写下数据结构所需的其他操作(例如查询),将会很有帮助。如果你只做插入,你可能不需要那个数据结构。
【参考方案1】:
一些支持快速“插入到位置”操作的数据结构。
Rope 或类似的自平衡树数据结构。
幕后:一个自平衡树,每个节点都包含其子树的“大小”。
插入复杂性: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))
。
【讨论】:
以上是关于如何有效地将元素插入数组的任意位置?的主要内容,如果未能解决你的问题,请参考以下文章
如何有效地将 OleVariant 数组复制到我自己的结构中?