Как эффективно вставить элемент в произвольное положение массива?
Есть ли какая-либо структура данных или алгоритм для вставки элемента в произвольное положение массива, как в O (1) или O (log (n)) сложности? В C++ имеется связанная структура данных списка, которая может эффективно вставлять элемент в позицию iterator
в сложность O (1), но чтобы получить iterator
в эту позицию, требуется O (n), что является очень дорогостоящим. Таким образом, любая структура данных может поддерживать эту функцию void insert(int pos, int val)
которая вставляет элемент val
перед позицией pos
и сложность этой функции мала?
Некоторые структуры данных, которые поддерживают быструю операцию "вставить в позицию".
Канатные или подобные самобалансированные структуры данных дерева.
Под капотом: самобалансированное дерево с каждым узлом, содержащим "размер" его поддерева.
Сложная сложность: O(logn)
.
C++: SGI STL имеет реализацию каната в качестве расширения.
Пропустить список или изменения.
Под капотом: O(logn)
связанные списки с узлами, ссылающимися на элементы базового списка, позволяющие пропускать элементы в списках ниже
Сложная сложность: O(logn)
.
C++: https://codereview.stackexchange.com/questions/116345/skip-list-implementation
Метод разложения SQRT связал структуру данных на основе списка (я не знаю, имеет ли оно имя).
Под капотом: двойной список с индексом. Индексный массив имеет элементы O(sqrt(n))
относящиеся к элементам списка, что позволяет пропускать элементы O(sqrt(n))
за раз.
Вставка сложности: O(sqrt(n))
.
- Вопросы
- Data-structures
- Как эффективно вставить элемент в произвольное положение массива?