Как создать структуру данных с ограничениями по времени выполнения - PullRequest
2 голосов
/ 13 сентября 2010

Мне нужно реализовать структуру данных, которая поддерживает удаление вставки и поиск в O (log (n)) и извлечение специального объекта в O (1). Моя структура данных должна содержать транспортные средства, отсортированные по их идентификатору, и у каждого транспортного средства есть поле, в котором указано время до следующего обслуживания. Мне нужно извлечь транспортные средства, которые должны были быть сервисами, в O (1). Все предложения приветствуются.

Я понял, что мне нужны две отдельные структуры данных, и я подумал о том, чтобы иметь 1 набор и 1 очередь приоритетов, отсортированные по другим параметрам, но содержащие копию одного и того же указателя. У меня проблема в том, что когда я пытаюсь удалить из структуры "set", я остаюсь с мусором в другой структуре данных (очередь с приоритетами).

1 Ответ

3 голосов
/ 13 сентября 2010

Хеш-таблица будет поддерживать вставку, удаление и поиск гораздо лучше, чем O (log (n)). Это предполагает, что вам никогда не придется повторно хэшировать все, когда вы увеличиваете таблицу. Трудной частью было бы найти «следующий» автомобиль за время O (1).

В зависимости от реализации, min куча даст вам между O (1) и O (log (n)) (амортизированная) вставка, и нахождение минимального элемента O (1). Удаление элемента из кучи является операцией O (log (n)), но обнаружение произвольного элемента в куче превышает O (log (n)).

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

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

...