2009-05-05 10 views
4

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

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

Например, если есть (журнал N) равномерно распределенных столкновений, и каждое столкновение происходит O (к), чтобы решить, где к текущий размер хеш-таблицы, то вы бы это рекуррентное соотношение:

T(n) = T(n/2) + n/2 + n/2 

(то есть вы тратите время на вставку n/2 элементов, тогда у вас есть столкновение, принимающее n/2 для разрешения, тогда вы делаете оставшиеся n/2 вставки без столкновения). Это все еще заканчивается O (n), поэтому yay. Но разве это разумно?

ответ

5

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

+0

Обратите внимание, что во многих реализациях вы можете указать ожидаемый размер полной хэш-карты. Поэтому, если n известно до того, как вы начнете заполнять карту, ожидаемое время выполнения все равно O (1). – gnud

+0

@gnud, это был мой точный момент; переименование необходимо только в том случае, если вы ошиблись в исходном размере (или получите следующий размер неправильно и вам нужно снова перефразировать и т. д.). –

+0

Да, я знаю - вы писали об оценке размера во второй раз. Я думал, что должен упомянуть, что часто можно указать размер в первый раз =) – gnud

0

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

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

5

Люди говорят, что амортизация O (1) помещается в хэш-таблицу.

С теоретической точки зрения, это ожидается амортизируется O (1).

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

Вы можете ожидать достижения амортизируется O (1) с помощью dynamic perfect hashing:

Наивная я первоначально размещен был перефразировать с новой случайной хэш-функции на каждом столкновении. (См. Также perfect hash functions) Проблема заключается в том, что для этого требуется O (n^2) пространство, от парадокса рождения.

Решение состоит из двух столовых столов, со второй таблицей для столкновений; разрешить конфликты на этом втором столе, восстановив его. В этой таблице будут элементы O (\ sqrt {n}), поэтому они будут расти до размера O (n).

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

+0

Итак, вот мой вопрос. Вы говорите: «Все, что вам нужно для удовлетворения ожидаемой амортизации O (1), заключается в том, чтобы развернуть таблицу и перефразировать все с помощью новой случайной хэш-функции в любое время столкновения». Предположим, вы это сделаете. Если у вас нет столкновения с n вставками, то у вас есть O (n), определенно. Но каково ожидаемое количество столкновений на n элементов и сколько времени нужно принимать каждый раз? Затем мы можем получить более точное число для n вставок в хеш-таблицу. Что-то вроде O (n + #col * coltime) - возможно, O (n + (log n)^2)? – Claudiu

+0

Исправлено. Я забыл, что трюк состоял в том, чтобы иметь второй стол; простое переключение на каждое столкновение потребует O (n^2) пространства из-за парадоксальности дня рождения. –

1

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

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

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

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

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