Как эффективно вставить элемент в произвольное положение массива?

82
8

Есть ли какая-либо структура данных или алгоритм для вставки элемента в произвольное положение массива, как в O (1) или O (log (n)) сложности? В C++ имеется связанная структура данных списка, которая может эффективно вставлять элемент в позицию iterator в сложность O (1), но чтобы получить iterator в эту позицию, требуется O (n), что является очень дорогостоящим. Таким образом, любая структура данных может поддерживать эту функцию void insert(int pos, int val) которая вставляет элемент val перед позицией pos и сложность этой функции мала?

спросил(а) 2017-06-14T12:04:00+03:00 3 года, 5 месяцев назад
1
Решение
71

Некоторые структуры данных, которые поддерживают быструю операцию "вставить в позицию".

Канатные или подобные самобалансированные структуры данных дерева.

enter image description here

Под капотом: самобалансированное дерево с каждым узлом, содержащим "размер" его поддерева.

Сложная сложность: O(logn).

C++: SGI STL имеет реализацию каната в качестве расширения.

Пропустить список или изменения.

enter image description here

Под капотом: O(logn) связанные списки с узлами, ссылающимися на элементы базового списка, позволяющие пропускать элементы в списках ниже

Сложная сложность: O(logn).

C++: https://codereview.stackexchange.com/questions/116345/skip-list-implementation

Метод разложения SQRT связал структуру данных на основе списка (я не знаю, имеет ли оно имя).

enter image description here

Под капотом: двойной список с индексом. Индексный массив имеет элементы O(sqrt(n)) относящиеся к элементам списка, что позволяет пропускать элементы O(sqrt(n)) за раз.

Вставка сложности: O(sqrt(n)).

ответил(а) 2017-06-14T14:34:00+03:00 3 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема