Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

โครงสร้างข้อมูลตารางแฮชใน Javascript


Hash Table เป็นโครงสร้างข้อมูลที่จัดเก็บข้อมูลในลักษณะที่เชื่อมโยงกัน ในตารางแฮช ข้อมูลจะถูกจัดเก็บในรูปแบบอาร์เรย์ โดยที่ค่าข้อมูลแต่ละค่ามีค่าดัชนีเฉพาะของตัวเอง การเข้าถึงข้อมูลจะเร็วมากหากเราทราบดัชนีของข้อมูลที่ต้องการ

ดังนั้นจึงกลายเป็นโครงสร้างข้อมูลที่การแทรกและการค้นหาทำได้เร็วมากโดยไม่คำนึงถึงขนาดของข้อมูล ตารางแฮชใช้อาร์เรย์เป็นสื่อเก็บข้อมูลและใช้เทคนิคแฮชเพื่อสร้างดัชนีที่จะแทรกองค์ประกอบหรือจะตั้งอยู่

การแฮช

การแฮชเป็นเทคนิคในการแปลงช่วงของค่าคีย์เป็นช่วงของดัชนีของอาร์เรย์ เราจะใช้ตัวดำเนินการโมดูโลเพื่อรับช่วงของค่าคีย์ ลองพิจารณาตัวอย่างตารางแฮชขนาด 20 และรายการต่อไปนี้จะถูกเก็บไว้ รายการอยู่ในรูปแบบ (คีย์, ค่า)

โครงสร้างข้อมูลตารางแฮชใน Javascript

ที่นี่ เรามีฟังก์ชันแฮชที่รับคีย์และสร้างดัชนีสำหรับตาราง ดัชนีเหล่านี้ทำให้เราทราบว่าค่าถูกเก็บไว้ที่ใด ตอนนี้เมื่อใดก็ตามที่เราต้องการค้นหาค่าที่เกี่ยวข้องกับคีย์ เราเพียงแค่เรียกใช้ฟังก์ชันแฮชบนคีย์อีกครั้ง และรับค่าในเวลาเกือบคงที่

ฟังก์ชั่นแฮชนั้นค่อนข้างยากในการออกแบบ มาดูตัวอย่างกัน −

สมมติว่าเรามีฟังก์ชันแฮชต่อไปนี้ -

ตัวอย่าง

function modBy11(key) {
   return key % 11;
}

และเราเริ่มทำงานกับคู่คีย์-ค่าที่เราต้องการจัดเก็บ เช่น −

  • (15, 20) - รหัสแฮช:4
  • (25, 39) - รหัสแฮช:3
  • (8, 55) - รหัสแฮช:8
  • (26, 84) - รหัสแฮช:4

ที่นี่เราเห็นว่าเรามีการชนกัน กล่าวคือ ถ้าเราเก็บ 15 ไว้ก่อนแล้วพบคีย์ 26 ด้วยฟังก์ชันแฮชนี้ จะพยายามแก้ไขรายการนี้ในรูเดียวกัน นี้เรียกว่าการชนกัน และเพื่อจัดการกับสถานการณ์ดังกล่าว เราจำเป็นต้องกำหนดกลไกจัดการการชนกัน มีอัลกอริธึมการแก้ปัญหาการชนกันที่เรียบง่ายที่กำหนดไว้อย่างดี ตัวอย่างเช่น −

  • การตรวจสอบเชิงเส้น:ในอัลกอริธึมนี้ เราสามารถค้นหาตำแหน่งว่างถัดไปในอาร์เรย์โดยดูในเซลล์ถัดไปจนกว่าเราจะพบเซลล์ว่าง ในตัวอย่างของเรา เนื่องจากถ่ายหลุมที่ 4 เราจึงเติมลงใน 5 ได้
  • Separate Chaining:ในการใช้งานนี้:เราเชื่อมโยงแต่ละตำแหน่งในตารางแฮชกับรายการ เมื่อใดก็ตามที่เราเกิดการชนกัน เราจะผนวกคู่คีย์-ค่าต่อท้ายรายการนี้ ซึ่งอาจนำไปสู่เวลาการค้นหาที่นานขึ้นหากโซ่ยาวขึ้นเรื่อยๆ

ตอนนี้เราเข้าใจวิธีการทำงานของตารางแฮชแล้วและเราจะใช้วิธีการแก้ปัญหาการชนกันได้อย่างไร มาลองใช้คลาส HashTable กัน

วิธีการที่เราจะนำไปใช้

เราจะนำวิธีการเหล่านี้ไปปฏิบัติในการใช้งานของเรา -

  • put(key, value):เพิ่มคู่คีย์-ค่าใหม่ในตารางแฮช
  • get(key):รับค่าที่เกี่ยวข้องกับคีย์
  • remove(key):ลบคู่คีย์-ค่าออกจากตาราง
  • forEach():อนุญาตการวนซ้ำคู่คีย์-ค่าทั้งหมด
  • static join():วิธีการแบบสแตติกในการรวมตารางแฮช 2 ตารางในตารางใหม่