แผนที่และพจนานุกรมแตกต่างกันอย่างไร?


199

ฉันรู้ว่าแผนที่เป็นโครงสร้างข้อมูลที่จับคู่คีย์กับค่า พจนานุกรมไม่เหมือนกันหรือ แผนที่และพจนานุกรม1 ต่างกันอย่างไร


1. ฉันไม่ได้ถามว่าพวกเขากำหนดไว้ในภาษา X หรือ Y (ซึ่งดูเหมือนจะเป็นสิ่งที่คนทั่วไปถามที่นี่ดังนั้น) ฉันต้องการที่จะรู้ว่าความแตกต่างของพวกเขาในทางทฤษฎีคืออะไร


เป็นคำถามที่ดีมาก!
NoName

คำตอบ:


262

สองคำสำหรับสิ่งเดียวกัน:

  • "Map"ใช้โดย Java, C ++
  • "Dictionary"ใช้โดย. Net, Python
  • "อาร์เรย์ที่เกี่ยวข้อง"ถูกใช้โดย PHP

"แผนที่"เป็นคำที่ถูกต้องทางคณิตศาสตร์ แต่มันก็หลีกเลี่ยงเพราะมันมีความหมายที่แยกต่างหากในโปรแกรมการทำงาน

บางภาษาใช้คำอื่น ๆ("วัตถุ" ใน Javascript, "Hash" ใน Ruby, "Table" ใน Lua)แต่ภาษาเหล่านั้นมีความหมายแยกกันในการเขียนโปรแกรมด้วยดังนั้นฉันจึงหลีกเลี่ยง

ดูที่นี่สำหรับข้อมูลเพิ่มเติม


7
JAVA ไม่มีทั้งแผนที่และพจนานุกรมใช่ไหม ความแตกต่างที่นั่นคืออะไร?
vivek_jonam

36
@vivek_jonam: Dictionaryใน Java ล้าสมัยแล้ว เป็นคลาสนามธรรมที่ใช้ก่อนที่จะสร้างMapส่วนต่อประสาน
BlueRaja - Danny Pflughoeft

7
ฉันรู้ว่าคำถามคือผู้ไม่เชื่อเรื่องภาษาดังนั้นนี่คือคำตอบที่ถูกต้อง แต่ฉันลงเอยด้วยการมองหาเหตุผลที่ Java มีทั้งคู่ความคิดเห็นนี้เป็นสิ่งที่สมบูรณ์แบบสำหรับฉันจริงๆ
GrandOpener

1
"table" ถูกใช้ใน lua
Deduplicator

1
มันยังค่อนข้างสับสนที่เรียกว่า"Object"ใน JSON (สำหรับเหตุผลทางประวัติศาสตร์ที่เกี่ยวข้องกับ JavaScript)
Aprillion

20

หนึ่งเป็นคำที่มีอายุมากกว่าสำหรับอีก โดยทั่วไปคำว่า "พจนานุกรม" จะถูกใช้ก่อนคำว่า "แผนที่" ทางคณิตศาสตร์จึงถูกจับ นอกจากนี้พจนานุกรมมักจะมีประเภทของสตริงที่สำคัญ แต่นั่นไม่จริง 100% ทุกที่


10

2 เซนต์ของฉัน

พจนานุกรมเป็นคลาสนามธรรมใน Java ในขณะที่ Map เป็นอินเทอร์เฟซ เนื่องจาก Java ไม่สนับสนุนการสืบทอดหลายอย่างหากคลาสขยายพจนานุกรมมันจะไม่สามารถขยายคลาสอื่นได้

ดังนั้นจึงมีการแนะนำอินเทอร์เฟซแผนที่

คลาสพจนานุกรมล้าสมัยและต้องการการใช้งานแผนที่


9

การตอบคำถามนี้มีความซับซ้อนโดยโปรแกรมเมอร์ที่ได้เห็นแง่ที่ให้ความหมายที่เฉพาะเจาะจงมากขึ้นโดยเฉพาะอย่างยิ่งในภาษาหรือระบบที่พวกเขาเคยใช้ แต่คำถามจะถามสำหรับภาษาเปรียบเทียบไม่เชื่อเรื่องพระเจ้า "ในทางทฤษฎี" ซึ่งฉันสละหมายถึงในแง่วิทยาศาสตร์คอมพิวเตอร์ .

คำศัพท์อธิบาย

พจนานุกรมวิทยาศาสตร์คอมพิวเตอร์ของมหาวิทยาลัยออกฟอร์ดแสดงรายการ:

พจนานุกรมโครงสร้างข้อมูลใด ๆ ที่แสดงถึงชุดขององค์ประกอบที่สามารถรองรับการแทรกและการลบองค์ประกอบรวมถึงการทดสอบการเป็นสมาชิก

  • ตัวอย่างเช่นเรามีชุดขององค์ประกอบ {A, B, C, D ... } ที่เราสามารถแทรกและสามารถเริ่มลบและเราสามารถค้นหา"เป็น C อยู่หรือไม่" .

แนวคิดทางวิทยาศาสตร์คอมพิวเตอร์ของแผนที่นั้นขึ้นอยู่กับการทำแผนที่ศัพท์คณิตศาสตร์ซึ่ง Oxford Dictionary กำหนดเป็น:

การแมปการดำเนินการที่เชื่อมโยงแต่ละองค์ประกอบของชุดที่กำหนด (โดเมน) กับองค์ประกอบหนึ่งรายการหรือมากกว่าของชุดที่สอง (ช่วง)

  • ในฐานะที่เป็นเช่นนี้แผนที่โครงสร้างข้อมูลมีวิธีที่จะไปจากองค์ประกอบของชุดที่กำหนด - ที่รู้จักกันคือ " กุญแจ " ในแผนที่หนึ่งหรือมากกว่าหนึ่งองค์ประกอบในชุดที่สอง - ที่รู้จักในฐานะที่เกี่ยวข้อง " ค่า (s) "
  • องค์ประกอบ"... หรือมากกว่าในชุดที่สอง"สามารถรองรับได้โดยการนำไปปฏิบัติมีสองวิธีที่แตกต่างกัน:
    • การปรับใช้แผนที่จำนวนมากบังคับใช้คีย์เฉพาะและอนุญาตให้แต่ละคีย์เชื่อมโยงกับค่าเดียวเท่านั้น แต่ค่านั้นอาจเป็นโครงสร้างข้อมูลที่มีค่าชนิดข้อมูลที่ง่ายกว่าเช่น {{1, {"one" , "ichi"}, {2, {"two", "ni"}}} แสดงค่าที่ประกอบด้วยคู่ของสตริง
    • การใช้งานแผนที่อื่น ๆ อนุญาตให้คีย์ที่ซ้ำกันแต่ละการแมปไปเป็นค่าเดียวกันหรือต่างกัน - ซึ่งเป็นไปตามหน้าที่ "เชื่อมโยง ... องค์ประกอบ [คีย์] ... กับ ... มากกว่า [มากกว่าหนึ่ง] [ค่า] องค์ประกอบ" ตัวอย่างเช่น {{1, "one"}, {1, "ichi"}, {2, "two"}, {2, "ni"}}

ตรงกันข้ามกับพจนานุกรมและแผนที่

ดังนั้นการใช้คำศัพท์ Comp Sci ที่เข้มงวดด้านบนพจนานุกรมจะเป็นเพียงแผนที่เท่านั้นหากอินเทอร์เฟซเกิดขึ้นเพื่อรองรับการดำเนินการเพิ่มเติมที่ไม่จำเป็นสำหรับทุกพจนานุกรม

  • ความสามารถในการจัดเก็บองค์ประกอบที่มีความแตกต่างที่สำคัญและค่าส่วนประกอบ

  • ความสามารถในการดึงค่าที่ได้รับจากคีย์เท่านั้น

บิดเล็กน้อย:

  • ส่วนต่อประสานแผนที่อาจไม่สนับสนุนการทดสอบโดยตรงว่าคู่ {key, value} อยู่ในคอนเทนเนอร์หรือไม่ซึ่งเป็นข้อกำหนดของพจนานุกรมที่มีองค์ประกอบเป็นคู่ {key, value} แผนที่อาจไม่มีฟังก์ชั่นสำหรับทดสอบคีย์ แต่ที่แย่ที่สุดคุณสามารถดูได้ว่าการเรียกใช้การเรียกคืนค่าโดยใช้คีย์สำเร็จหรือล้มเหลวจากนั้นถ้าคุณสนใจคุณสามารถตรวจสอบว่าคีย์เรียกค่าที่คาดไว้ได้หรือไม่

สื่อสารกับผู้ชมของคุณอย่างไม่น่าสงสัย

⚠แม้จะมีทั้งหมดข้างต้นหากคุณใช้พจนานุกรมในความหมายของวิทยาศาสตร์คอมพิวเตอร์ที่เข้มงวดอธิบายไว้ข้างต้นอย่าคาดหวังว่าผู้ชมของคุณจะติดตามคุณในตอนแรกหรือจะประทับใจเมื่อคุณแบ่งปันและปกป้องคำศัพท์ คำตอบอื่น ๆ สำหรับคำถามนี้ (และ upvotes) แสดงให้เห็นว่ามีแนวโน้มว่า"พจนานุกรม" จะตรงกันกับ "แผนที่"ในประสบการณ์ของโปรแกรมเมอร์ส่วนใหญ่ พยายามเลือกคำศัพท์ที่จะเข้าใจอย่างกว้างขวางและชัดเจนยิ่งขึ้น: เช่น

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

คำศัพท์ Crossreferencing Comp Sci พร้อมการใช้งานเฉพาะ

C ++ ไลบรารีมาตรฐาน

  • แผนที่: map, multimap, unordered_map,unordered_multimap
  • พจนานุกรมอื่น ๆ : set, multiset, unordered_set,unordered_multiset
  • หมายเหตุ: มี iterators หรือstd::findคุณสามารถลบองค์ประกอบและการทดสอบการเป็นสมาชิกในarray, vector, list, dequeฯลฯ แต่อินเตอร์เฟซภาชนะที่ไม่สนับสนุนโดยตรงว่าเป็นเพราะการหาองค์ประกอบคือยี่หระไม่มีประสิทธิภาพที่ O (N) ในบางกรณีแทรก / ลบคือ ไม่มีประสิทธิภาพและสนับสนุนการดำเนินการเหล่านั้นทำลาย API ที่ จำกัด โดยเจตนาภาชนะหมายถึง - เช่นdequeควรสนับสนุนการลบ / ป๊อปอัพที่ด้านหน้าและด้านหลังและไม่ได้อยู่ในแง่ของคีย์บางอย่าง ต้องทำงานเพิ่มเติมในรหัสเพื่อเตรียมการค้นหาอย่างนุ่มนวลกระตุ้นให้โปรแกรมเมอร์เปลี่ยนเป็นโครงสร้างข้อมูลคอนเทนเนอร์ด้วยการค้นหาที่มีประสิทธิภาพมากขึ้น

... อาจเพิ่มภาษาอื่นในภายหลัง / อย่าลังเลที่จะแก้ไขใน ...


3

โดยทั่วไปฉันคิดว่าแผนที่ได้รับการสนับสนุนโดยตารางแฮช มันหมายถึงร้านค้าที่ไม่มีลำดับ พจนานุกรมหมายถึงร้านค้าที่สั่งซื้อ

มีพจนานุกรมแบบต้นไม้ที่เรียกว่าTrie Trie

ใน Lisp อาจมีลักษณะเช่นนี้:

(a (n (d t)) n d )

ซึ่งสรุปคำศัพท์:

  • และ
  • มด
  • การโฆษณา

การเคลื่อนที่ผ่านจากบนสุดไปยังใบไม้ทำให้เกิดคำ


4
Dictionaryใน. Net ไม่ได้เรียงลำดับ
BlueRaja - Danny Pflughoeft

2
พจนานุกรมโกโก้ก็ไม่มีการเรียงลำดับ
Ken

C ++ std::mapได้รับคำสั่งให้ดำเนินการไม่ได้ระบุไว้ในมาตรฐาน, std::unordered_mapถูกนำมาใช้ใน c ++ 11, มันถูกใช้งานผ่านแฮช
Harald Scheirich

3
@HaraldScheirich - ในขณะที่มาตรฐาน C ++ ไม่ได้เจาะจงว่า "เจ้าจะต้องใช้ต้นไม้สีแดงดำที่จะใช้std::map" ลองใช้สิ่งอื่น ต้นไม้ AVL ไม่ทำงาน ค่าใช้จ่ายในการแทรกไม่ตรงตามมาตรฐาน แฮจะไม่ทำงาน แฮชไม่ได้เรียงลำดับและดังนั้นจึงไม่เป็นไปตามมาตรฐาน มาตรฐานค่อนข้างมากบอกว่า "เจ้าจะต้องใช้ต้นไม้สีแดงดำในการดำเนินการstd::map" โดยไม่พูดอย่างชัดเจน
David Hammen

+1 แม้ว่าพจนานุกรมจะไม่มีการเรียงลำดับในหลายแพลตฟอร์ม แต่คำนั้นมีความหมายตามลำดับ ฉันชอบแมพคำมากขึ้น
nawfal

2

ไม่เหมือนกันจริงๆ แผนที่เป็นส่วนย่อยของพจนานุกรม พจนานุกรมถูกกำหนดที่นี่ว่ามีฟังก์ชั่นแทรกลบและค้นหา แผนที่ที่ใช้โดย Java (ตามนี้แม็พที่ ) เป็นพจนานุกรมที่มีข้อกำหนดว่าการแม็พคีย์กับค่าจะถูกแม็พอย่างเคร่งครัดเป็นฟังก์ชันแบบหนึ่งต่อหนึ่ง พจนานุกรมอาจมีการแมปคีย์มากกว่าหนึ่งรายการเป็นค่าเดียวหรือการแมปคีย์หนึ่งรายการกับค่าหลายค่า (เช่นการผูกมัดใน hasthtable) เช่นการค้นหา Twitter hashtag

สำหรับตัวอย่าง "โลกแห่งความเป็นจริง" ที่มากขึ้นการค้นหาคำในพจนานุกรมสามารถให้คำจำกัดความจำนวนมากสำหรับคำเดียวกันและเมื่อเราพบรายการที่ชี้ให้เราเห็นรายการอื่น (ดูคำอื่น ๆ ) จำนวนคำ สำหรับรายการคำจำกัดความเดียวกัน ในโลกแห่งความเป็นจริงแผนที่นั้นกว้างกว่ามากทำให้เรามีตำแหน่งสำหรับชื่อหรือชื่อพิกัด แต่เราสามารถหาเพื่อนบ้านที่ใกล้ที่สุดหรือคุณลักษณะอื่น ๆ (ประชากร ฯลฯ ) ดังนั้น IMHO อาจมีข้อโต้แย้งเกี่ยวกับการขยายตัวของ ประเภทแผนที่อาจมีการนำกราฟมาใช้ แต่จะเป็นการดีที่สุดที่จะสมมติว่าเป็นคู่ของคีย์ - ค่าเสมอโดยเฉพาะอย่างยิ่งเนื่องจากเพื่อนบ้านที่ใกล้ที่สุดและคุณลักษณะอื่น ๆ กับค่าอาจเป็นสมาชิกข้อมูลของค่า

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

จำไว้ว่าผู้ดูแลระบบ Java ไม่ใช่ผู้ดูแลของคำจำกัดความของ ADT และการตัดสินใจของจาวานั้นใช้สำหรับจาวาโดยเฉพาะ


1

คำศัพท์อื่น ๆ สำหรับแนวคิดนี้ที่ค่อนข้างธรรมดา: อาเรย์แบบเชื่อมโยงและแฮช


1
แฮชไม่มีส่วนเกี่ยวข้องกับสิ่งนี้ มันเป็นวิธีการตรวจจับอย่างรวดเร็วว่าวัตถุนั้นแตกต่างกันหรือไม่ คุณกำลังคิดถึง hashmap ซึ่งใช้ hash เพื่อทำงาน Map / Dictionary
DJClayworth

5
@DJClayworth ไม่ภาษาการเขียนโปรแกรมจำนวนมากเรียกสิ่งเหล่านี้ว่าแฮช ดูทับทิม ฉันไม่ได้ออกแบบมันและฉันจะไม่เรียกมันว่า แต่อย่ายิงผู้ส่งสาร
แฮงค์เกย์

1

ใช่พวกเขาเหมือนกันคุณสามารถเพิ่ม "Associative Array" ในการผสมได้

การใช้Hashtable หรือHashofter หมายถึงการนำไปใช้งาน


1

ดังนั้นในระดับทฤษฎีอย่างหมดจด

พจนานุกรมคือค่าที่สามารถใช้เพื่อค้นหาค่าที่เชื่อมโยง แผนที่คือค่าที่ให้คำแนะนำเกี่ยวกับวิธีค้นหาค่าอื่น

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

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


-1

คำศัพท์สองคำที่แตกต่างกันสำหรับแนวคิดเดียวกัน
HashtableและHashMapอ้างถึงแนวคิดเดียวกัน


3
ที่จริงแล้ว Hashtable / Hashmap บ่งบอกถึงการใช้งานเฉพาะในชื่อของพวกเขา (เทียบกับต้นไม้ที่สมดุลซึ่งใช้ในแผนที่ C ++ std :: map)
Joe

โดยทั่วไปแล้วคุณไม่ควรใส่ใจกับการนำไปใช้งาน (ยกเว้นเหตุผลด้านประสิทธิภาพ) และนั่นก็ไม่ได้เป็นเช่นนั้นเสมอไป ดูที่. Net ตัวอย่างเช่น
SLaks

-2

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

ปกติเราจะจัดการกับการชนโดยใช้ทั้งChaining เฉพาะกิจ หรือเชิงเส้นละเอียด

พจนานุกรมช่วยให้รายการหลายรายการจะเชื่อมโยงกับคีย์เดียวกัน

เมื่อแผนที่มีการใช้งานการเชื่อมโยงแบบแยกจากนั้นจะมีลักษณะคล้ายกับพจนานุกรม

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