การแฮชในโครงสร้างข้อมูล: ฟังก์ชัน เทคนิค [พร้อมตัวอย่าง]
เผยแพร่แล้ว: 2021-05-02สารบัญ
บทนำ
การแฮชเป็น โครงสร้างข้อมูลที่ สำคัญที่ ออกแบบมาเพื่อแก้ปัญหาการค้นหาและจัดเก็บข้อมูลในอาร์เรย์อย่างมีประสิทธิภาพ ตัวอย่างเช่น หากคุณมีรายการตัวเลข 20000 หมายเลข และคุณได้ให้หมายเลขเพื่อค้นหาในรายการนั้น คุณจะสแกนแต่ละหมายเลขในรายการจนกว่าคุณจะพบหมายเลขที่ตรงกัน
ต้องใช้เวลาเป็นจำนวนมากในการค้นหารายการทั้งหมดและค้นหาหมายเลขเฉพาะนั้น ขั้นตอนการสแกนด้วยตนเองนี้ไม่เพียงแต่ใช้เวลานาน แต่ยังไร้ประสิทธิภาพอีกด้วย ด้วยการแฮชในโครงสร้างข้อมูล คุณสามารถจำกัดการค้นหาให้แคบลงและค้นหาตัวเลขได้ภายในไม่กี่วินาที
บล็อกนี้จะช่วยให้คุณเข้าใจวิธีการแฮช ตารางแฮช และการตรวจสอบเชิงเส้นอย่างลึกซึ้งยิ่งขึ้นพร้อมตัวอย่าง
Hashing ในโครงสร้างข้อมูลคืออะไร?
การแฮชใน โครงสร้างข้อมูล เป็นเทคนิคการแมปข้อมูลจำนวนมากลงในตารางขนาดเล็กโดยใช้ฟังก์ชันแฮช เรียกอีกอย่างว่าฟังก์ชันย่อยข้อความ เป็นเทคนิคที่ระบุเฉพาะรายการเฉพาะจากคอลเล็กชันของรายการที่คล้ายคลึงกัน
ใช้ตารางแฮชเพื่อเก็บข้อมูลในรูปแบบอาร์เรย์ แต่ละค่าในอาร์เรย์ได้กำหนดหมายเลขดัชนีที่ไม่ซ้ำกัน ตารางแฮชใช้เทคนิคในการสร้างหมายเลขดัชนีที่ไม่ซ้ำกันเหล่านี้สำหรับแต่ละค่าที่จัดเก็บไว้ในรูปแบบอาร์เรย์ เทคนิคนี้เรียกว่าเทคนิคแฮช
คุณเพียงแค่ต้องค้นหาดัชนีของรายการที่ต้องการ แทนที่จะค้นหาข้อมูล ด้วยการจัดทำดัชนี คุณสามารถสแกนรายการทั้งหมดและเรียกค้นรายการที่คุณต้องการได้อย่างรวดเร็ว การทำดัชนียังช่วยในการแทรกการดำเนินการเมื่อคุณต้องการแทรกข้อมูลในตำแหน่งเฉพาะ ไม่ว่าตารางจะใหญ่หรือเล็กก็ตาม คุณสามารถอัปเดตและเรียกข้อมูลได้ภายในไม่กี่วินาที
การแฮชใน โครงสร้างข้อมูล เป็นกระบวนการสองขั้นตอน
- ฟังก์ชันแฮชจะแปลงรายการเป็นจำนวนเต็มหรือค่าแฮชขนาดเล็ก จำนวนเต็มนี้ใช้เป็นดัชนีเพื่อเก็บข้อมูลดั้งเดิม
- มันเก็บข้อมูลในตารางแฮช คุณสามารถใช้คีย์แฮชเพื่อค้นหาข้อมูลได้อย่างรวดเร็ว
ตัวอย่างของการแฮชในโครงสร้างข้อมูล
ต่อไปนี้เป็นตัวอย่างในชีวิตจริงของ การแฮชในโครงสร้างข้อมูล -
- ในโรงเรียน ครูจะกำหนดหมายเลขม้วนที่ไม่ซ้ำกันให้กับนักเรียนแต่ละคน ต่อมาครูใช้หมายเลขม้วนนั้นเพื่อดึงข้อมูลเกี่ยวกับนักเรียนคนนั้น
- ห้องสมุดมีหนังสือมากมายนับไม่ถ้วน บรรณารักษ์กำหนดหมายเลขเฉพาะให้กับหนังสือแต่ละเล่ม ตัวเลขที่ไม่ซ้ำกันนี้ช่วยในการระบุตำแหน่งของหนังสือบนชั้นวางหนังสือ
ชำระเงิน: การเรียงลำดับในโครงสร้างข้อมูล
ฟังก์ชันแฮช
ฟังก์ชันแฮชในโครงสร้างข้อมูลจะจับคู่ขนาดข้อมูลตามอำเภอใจกับข้อมูลขนาดคงที่ ส่งคืนค่าต่อไปนี้: ค่าจำนวนเต็มขนาดเล็ก (หรือที่เรียกว่าค่าแฮช) รหัสแฮช และผลรวมของแฮช
แฮช = hashfunc (คีย์)
ดัชนี = แฮช% array_size
ฟังก์ชัน have ต้องเป็นไปตามข้อกำหนดต่อไปนี้:
- ฟังก์ชันแฮชที่ดีนั้นคำนวณได้ง่าย
- ฟังก์ชันแฮชที่ดีจะไม่ติดขัดในการจัดกลุ่มและกระจายคีย์อย่างเท่าเทียมกันในตารางแฮช
- ฟังก์ชันแฮชที่ดีจะหลีกเลี่ยงการชนกันเมื่อสององค์ประกอบหรือรายการถูกกำหนดให้เป็นค่าแฮชเดียวกัน
ตารางแฮช
การแฮชในโครงสร้างข้อมูล จะใช้ตารางแฮชเพื่อจัดเก็บคู่คีย์-ค่า ตารางแฮชใช้ฟังก์ชันแฮชเพื่อสร้างดัชนี การแฮชใช้ดัชนีเฉพาะนี้เพื่อดำเนินการแทรก อัปเดต และค้นหา
การแฮชในโครงสร้างข้อมูลทำงานอย่างไร
ในการแฮช ฟังก์ชันการแฮชจะจับคู่สตริงหรือตัวเลขกับค่าจำนวนเต็มขนาดเล็ก ตารางแฮชดึงข้อมูลจากรายการโดยใช้ฟังก์ชันแฮช วัตถุประสงค์ของเทคนิคการแฮชคือการกระจายข้อมูลอย่างเท่าเทียมกันทั่วทั้งอาร์เรย์ การแฮชจะกำหนดคีย์เฉพาะให้กับองค์ประกอบทั้งหมด ตารางแฮชใช้คีย์นี้เพื่อเข้าถึงข้อมูลในรายการ
ตารางแฮชเก็บข้อมูลในคู่คีย์-ค่า คีย์ทำหน้าที่เป็นอินพุตของฟังก์ชันแฮช ฟังก์ชัน Hashing จะสร้างหมายเลขดัชนีเฉพาะสำหรับแต่ละค่าที่เก็บไว้ หมายเลขดัชนีจะเก็บค่าที่สอดคล้องกับคีย์นั้น ฟังก์ชันแฮชคืนค่าจำนวนเต็มขนาดเล็กเป็นเอาต์พุต ผลลัพธ์ของฟังก์ชันแฮชเรียกว่าค่าแฮช
ให้เราเข้าใจ การแฮชในโครงสร้างข้อมูล ด้วยตัวอย่าง ลองนึกภาพว่าคุณต้องเก็บบางรายการ (จัดเป็นคู่คีย์-ค่า) ไว้ในตารางแฮชที่มี 30 เซลล์
ค่าต่างๆ ได้แก่ (3,21) (1,72) (40,36) (5,30) (11,44) (15,33) (18,12) (16,80) (38,99)
ตารางแฮชจะมีลักษณะดังนี้:
หมายเลขซีเรียล | สำคัญ | กัญชา | ดัชนีอาร์เรย์ |
1 | 3 | 3%30 = 3 | 3 |
2 | 1 | 1%30 = 1 | 1 |
3 | 40 | 40%30 = 10 | 10 |
4 | 5 | 5%30 = 5 | 5 |
5 | 11 | 11%30 = 11 | 11 |
6 | 15 | 15%30 = 15 | 15 |
7 | 18 | 18%30 = 18 | 18 |
8 | 16 | 16%30 = 16 | 16 |
9 | 38 | 38%30 = 8 | 8 |
อ่านเพิ่มเติม: ประเภทของโครงสร้างข้อมูลใน Python
เทคนิคการแก้ปัญหาการชนกัน
การแฮชในโครงสร้างข้อมูล จะเกิดการชนกัน ถ้าสองคีย์ถูกกำหนดหมายเลขดัชนีเดียวกันในตารางแฮช การชนกันสร้างปัญหาเนื่องจากแต่ละดัชนีในตารางแฮชควรจะเก็บค่าเดียวเท่านั้น การแฮชในโครงสร้างข้อมูล ใช้เทคนิคการแก้ปัญหาการชนกันหลายอย่างเพื่อจัดการประสิทธิภาพของตารางแฮช
โพรบเชิงเส้น
การแฮชในโครงสร้างข้อมูล ส่งผลให้ดัชนีอาร์เรย์ถูกครอบครองอยู่แล้วเพื่อเก็บค่า ในกรณีเช่นนี้ การแฮชจะทำการค้นหาและโพรบเชิงเส้นสำหรับเซลล์ว่างถัดไป
ตัวอย่างการตรวจวัดเชิงเส้น
ลองนึกภาพคุณถูกขอให้จัดเก็บบางรายการไว้ในตารางแฮชขนาด 30 รายการดังกล่าวได้รับการจัดเรียงในรูปแบบคู่คีย์-ค่าแล้ว ค่าที่กำหนด ได้แก่ (3,21) (1,72) (63,36) (5,30) (11,44) (15,33) (18,12) (16,80) (46,99) .
hash(n) คือดัชนีที่คำนวณโดยใช้ฟังก์ชันแฮช และ T คือขนาดตาราง หากดัชนีสล็อต = ( hash(n) % T) เต็ม เราจะมองหาดัชนีสล็อตถัดไปโดยเพิ่ม 1 ((hash(n) + 1) % T) ถ้า (hash(n) + 1) % T เต็ม เราก็ลอง (hash(n) + 2) % T ถ้า (hash(n) + 2) % T เต็ม เราก็ลอง (hash( n) + 3) % ต.
ตารางแฮชจะมีลักษณะดังนี้:
หมายเลขซีเรียล | สำคัญ | กัญชา | ดัชนีอาร์เรย์ | ดัชนีอาร์เรย์หลังการตรวจสอบเชิงเส้น |
1 | 3 | 3%30 = 3 | 3 | 3 |
2 | 1 | 1%30 = 1 | 1 | 1 |
3 | 63 | 63%30 = 3 | 3 | 4 |
4 | 5 | 5%30 = 5 | 5 | 5 |
5 | 11 | 11%30 = 11 | 11 | 11 |
6 | 15 | 15%30 = 15 | 15 | 15 |
7 | 18 | 18%30 = 18 | 18 | 18 |
8 | 16 | 16%30 = 16 | 16 | 16 |
9 | 46 | 46%30 = 8 | 16 | 17 |
Double Hashing
เทคนิคการแฮชแบบคู่ใช้ฟังก์ชันแฮชสองฟังก์ชัน ฟังก์ชันแฮชที่สองจะถูกนำมาใช้เมื่อฟังก์ชันแรกทำให้เกิดการชนกัน มันมีดัชนีออฟเซ็ตเพื่อเก็บค่า
สูตรสำหรับเทคนิคการแฮชแบบคู่มีดังนี้:
(firstHash(คีย์) + i * secondHash(คีย์)) % sizeOfTable
โดยที่ i คือค่าออฟเซ็ต ค่าออฟเซ็ตนี้จะเพิ่มขึ้นเรื่อย ๆ จนกว่าจะพบช่องว่าง
ตัวอย่างเช่น คุณมีฟังก์ชันแฮชสองฟังก์ชัน: h1 และ h2 คุณต้องทำตามขั้นตอนต่อไปนี้เพื่อค้นหาช่องว่าง:
- ตรวจสอบว่า hash1(key) ว่างเปล่าหรือไม่ ถ้าใช่ ให้เก็บค่าในช่องนี้
- หาก hash1(key) ไม่ว่างเปล่า ให้ค้นหาสล็อตอื่นโดยใช้ hash2(key)
- ตรวจสอบว่า hash1(key) + hash2(key) ว่างเปล่าหรือไม่ ถ้าใช่ ให้เก็บค่าในช่องนี้
- ให้เพิ่มตัวนับและทำซ้ำด้วย hash1(key)+2hash2(key), hash1(key)+3hash2(key) และอื่นๆ จนกว่าจะพบช่องว่าง
ตัวอย่าง Double Hashing
ลองนึกภาพว่าคุณต้องเก็บสิ่งของบางอย่างไว้ในตารางแฮชขนาด 20 ค่าที่ระบุคือ: (16, 8, 63, 9, 27, 37, 48, 5, 69, 34, 1)
ชั่วโมง1(n)=n%20
ชั่วโมง2(n)=n%13
nh(n, i) = (h1 (n) + ih2(n)) mod 20
น | h(n,i) = (h'(n) + i 2 ) %20 |
16 | ผม = 0, h(n,0) = 16 |
8 | ผม = 0, h(n,0) = 8 |
63 | ผม = 0, h(n,0) = 3 |
9 | ผม = 0, h(n,0) = 9 |
27 | ผม = 0, h(n,0) = 7 |
37 | ผม = 0, h(n,0) = 17 |
48 | ผม = 0, h(n,0) = 8 ผม = 0, h(n,1) = 9 ผม = 0, h(n,2) = 12 |
5 | ผม = 0, h(n,0) = 5 |
69 | ผม = 0, h(n,0) = 9 ผม = 0, h(n,1) = 10 |
34 | ผม = 0, h(n,0) = 14 |
1 | ผม = 0, h(n,0) = 1 |
บทสรุป
การแฮชแบบคู่มีค่าใช้จ่ายในการคำนวณสูง แต่จะค้นหาสล็อตว่างถัดไปได้เร็วกว่าวิธีการตรวจสอบเชิงเส้น ตัวอย่างที่ให้ไว้ในบทความมีจุดประสงค์เพื่ออธิบายเท่านั้น คุณสามารถแก้ไขข้อความที่ระบุข้างต้นได้ตามความต้องการของคุณ ในบล็อกนี้ เราได้เรียนรู้เกี่ยวกับแนวคิดของ การแฮชในโครงสร้าง ข้อมูล
คุณสามารถลองใช้ตัวอย่างเพื่อเสริมสร้างความรู้ด้านโครงสร้างข้อมูลของคุณ หากคุณอยากทราบข้อมูลเพิ่มเติมเกี่ยวกับ โครงสร้างข้อมูล ให้ดูที่ upGrad Executive PG Program ใน หลักสูตร Full Stack Development หลักสูตรนี้ออกแบบมาสำหรับมืออาชีพด้านการทำงานและมีการฝึกอบรมและการจัดหางานอย่างเข้มงวดกับบริษัทชั้นนำ
ตารางแฮชคืออะไร?
ตารางแฮชคือการนำอาเรย์ที่เชื่อมโยงมาใช้ ซึ่งเป็นโครงสร้างที่ใช้ในการเขียนโปรแกรมคอมพิวเตอร์เพื่อใช้ชนิดข้อมูลนามธรรม (ADT) ในประเภทข้อมูลนามธรรม โปรแกรมเมอร์ไม่จำเป็นต้องรู้เกี่ยวกับรายละเอียดการใช้งานของประเภทข้อมูล (เช่น วิธีจัดเก็บข้อมูลในหน่วยความจำ) เฉพาะการดำเนินการที่สามารถทำได้กับประเภทข้อมูลเท่านั้น ตารางแฮชใช้ฟังก์ชันแฮชเพื่อคำนวณดัชนีลงในอาร์เรย์ของบัคเก็ตหรือสล็อต ซึ่งสามารถหาค่าที่ต้องการได้ ตารางแฮชใช้ในการสร้างแผนที่เช่นโครงสร้างข้อมูล ตารางแฮชมีการใช้งานอย่างมากในคอมพิวเตอร์สมัยใหม่สำหรับการนำสิ่งต่าง ๆ เช่นพจนานุกรม (เช่นในไพ ธ อน) อาเรย์เชื่อมโยง (เช่นใน php) จาวาแฮชเทเบิล ฯลฯ ตารางแฮชมักจะถูกนำมาใช้ในภาษาต่าง ๆ เป็นอาร์เรย์ของค่าที่จัดเรียงตามคีย์ . ซึ่งช่วยให้ค้นหาและแทรก/ลบการดำเนินการได้อย่างรวดเร็ว เนื่องจากข้อมูลถูกจัดเก็บไว้ในหน่วยความจำอย่างเป็นระบบ
แอปพลิเคชั่นของฟังก์ชันแฮชคืออะไร?
ฟังก์ชันแฮชชิ่งใช้สำหรับแอปพลิเคชันต่างๆ ในด้านวิทยาการคอมพิวเตอร์ เช่น การเข้ารหัสและการพิมพ์ลายนิ้วมือของเอกสาร วัตถุประสงค์หลักของฟังก์ชันแฮชคือการแมปอินพุตจำนวนมากกับเอาต์พุตความยาวคงที่ ในการเข้ารหัส การใช้แฮชเพื่อให้แน่ใจว่าข้อความหรือเอกสารไม่ถูกดัดแปลง หากเอกสารหรือข้อความมีการเปลี่ยนแปลงในลักษณะใดๆ (แม้แต่อักขระเดียว) ค่าแฮชก็จะเปลี่ยนแปลงไปด้วย ดังนั้นจึงแทบเป็นไปไม่ได้ที่จะสร้างเอกสารหรือข้อความที่มีค่าแฮชที่กำหนด
เทคนิคการแก้ปัญหาการชนกันในการแฮชคืออะไร?
เทคนิคการแก้ปัญหาการชนกันในการแฮชใช้เพื่อแก้ไขการชนกันในการแฮช เทคนิคการแก้ปัญหาการชนกันนั้นมีทั้งแบบผูกมัดหรือเปิดที่อยู่ ในการผูกมัด เราคงองค์ประกอบเดิมไว้และใส่องค์ประกอบใหม่ในพื้นที่ว่างถัดไป เป็นวิธีการแก้ปัญหาการชนกันที่เรียบง่าย แต่มีข้อเสียคือประสิทธิภาพต่ำ ในการระบุที่อยู่แบบเปิด เราจะแทนที่องค์ประกอบเก่าด้วยองค์ประกอบใหม่และทำเครื่องหมายองค์ประกอบเก่าเป็นการชนกัน