2010-01-03 4 views
11

я был дан в качестве домашнего задания Introduction to Algorithms упражнения 11.1-3, который идет следующим образом:Реализация прямой адресной таблицы

Предложите, как реализовать таблицу прямого доступа, в которой ключи хранятся элементы не должны быть различны и элементы могут иметь спутниковые данные. Все три словарных операции (Insert, Delete и Search) должны выполняться в O (1) раз. Не забывайте, что Delete принимает в качестве аргумента указатель на объект, который нужно удалить, а не ключ.

Ну, вставка не проблема, поскольку это просто означает создание связанного списка в соответствующем месте в таблице (если оно еще не существует) и добавление к нему элемента. Поиск, которому дается ключ, может возвращать любой из элементов, которые соответствуют ключу, поэтому просто означает, что нам нужно вернуть головку соответствующего списка в таблицу.

Моя проблема заключается в удалении операции. Если я модифицирую объект, чтобы добавить к нему указатель на его узел в связанном списке, тогда я могу удалить в O (1), но я не уверен, что мне разрешено изменять объект. Есть ли способ сделать это без изменения данного объекта?

+3

+1 для публикации домашнего задания с раскрытием и показом того, что вы уже что-то пробовали. Добро пожаловать в SO – JoshJordan

+0

Стандартный список, связанный с ванилью, не даст вам производительности O (1). –

+0

@GregS - Я сказал, что могу вернуть любой элемент с соответствующим ключом, то есть я могу просто вернуть голову списка, то есть O (1). –

ответ

0

Хэш-таблицы будут работать для вас до определенной точки. После того, как вы начинаете иметь collsions, тогда он становится O (1 + k/n), где k - количество ключей, а n - ваш размер таблицы. Если вы измените размер хэша и измените его, вы можете уйти с этим. Не знаю, повлияет ли это на рейтинг эффективности, поскольку это не происходит при вставке, удалении или поиске.

Удаление, не изменяя объект, может быть достигнуто простым установкой указателя ссылки хеша на нуль. Прямое изменение объекта не производится, но сделаны изменения в контейнере объектов.

Я думаю, что для большинства ограничений, которые вы даете, хеш-таблица может быть реализована определенными способами, чтобы обойти их. На странице http://en.wikipedia.org/wiki/Hash_table#Performance_analysis есть дополнительная информация о том, как реализовать хеш-таблицу.

6

Это вопрос из книги Кормена? Насколько я понимаю, из чтения предыдущих абзацев в этой книге объект, который вы храните в таблице прямого доступа, является «вашим» объектом. Таким образом, вы можете, как вы полагаете, хранить указатели на двусвязные списки в таблице, причем каждый элемент списка имеет указатель на объект пользователя. Затем операция поиска по словарю возвращает элемент списка, и пользователь должен использовать следующий шаг для доступа к своему объекту. Аналогично, операция DELETE принимает указатель на элемент списка.

Это имеет смысл? Я не хочу испортить твою домашнюю работу!

+0

Что делать, если у вас есть список n дубликатов? Это будет O (n). –

+1

«Не забывайте, что Delete принимает в качестве аргумента указатель на объект, подлежащий удалению» - так что у вас будет список дублирующих элементов n-1. –

+0

Получил. И в этом случае вам даже не понадобится двойной список. Существует метод удаления текущего узла в O (1). Теперь не собираюсь испортить домашнюю работу ... –

1

Я думаю, вы можете использовать спутниковые данные для отображения в качестве вторичного ключа. Тогда это своего рода двухуровневая хеш-таблица. Обеспокоенный операцией DELETE, сначала мы используем первичный ключ. И когда есть повторяющиеся первичные ключи, мы используем вторичные ключи для получения объекта. Поэтому общее время все еще равно O (1).

0

Самая важная часть .. «реализовать таблицу прямого доступа, в которой ключи хранятся элементы не должны быть различны» и "словарь операция в O (1) время.

Вставка также невозможна в O (1) раз, если элементы равны (поскольку Q говорит, что элементы не обязательно должны быть разными).

Для удаления части вам необходимо взять ключи, а также объекты, которые попадают к определенному объекту, и взять ключ из спутниковых данных, чтобы достичь определенного объекта.

Я думаю, что только выше 2 идеи имеют смысл для O (1) время.

1

Мы можем использовать двойной связанный список по каждому индексу таблицы прямого адреса. Слот j будет содержать указатель на головку списка, который содержит все элементы с ключом j, и если в нем нет такого элемента, в слоте j содержится NIL. INSERT-inserting x во главе списка займет только время O (1). SEARCH- Он может возвращать любой элемент, соответствующий данному ключу, и, таким образом, возврат главы списка займет время O (1). DELETE- Поскольку мы использовали двойной связанный список, мы можем удалить элемент в O (1) раз, указав указатель на предыдущий и следующий узлы.

 Смежные вопросы

  • Нет связанных вопросов^_^