Можно ли реализовать очередь, используя только хэш-таблицу? - PullRequest
0 голосов
/ 04 декабря 2018

Я имею в виду, что реализация может выделять только небольшой (O (1) / O (log n)) объем памяти независимо - большая часть данных очереди должна быть внутри хеш-таблицы.

РЕДАКТИРОВАТЬ: эта структура данных должна поддерживать операции (Push, Pop, Top, Len), но под капотом, вместо того, чтобы быть связанным списком / массивом, она будет использовать хэш-таблицу.Необходимая большая часть O (n) памяти будет храниться в хеш-таблице.

1 Ответ

0 голосов
/ 04 декабря 2018

Любая подобная списку структура данных может быть представлена ​​хеш-таблицей, где каждый элемент в списке сопоставлен со своей позицией.Таким образом, этот список: [a, b, c, d] может быть представлен такой хеш-таблицей, как эта:

0: a
1: b
2: c
3: d

Очередь - это структура данных FIFO: сначала во-первых, то, во-первых.Таким образом, элементы отображаются в том же порядке, в котором они были нажаты.Его можно смоделировать с помощью структуры данных, подобной списку, в которой мы помещаем новые элементы в список, добавляя их в хвост, и добавляем элементы, извлекая их из головы.

, реализация может выделять тольконебольшой (O (1) / O (log n)) объем памяти независимо

Единственными необходимыми данными, которые нужно обрабатывать независимо от самой хеш-таблицы, являются индексы head и tail.

Итак, используя пример [a, b, c, d], наша голова указывает на индекс 0 (что соответствует a), а наш хвост на индекс 3 (что соответствует d).

Чтобы вставить новый элемент в очередь (например, e), мы вставляем его в нашу хеш-таблицу с ключом tail + 1, то есть 4, и увеличиваем наш tail на 1.

Чтобы вытолкнуть элемент, мы получаем элемент в позиции head, удаляем его из хеш-таблицы и увеличиваем head на 1.

После этого наша хеш-таблица заканчивается следующим образом:

1: b
2: c
3: d
4: e

В этой реализации top и len тривиальны для implement.

Эта базовая идея может быть расширена для обработки более сложных хеш-таблиц.

...