ความแตกต่างระหว่างแฮชกับพจนานุกรมคืออะไร


46

ความแตกต่างระหว่างHashและDictionaryคืออะไร?

มาจากพื้นหลังของสคริปต์ฉันรู้สึกว่ามันคล้ายกัน แต่ฉันต้องการค้นหาความแตกต่างที่แน่นอน Googling ไม่ได้ช่วยฉันเท่าไหร่

คำตอบ:


92

Hashเป็นโครงสร้างข้อมูลที่มีชื่อไม่ดีนักที่โปรแกรมเมอร์สับสนอินเตอร์เฟซกับการนำไปใช้ ( และขี้เกียจเกินกว่าที่จะเขียนชื่อเต็มเช่นHashTableแทนที่จะหันไปใช้ตัวย่อHash)

Dictionaryคือชื่อ"ถูกต้อง"ของอินเทอร์เฟซ (= the ADT ) คือคอนเทนเนอร์ที่เชื่อมโยงที่แมปคีย์ (โดยทั่วไปจะไม่ซ้ำกัน) กับค่า (ไม่จำเป็นต้องไม่ซ้ำกัน)

ตารางแฮชเป็นหนึ่งในการนำไปใช้งานของพจนานุกรมดังกล่าวซึ่งมีลักษณะการเข้าถึงค่อนข้างดี (ในแง่ของรันไทม์) และดังนั้นจึงมักจะเป็นการใช้งานเริ่มต้น

การใช้งานดังกล่าวมีคุณสมบัติที่สำคัญสองประการ:

  1. กุญแจที่จะต้องมีการhashableและความเท่าเทียมกันเทียบเคียง
  2. รายการปรากฏในลำดับโดยเฉพาะในพจนานุกรม

(สำหรับคีย์ที่จะแฮชหมายถึงเราสามารถคำนวณค่าตัวเลขจากคีย์ซึ่งจะใช้เป็นดัชนีในอาร์เรย์ในภายหลัง)

มีการใช้งานทางเลือกอื่นของโครงสร้างข้อมูลพจนานุกรมที่กำหนดการสั่งซื้อบนคีย์ - ซึ่งมักเรียกว่าพจนานุกรมเรียง (และมักจะนำมาใช้ในแง่ของโครงสร้างการค้นหาแม้ว่ามีการใช้งานที่มีประสิทธิภาพอื่น ๆ )


ในการสรุป: พจนานุกรมคือ ADT ที่จับคู่คีย์กับค่า ADT นี้มีการนำไปใช้ที่เป็นไปได้หลายอย่างซึ่งตารางแฮชนั้นเป็นที่หนึ่ง Hashเป็นชื่อเรียกผิด แต่ในบริบทมันเทียบเท่ากับพจนานุกรมที่นำมาใช้ในแง่ของตารางแฮช


4
เพื่อให้ตัวอย่างใน C ++ เทมเพลตคอนเทนเนอร์ที่เชื่อมโยงมาตรฐานไม่สามารถนำไปใช้เป็นแฮชได้แม้ว่ามาตรฐานถัดไปจะมีตารางแฮชที่มีประสิทธิภาพ พวกเขาถูกเรียกunordered_mapให้แสดงสิ่งที่พวกเขาทำมากกว่าสิ่งที่พวกเขาเป็น
David Thornley

6
“ ถูกต้อง” ตามอำนาจอะไร? ในบางภาษาเช่น Ruby และ Perl ชื่อทางการ - อ่าน "ถูกต้อง" - สำหรับโครงสร้างเหล่านี้คือ "แฮช"
nohat

11
@nohat: สังเกตการใช้คำพูดของฉัน นอกจากนี้ฉันได้อธิบายว่าทำไมชื่อจึงเลือกไม่ดีใช่ไหม ดังนั้นถ้าคุณต้องการอำนาจแล้วฉันจะบอกว่ามันเป็นอำนาจของตำรวจวิทยาศาสตร์ทางทฤษฎี
Konrad Rudolph

9
ที่น่าสนใจคือใน Ruby 1.9 มันเป็นไปไม่ได้ที่จะนำHashคลาสมาใช้กับตารางแฮชเนื่องจาก Ruby 1.9 Hashes รักษาลำดับการแทรกในขณะที่ตารางแฮชไม่ได้ ดังนั้นใน Ruby 1.9 ชื่อHashไม่ได้สะท้อนถึงการนำไปใช้อีกต่อไป
Jörg W Mittag

7
@hippietrail คุณผิด - ก่อนอื่นนั่นคือคำอธิบายวัตถุประสงค์ ท้ายที่สุดฉันมีคุณสมบัติทำไมการตั้งชื่อไม่ดีและเรียกชื่อผิด (ดูด้านล่าง) “ ขี้เกียจเกินไป” เป็นสิทธิ์ใช้งานทางศิลปะในส่วนของฉัน แต่ประเด็นก็คือเหตุผลที่ทำให้ชื่อสั้นลงคือสิ่งที่อยู่ภายในนั่นคือไม่มีเหตุผลที่จะใช้ชื่อย่อที่นี่นอกเหนือจากทำให้ชื่อสั้นลง และคุณคิดผิดเกี่ยวกับ "พจนานุกรม" นั่นเป็นเพียงชื่อทางการของโครงสร้างข้อมูล คำจำกัดความของ“ พจนานุกรม” ของคุณนั้นผิดในบริบทของวิทยาการคอมพิวเตอร์และชื่อของ Python นั้นมีมาหลายทศวรรษ
Konrad Rudolph

8

"พจนานุกรม" เป็นชื่อของแนวคิด hashtable เป็นการใช้งานที่เป็นไปได้


1
แฮชยังเป็น ADT HashTable เป็นการใช้งาน Hash
Sairam

3
@Sairam ฉันคิดว่ามันธรรมดากว่าสำหรับ 'hash' ที่จะหมายถึงฟังก์ชั่นแฮชมากกว่าตารางแฮช
jk

@jk ที่จริง "แฮ" เป็นผลมาจากการใช้ "ฟังก์ชั่นแฮช / อัลกอริทึม" กับการป้อนข้อมูลบางอย่าง เป็น "ตารางแฮช" หรือ "กัญชาแผนที่" omehoe เกี่ยวข้องและวัตถุ hashable กับวัตถุบางอย่าง (วัตถุในรูปแบบทั่วไปไม่ จำกัด OOP)
โยฮันเน

มีภาษาที่ใช้ 'แฮช' เพื่ออ้างถึงโครงสร้างประเภทพจนานุกรมมากกว่าเพียงแค่การใช้ฟังก์ชันแฮช ทับทิมยกตัวอย่างเช่น
Sean Burton

7

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


แฮชยังเป็น ADT มี Hash และ Dictionary ADT แตกต่างกันหรือไม่?
Sairam

2
@Sairam: ไม่แฮชคือเอาต์พุตของอัลกอริทึมบางชนิด (ฟังก์ชันแฮช)

5

พจนานุกรมใช้กุญแจสำคัญในการอ้างอิงค่าโดยตรงภายในของอาเรย์

กล่าวคือ (KEY => VALUE)

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

กล่าวคือ KEY => HASH FUNCTION => VALUE

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

สถานที่ที่ดีที่สุดในการมองหา: Wikipedia ( อาเรย์แบบเชื่อมโยงและตารางแฮช )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.