【发布时间】: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中插入元素(保留其余元素)。如果您正在寻找其他支持插入和查找的数据结构,其复杂性比在)。 “就在之前”是什么意思?这是否意味着数据必须位于连续的内存中? -
我认为如果您还写下数据结构所需的其他操作(例如查询),将会很有帮助。如果你只做插入,你可能不需要那个数据结构。
标签: c++ algorithm data-structures insert time-complexity