如何有效地将元素插入数组的任意位置?

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 数组复制到我自己的结构中?

如何有效地将树状数据结构插入 postgres

如何有效地将数据插入索引丰富的 oracle db?

迭代数组并在索引处插入元素

在 C# 中有效地将字符串转换为字节数组(不使用编码)[重复]

有效地将聚合列激发到 Set