Хеш таблица в структурата на данните: Python Пример

⚡ Умно обобщение

Хеш таблицата в структурата на данните съхранява стойностите като двойки ключ-стойност, използвайки хеш функция за съпоставяне на всеки ключ с индекс за бързо търсене. Този ресурс обяснява хеш функциите, колизиите, верижното свързване, сондирането, операциите и... Python примери, включително вградения речник.

  • 🔑 Основна идея: Хеш таблицата съхранява двойки ключ-стойност, където хеш функцията преобразува всеки ключ в индекс на масив.
  • 🧮 Хеш функция: Често срещана формула използва оператора на модул, h(k) = k % m, за да запази ключовете в рамките на размера на таблицата.
  • 💥 Сблъсъци: Когато два ключа се съпоставят с един и същ индекс, верижното свързване или сондирането разрешава конфликта.
  • Изпълнение: Търсенето, вмъкването и изтриването в хеш таблицата отнема средно O(1) време, независимо от размера на набора от данни.
  • 🐍 Python Пример: Вграденият тип речник е хеш таблица, която управлява хеширането и колизиите автоматично.

Какво е хеширане?

Хешът е стойност с фиксирана дължина и се генерира с помощта на математическа формула. Хеш стойностите се използват при компресиране на данни, криптология и т.н. При индексирането на данни хеш стойностите се използват, защото имат фиксиран размер на дължина, независимо от стойностите, които са били използвани за генерирането им. Той кара хеш стойностите да заемат минимално място в сравнение с други стойности с различна дължина.

Хеш функцията използва математически алгоритъм за преобразуване на ключа в хеш. Сблъсък възниква, когато хеш функция произвежда една и съща хеш стойност за повече от един ключ.

Какво е хеш таблица?

A ХЕШ ТАБЛИЦА е структура от данни, която съхранява стойности, използвайки двойка ключове и стойности. На всяка стойност се присвоява уникален ключ, който се генерира с помощта на хеш функция.

Името на ключа се използва за достъп до свързаната с него стойност. Това прави търсенето на стойности в хеш-таблица много бързо, независимо от броя на елементите в хеш-таблицата.

Hash функции

Например, ако искаме да съхраняваме записи на служители и всеки служител е уникално идентифициран с помощта на номер на служител.

Можем да използваме номера на служителя като ключ и да присвоим данните на служителя като стойност.

Горният подход ще изисква допълнително свободно пространство от порядъка на (m * n2) където променливата m е размерът на масив, а променливата n е броят на цифрите за номера на служителя. Този подход създава проблем с пространството за съхранение.

Хеш функцията решава горния проблем, като получава номера на служителя и го използва за генериране на хеш целочислена стойност, фиксирани цифри и оптимизиране на пространството за съхранение. Целта на хеш функцията е да създаде ключ, който ще се използва за препращане към стойността, която искаме да съхраним. Функцията приема стойността за запазване, след което използва алгоритъм за изчисляване на стойността на ключа.

Следното е пример за проста хеш функция

h(k) = k1 % m

ТУК,

  • h(k) е хеш функцията, която приема параметър k. Параметърът k е стойността, за която искаме да изчислим ключа.
  • k1 % m е алгоритъмът за нашата хеш функция, където k1 е стойността, която искаме да съхраним, а m е размерът на списъка. Използваме оператора на модула, за да изчислим ключа.

Пример

Да приемем, че имаме списък с фиксиран размер 3 и следните стойности

[1,2,3]

Можем да използваме горната формула, за да изчислим позициите, които всяка стойност трябва да заема.

Следното изображение показва наличните индекси в нашата хеш таблица.

Хеш функции

Стъпка 1) Изчислете позицията, която ще бъде заета от първата стойност по този начин

h(1) = 1 % 3

= 1

Стойността 1 ще заемат пространството на индекс 1

Стъпка 2) Изчислете позицията, която ще бъде заета от втората стойност

h(2) = 2 % 3

= 2

Стойността 2 ще заемат пространството на индекс 2

Стъпка 3) Изчислете позицията, която ще бъде заета от третата стойност.

h(3) = 3 % 3

= 0

Стойността 3 ще заемат пространството на индекс 0

Краен резултат

Нашата попълнена хеш таблица сега ще бъде както следва.

Хеш функции

Качества на добра хеш функция

Една добра хеш функция трябва да има следните качества.

  • Формулата за генериране на хеш трябва да използва стойността на данните, която да се съхранява в алгоритъма.
  • Хеш функцията трябва да генерира уникални хеш стойности дори за входни данни, които имат същото количество.
  • Функцията трябва да минимизира броя на сблъсъци. Сблъсъци възникват, когато една и съща стойност се генерира за повече от една стойност.
  • Стойностите трябва да се разпределят последователно между всички възможни хешове.

стълкновение

Сблъсък възниква, когато алгоритъмът генерира един и същ хеш за повече от една стойност.

Нека разгледаме един пример.

Да предположим, че имаме следния списък от стойности

[3,2,9,11,7]

Да приемем, че размерът на хеш-таблицата е 7 и ще използваме формулата (k1 % m), където m е размерът на хеш-таблицата.

Следната таблица показва хеш стойностите, които ще бъдат генерирани.

ключ Алгоритъм за хеширане (k1 % m) Хеш стойност
3 3% 7 3
2 2% 7 2
9 9% 7 2
11 11% 7 4
7 7% 7 0

Както можем да видим от горните резултати, стойностите 2 и 9 имат една и съща хеш стойност и не можем да съхраняваме повече от една стойност на всяка позиция.

Даденият проблем може да бъде решен чрез използване на верига или сондиране. Следващите раздели обсъждат веригите и сондирането подробно.

Оковаване

Верижното свързване е техника, която се използва за решаване на проблема със сблъсъка чрез използване на свързани списъци, всеки от които има уникален индекс.

Следното изображение визуализира как изглежда верижен списък

Оковаване

И 2, и 9 заемат един и същ индекс, но се съхраняват като свързани списъци. Всеки списък има уникален идентификатор.

Предимства на верижните списъци

Следните са предимствата на верижните списъци:

  • Верижните списъци имат по-добра производителност при вмъкване на данни, тъй като редът на вмъкване е O(1).
  • Не е необходимо да преоразмерявате хеш таблица, която използва верижен списък.
  • Той може лесно да побере голям брой стойности, стига да има свободно място.

Сондиране

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

Методите за сондиране са следните:

Начин на доставка Descriptйон
Линейно сондиране Точно както подсказва името, този метод търси празни слотове линейно, започвайки от позицията, където е настъпил сблъсъкът и се движи напред. Ако краят на списъка е достигнат и не е намерен празен слот. Сондирането започва от началото на списъка.
Квадратично сондиране Този метод използва изрази на квадратен полином, за да намери следващия наличен свободен слот.
Double хеширане Тази техника използва вторичен алгоритъм за хеш функция, за да намери следващия свободен наличен слот.

Използвайки нашия горен пример, хеш-таблицата след използване на сондиране ще изглежда както следва:

Сондиране

Операции с хеш таблици

Ето ги Operaфункции, поддържани от хеш таблици:

  • вмъкване - това Operation се използва за добавяне на елемент към хеш-таблицата
  • Търсене - това Operation се използва за търсене на елементи в хеш-таблицата с помощта на ключа
  • Изтриване - това Operation се използва за изтриване на елементи от хеш-таблицата

Операция за вмъкване на данни

Операцията за вмъкване се използва за съхраняване на стойности в хеш-таблицата. Когато нова стойност се съхрани в хеш-таблицата, й се присвоява индексен номер. Индексният номер се изчислява с помощта на хеш функцията. Хеш функцията разрешава всички сблъсъци, които възникват при изчисляване на индексния номер.

Операция за търсене на данни

Операцията за търсене се използва за търсене на стойности в хеш-таблицата с помощта на номера на индекса. Операцията за търсене връща стойността, която е свързана с номера на индекса за търсене. Например, ако съхраним стойността 6 в индекс 2, операцията за търсене с индекс номер 2 ще върне стойността 6.

Операция за изтриване на данни

Операцията за изтриване се използва за премахване на стойност от хеш таблица. За да изтриете Operaцията се извършва с помощта на номера на индекса. След като дадена стойност бъде изтрита, индексният номер се освобождава. Може да се използва за съхраняване на други стойности чрез операцията за вмъкване.

Внедряване на хеш таблица с Python Пример

Нека да разгледаме прост пример, който изчислява хеш стойността на ключ

def hash_key( key, m):
    return key % m


m = 7

print(f'The hash value for 3 is {hash_key(3,m)}')
print(f'The hash value for 2 is {hash_key(2,m)}')
print(f'The hash value for 9 is {hash_key(9,m)}')
print(f'The hash value for 11 is {hash_key(11,m)}')
print(f'The hash value for 7 is {hash_key(7,m)}')

Хеш таблица Code Обяснение

Хеш таблица Code Обяснение

ТУК,

  1. Дефинира функция hash_key, която приема параметрите key и m.
  2. Използва проста модулна операция за определяне на хеш стойността
  3. Дефинира променлива m, която се инициализира със стойност 7. Това е размерът на нашата хеш таблица
  4. Изчислява и отпечатва хеш стойността на 3
  5. Изчислява и отпечатва хеш стойността на 2
  6. Изчислява и отпечатва хеш стойността на 9
  7. Изчислява и отпечатва хеш стойността на 11
  8. Изчислява и отпечатва хеш стойността на 7

Изпълнението на горния код води до следните резултати.

The hash value for 3 is 3
The hash value for 2 is 2
The hash value for 9 is 2
The hash value for 11 is 4
The hash value for 7 is 0

Python Пример за речник

Python идва с вграден тип данни, наречен речник. Речникът е пример за хеш таблица. Той съхранява стойности с помощта на двойка ключове и стойности. Хеш стойностите се генерират автоматично за нас и всички сблъсъци се разрешават за нас във фонов режим.

Следващият пример показва как можете да използвате тип данни от речник в python 3

employee = {
    'name': 'John Doe',
    'age': 36,
    'position': 'Business Manager.'
}

print (f"The name of the employee is {employee['name']}")
employee['position'] = 'Software Engineer'
print (f"The position of {employee['name']} is {employee['position']}")
employee.clear()

print (employee)

Python Пример за речник

ТУК,

  1. Дефинира служител на речникова променлива. Името на ключа се използва за съхраняване на стойността John Doe, възрастта съхранява 36, а позицията съхранява стойността Business Manager.
  2. Извлича стойността на името на ключа и го отпечатва в терминала
  3. Актуализира стойността на ключовата позиция до стойността Софтуерен инженер
  4. Отпечатва стойностите на името и позицията на ключовете
  5. Изтрива всички стойности, които се съхраняват в променливата на нашия речник
  6. Отпечатва стойността на служител

Изпълнението на горния код води до следните резултати.

The name of the employee is John Doe.
The position of John Doe is a Software Engineer.
{}

Анализ на сложността

Хеш таблиците имат средна времева сложност O (1) в най-добрия случай. Най-лошият случай на времева сложност е O(n). Най-лошият сценарий възниква, когато много стойности генерират един и същ хеш ключ и трябва да разрешим сблъсъка чрез изследване.

Приложения от реалния свят

В реалния свят хеш-таблиците се използват за съхраняване на данни за

  • Данни
  • Асоциативни масиви
  • Комплекти
  • Кеш памет

Предимства на хеш таблиците

Ето плюсовете/ползите от използването на хеш таблици:

  • Хеш таблиците имат висока производителност при търсене на данни, вмъкване и изтриване на съществуващи стойности.
  • Времевата сложност за хеш таблиците е постоянна, независимо от броя на елементите в таблицата.
  • Те се представят много добре дори когато работят с големи набори от данни.

Недостатъци на хеш таблиците

Ето недостатъците на използването на хеш таблици:

  • Не можете да използвате нулева стойност като ключ.
  • Сблъсъците не могат да бъдат избегнати при генериране на ключове с помощта на. хеш функции. Сблъсъци възникват, когато се генерира ключ, който вече се използва.
  • Ако функцията за хеширане има много сблъсъци, това може да доведе до намаляване на производителността.

Въпроси и Отговори

Масивът използва последователни целочислени индекси, така че намирането на елемент по стойност означава сканиране. Хеш таблицата съпоставя всеки ключ с индекс чрез хеш функция, давайки средно O(1) търсене, вмъкване и изтриване, независимо от размера.

Коефициентът на натоварване е съотношението на съхранените записи към общия брой слотове в хеш таблица. Високият коефициент на натоварване увеличава колизиите и забавя операциите, така че много реализации преоразмеряват и хешират отново, след като коефициентът на натоварване премине праг.

Верижното свързване съхранява колизиращите се ключове в свързани списъци на всяко място, така че таблицата може да съдържа повече елементи, отколкото слотове. Отвореното адресиране (сондиране) запазва всички записи в масива, търсейки следващия свободен слот. Верижното свързване се справя по-добре с голямо натоварване.

Хеширането поддържа изкуствения интелект чрез хеширане на характеристики или хеширащ трик, който картографира големи текстови или категорични характеристики във вектор с фиксиран размер. Това спестява памет и ускорява обучението, въпреки че колизиите на хеширане могат да обединят различни характеристики.

Да. Изкуственият интелект може да предлага дизайни на хеш функции, да ги тества за равномерно разпределение и да оценява процентите на колизии върху примерни данни. Това помага за сравняване на опции, но все пак трябва да сравните функцията с реалното си натоварване, преди да я внедрите.

Обобщете тази публикация с: