Jump to content

Линейное хеширование

Линейное хеширование ( LH ) — это динамическая структура данных, которая реализует хеш-таблицу и увеличивает или сжимает одну корзину за раз. Его изобрел Витольд Литвин в 1980 году. [1] [2] Его проанализировали Баеза-Йейтс и Соза-Полман. [3] Это первая из ряда схем, известных как динамическое хеширование. [3] [4] такие как линейное хеширование Ларсона с частичным расширением, [5] Линейное хеширование с разделением приоритетов, [6] Линейное хеширование с частичным расширением и разделением приоритетов, [7] или рекурсивное линейное хеширование. [8]

Файловая структура структуры данных динамического хеширования адаптируется к изменениям размера файла, что позволяет избежать дорогостоящей периодической реорганизации файла. [4] Файл линейного хеширования расширяется за счет разделения заранее определенного сегмента на два и сжимается за счет объединения двух заранее определенных сегментов в один. Повод для реконструкции зависит от разновидности схемы; это может быть переполнение сегмента или коэффициент загрузки (т. е. количество записей, разделенное на количество сегментов), выходящий за пределы заранее определенного диапазона. [1] В линейном хешировании есть два типа сегментов: те, которые должны быть разделены, и те, которые уже разделены. В то время как расширяемое хеширование разделяет только переполненные сегменты, спиральное хеширование (также известное как спиральное хранилище) распределяет записи по сегментам неравномерно, так что сегменты с высокими затратами на вставку, удаление или извлечение оказываются первыми в очереди на разделение. [5]

Линейное хеширование также было преобразовано в масштабируемую распределенную структуру данных LH* . В LH* каждый сегмент находится на отдельном сервере. [9] Сам LH* был расширен, чтобы обеспечить доступность данных в случае сбоя сегментов. [10] Операции на основе ключей (вставка, удаление, обновление, чтение) в LH и LH* занимают максимальное постоянное время, независимое от количества сегментов и, следовательно, записей. [1] [10]

Детали алгоритма [ править ]

Записи в LH или LH* состоят из ключа и содержимого, причем последнее в основном включает все остальные атрибуты записи. [1] [10] Их хранят в ведрах. Например, в реализации Эллиса сегмент представляет собой связанный список записей. [2] Файл позволяет выполнять операции CRUD на основе ключей, создавать или вставлять, читать, обновлять и удалять, а также выполнять операции сканирования, при которых сканируются все записи, например, для выполнения операции выбора базы данных по неключевому атрибуту. [10] Записи хранятся в сегментах, нумерация которых начинается с 0. [10]

Ключевое отличие от таких схем, как расширяемое хеширование Феджина, заключается в том, что по мере расширения файла за счет вставок одновременно разбивается только один сегмент, а порядок разделения сегментов уже предопределен. [11]

Хэш-функции [ править ]

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

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

Выполните приведенные ниже расчеты, чтобы определить правильную функцию хеширования для данного ключа хеширования. . [10]

# l represents the current level
# s represents the split pointer index
a = h_l(c)
if (a < s): a = h_{l+1}(c)

Разделенное управление [ править ]

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

Управляемое разделение происходит, если разделение выполняется всякий раз, когда коэффициент загрузки , который отслеживается файлом, превышает заранее определенный порог. [10] Если хэш-индекс использует контролируемое разделение, сегменты могут переполняться с помощью связанных блоков переполнения. Когда коэффициент загрузки превышает установленный порог, сегмент, назначенный указателем разделения, разделяется. Вместо использования коэффициента загрузки этот порог также можно выразить как процент занятости, и в этом случае максимальное количество записей в хеш-индексе равно (процент занятости) * (максимальное количество записей на непереполненную корзину) * (количество ведра). [12]

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

Сжатие файла происходит в некоторых реализациях алгоритма LH, если контролируемое разделение приводит к падению коэффициента загрузки ниже порогового значения. В этом случае будет запущена операция слияния, которая отменит последнее разделение и сбросит состояние файла. [10]

Разделить указатель [ править ]

Индекс следующего разделяемого сегмента является частью состояния файла и называется указателем разделения. . Указатель разделения соответствует первому сегменту, который использует хэш-функцию. вместо . [10]

Например, если числовые записи вставляются в хэш-индекс в соответствии с их крайними правыми двоичными цифрами, сегмент, соответствующий добавленному сегменту, будет разделен. Таким образом, если у нас есть сегменты, помеченные как 000, 001, 10, 11, 100, 101, мы разделим сегмент 10, потому что мы добавляем и создаем следующий последовательный сегмент 110. Это даст нам сегменты 000, 001, 010. , 11, 100, 101, 110. [12]

Когда сегмент разделен, указатель разделения и, возможно, уровень обновляются в соответствии со следующим: уровень равен 0, когда индекс линейного хеширования имеет только 1 сегмент. [10]

# l represents the current level
# s represents the split pointer index
s = s + 1
if (s >= 2^l): 
    l = l + 1
    s = 0

ЛХ* [ править ]

Основной вклад LH* заключается в том, чтобы позволить клиенту файла LH* найти корзину, в которой запись сохраняется, даже если клиент не знает состояние файла. Клиенты фактически хранят свою версию состояния файла, которая изначально представляет собой просто знание первого сегмента, а именно сегмента 0. На основе состояния файла клиент вычисляет адрес key и отправляет запрос в эту корзину. В сегменте запрос проверяется и, если запись не находится в корзине, она пересылается. В достаточно стабильной системе, т.е. если во время обработки запроса происходит только одно разделение или слияние, это может показать, что существует не более двух нападающих. После пересылки последний сегмент отправляет Сообщение о настройке изображения для клиента, состояние которого теперь ближе к состоянию распространяемого файла. [10] Хотя форварды достаточно редки для активных клиентов, их число может быть еще больше сокращено за счет дополнительного обмена информацией между серверы и клиенты [13]

Другая недвижимость [ править ]

Расчет состояния файла [ править ]

Состояние файла состоит из разделенного указателя и уровень . Если исходный файл начинался с ведер, затем количество ведер и состояние файла связаны через [13]

.

в языковых Принятие системах

Грисволд и Таунсенд [14] обсудили внедрение линейного хеширования в языке Icon . Они обсудили альтернативы реализации алгоритма динамических массивов , используемого в линейном хешировании, и представили сравнение производительности с использованием списка тестовых приложений Icon.

в системах данных Принятие баз

Линейное хеширование используется в системе баз данных Беркли (BDB) , которая, в свою очередь, используется во многих программных системах, используя реализацию C, полученную из статьи CACM и впервые опубликованную в Usenet в 1988 году Эсмондом Питтом.

Ссылки [ править ]

  1. ^ Jump up to: Перейти обратно: а б с д Литвин, Витольд (1980), «Линейное хеширование: новый инструмент для адресации файлов и таблиц» (PDF) , Proc. 6-я конференция по очень большим базам данных : 212–223.
  2. ^ Jump up to: Перейти обратно: а б Эллис, Карла Шлаттер (июнь 1987 г.), «Параллелизм в линейном хешировании», Транзакции ACM в системах баз данных , 12 (2): 195–217, doi : 10.1145/22952.22954 , S2CID   14260177
  3. ^ Jump up to: Перейти обратно: а б Баеза-Йейтс, Рикардо; Соза-Полман, Гектор (1998), «Пересмотренный анализ линейного хеширования» (PDF) , Nordic Journal of Computing : 70–85, S2CID   7497598 , заархивировано из оригинала (PDF) 7 марта 2019 г.
  4. ^ Jump up to: Перейти обратно: а б Энбоди, Ричард; Ду, ХК (июнь 1988 г.), «Схемы динамического хеширования», ACM Computing Surveys , 20 (2): 85–113, doi : 10.1145/46157.330532 , S2CID   1437123
  5. ^ Jump up to: Перейти обратно: а б Ларсон, Пер-Оке (апрель 1988 г.), «Динамические хэш-таблицы», Communications of the ACM , 31 (4): 446–457, doi : 10.1145/42404.42410 , S2CID   207548097
  6. ^ Рухте, Уиллард; Тарп, Алан (февраль 1987 г.), «Линейное хеширование с разделением приоритетов: метод повышения производительности поиска при линейном хешировании», Третья международная конференция IEEE по инженерии данных : 2–9.
  7. ^ Манолопулос, Яннис; Лоренцос, Н. (1994), «Производительность схем линейного хеширования для поиска первичного ключа», Information Systems , 19 (5): 433–446, doi : 10.1016/0306-4379(94)90005-1
  8. ^ Рамамоханарао, К.; Сакс-Дэвис, Р. (сентябрь 1984 г.), «Рекурсивное линейное хеширование», Транзакции ACM в базах данных , 9 (3): 369–391, doi : 10.1145/1270.1285 , S2CID   18577730
  9. ^ Литвин, Витольд; Неймат, Мари-Анн; Шнайдер, Донаван А. (1993), «LH: линейное хеширование для распределенных файлов», ACM SIGMOD Record , 22 (2): 327–336, doi : 10.1145/170036.170084 , S2CID   259938726
  10. ^ Jump up to: Перейти обратно: а б с д и ж г час я дж к Литвин, Витольд; Мусса, Рим; Шварц, Томас (сентябрь 2005 г.), «LH*RS — высокодоступная масштабируемая распределенная структура данных» , Транзакции ACM в системах баз данных , 30 (3): 769–811, doi : 10.1145/1093382.1093386 , S2CID   1802386
  11. ^ Феджин, Рональд; Нивергельт, Юрг; Пиппенджер, Николас; Стронг, Рэймонд (сентябрь 1979 г.), «Расширяемое хеширование — метод быстрого доступа к динамическим файлам» , Транзакции ACM в системах баз данных , 4 (2): 315–344, doi : 10.1145/320083.320092 , S2CID   2723596
  12. ^ Jump up to: Перейти обратно: а б Зильбершац, Авраам; Корт, Генри Ф.; Сударшан, С. (2020). Концепции системы баз данных (Седьмое изд.). Нью-Йорк, штат Нью-Йорк: McGraw-Hill Education. ISBN  978-1-260-08450-4 .
  13. ^ Jump up to: Перейти обратно: а б Чабкинян, Хуан; Шварц, Томас (2016), «Fast LH*», Международный журнал параллельного программирования , 44 (4): 709–734, doi : 10.1007/s10766-015-0371-8 , S2CID   7448240
  14. ^ Грисволд, Уильям Г .; Таунсенд, Грегг М. (апрель 1993 г.), «Проектирование и реализация динамического хеширования для наборов и таблиц в Icon» , Software: Practice and Experience , 23 (4): 351–367, doi : 10.1002/spe.4380230402 , S2CID   11595927

Внешние ссылки [ править ]

См. также [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 355e78ccea5bda1a7d9744dd6d432b1f__1721068920
URL1:https://arc.ask3.ru/arc/aa/35/1f/355e78ccea5bda1a7d9744dd6d432b1f.html
Заголовок, (Title) документа по адресу, URL1:
Linear hashing - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)