Блог пользователя tasyrkin

Автор tasyrkin, 12 лет назад, По-русски

Всем доброго вечера. В книге Кормена "Введение в алгоритмы" имеется следующее описание функции DELETE для хэш таблицы (раздел 11.2): CHAINED-HASH-DELETE [T, x], где T — хэш таблица, а x удаляемый элемент. В ячейке хэш таблицы хранится начало двунаправленного списка. В книге постулируется, что удаление стоит O(1) по времени, если список двунаправленный. Может кто-нибудь объяснить как можно удалить элемент из двунаправленного списка за константу, ведь в функцию передается не элемент списка, а элемент, который находится в поле data элемента списка?

  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

В функцию передается элемент списка. По-моему, из текста вполне понятно.

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

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

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      "Обратите внимание на то, что процедура CHAINED_HASH_DELETE принимает в качестве аргумента элемент x, а не его ключ, поэтому нет необходимости в предварительном поиске x" Читайте внимательнее

»
12 лет назад, # |
  Проголосовать: нравится -9 Проголосовать: не нравится

Читайте Кормена как следует, а не по диагонали, и не будете задавать такие вопросы.

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

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    Спасибо за совет, так и пытаюсь читать: как следует, а не по диагонали, однако вопрос всё же не снят. Что будет, если элементов будет в несколько раз больше, чем ячеек? После определения функций идёт анализ их вычислительной сложности, и там выведено, что сложность поиска O(1+a), где а — load factor, что отличается от О(1).

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится -8 Проголосовать: не нравится

      Во всех практических реализациях хеш-таблицы поддерживается load factor примерно 0.75-0.8 (точно не помню), поэтому ожидание остается O(1).

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится

        Насколько я понял, Кормен не говорит о "всех практических реализациях" в разделе 11.2, а о конкретной функции CHAINED_HASH_DELETE. Посмотрите ответ andrey_s.

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится -8 Проголосовать: не нравится

          Я его ответ посмотрел. Вам не понятно, почему удаление по указателю произвольного элемента из двусвязного списка работает за О(1)? Или что Вам еще не понятно?

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

Не вижу смысла в двунаправленном списке для хеш-таблицы. операция delete почти никогда не нужна (в ACM). Если и нужно удалить элемент, по значению ли, по ссылке ли, можно его найти и удалить за O(1) аммортизированную.
Не вижу необходимости удалять за чёткую O(1) (не амортизированную, а просто O(1)), если и нужно, то можно ссылкой считать не указатель на элемент, а указатель на тот, что ему предшествует, тогда удаление из однонаправленного списка также можно делать за чёткую единицу времени.