HashSet โครงสร้างข้อมูล C # HashSet ถูกนำมาใช้ใน. NET Framework 3.5 รายการเต็มรูปแบบของสมาชิกในการดำเนินการที่สามารถพบได้ที่HashSet MSDNหน้า
- มันใช้อยู่ที่ไหน
- ทำไมคุณต้องการใช้
HashSet โครงสร้างข้อมูล C # HashSet ถูกนำมาใช้ใน. NET Framework 3.5 รายการเต็มรูปแบบของสมาชิกในการดำเนินการที่สามารถพบได้ที่HashSet MSDNหน้า
คำตอบ:
A HashSet
เก็บชุดของวัตถุ แต่เป็นวิธีที่ช่วยให้คุณสามารถกำหนดได้อย่างง่ายดายและรวดเร็วว่าวัตถุนั้นอยู่ในชุดหรือไม่ มันทำได้โดยการจัดการภายในอาร์เรย์และจัดเก็บวัตถุโดยใช้ดัชนีซึ่งคำนวณจาก hashcode ของวัตถุ ลองดูที่นี่
HashSet
เป็นคอลเล็กชันที่ไม่เรียงลำดับที่มีองค์ประกอบเฉพาะ มีการดำเนินการรวบรวมมาตรฐานเพิ่มลบออกมี แต่เนื่องจากใช้การใช้งานแบบแฮชการดำเนินการเหล่านี้คือ O (1) (เมื่อเทียบกับรายการตัวอย่างซึ่งเป็น O (n) สำหรับการมีและลบ.) HashSet
นอกจากนี้ยังมีการดำเนินงานกำหนดมาตรฐานเช่นสหภาพ , สี่แยกและแตกต่างสมมาตร ลองดูที่นี่
มีการใช้งานที่แตกต่างกันของชุด บางคนทำการดำเนินการแทรกและค้นหาได้อย่างรวดเร็วด้วยองค์ประกอบการแปลงแป้นพิมพ์ อย่างไรก็ตามนั่นหมายความว่าลำดับที่เพิ่มองค์ประกอบนั้นหายไป การใช้งานอื่น ๆ รักษาคำสั่งเพิ่มเติมที่ค่าใช้จ่ายของเวลาทำงานช้าลง
HashSet
ชั้นใน C # จะไปสำหรับวิธีแรกจึงไม่รักษาคำสั่งขององค์ประกอบ มันเร็วกว่าปกติList
มาก มาตรฐานพื้นฐานบางอย่างแสดงให้เห็นว่า HashSet เร็วขึ้นอย่างเหมาะสมเมื่อจัดการกับประเภทหลัก (int, double, bool, ฯลฯ ) มันเร็วขึ้นมากเมื่อทำงานกับคลาสอ็อบเจ็กต์ ดังนั้นประเด็นคือ HashSet นั้นรวดเร็ว
สิ่งที่จับได้เพียงอย่างเดียวHashSet
คือไม่มีการเข้าถึงโดยดัชนี ในการเข้าถึงองค์ประกอบคุณสามารถใช้ตัวแจงนับหรือใช้ฟังก์ชันในตัวเพื่อแปลงค่าHashSet
เป็น a List
และวนซ้ำไปเรื่อย ๆ ลองดูที่นี่
A HashSet
มีโครงสร้างภายใน (แฮช) ซึ่งสามารถค้นหาและระบุรายการได้อย่างรวดเร็ว ข้อเสียคือการวนซ้ำผ่านHashSet
(หรือรับไอเท็มตามดัชนี) ค่อนข้างช้า
เหตุใดจึงมีคนต้องการทราบว่ารายการมีอยู่แล้วในชุด?
สถานการณ์หนึ่งที่มีHashSet
ประโยชน์คือการรับค่าที่แตกต่างจากรายการที่อาจมีซ้ำกัน เมื่อมีการเพิ่มรายการลงในรายการจะสามารถทราบHashSet
ได้อย่างรวดเร็วว่ามีรายการอยู่หรือContains
ไม่
ประโยชน์อื่น ๆ ของการHashSet
มีการดำเนินงานที่ตั้ง: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, ,SymmetricExceptWith
UnionWith
หากคุณคุ้นเคยกับภาษาข้อ จำกัด ของวัตถุคุณจะระบุการดำเนินการชุดเหล่านี้ คุณจะเห็นว่ามันเป็นขั้นตอนหนึ่งที่ใกล้เคียงกับการใช้ UML ที่ปฏิบัติการได้
พูดง่ายๆและไม่เปิดเผยความลับของครัว:
ชุดโดยทั่วไปเป็นคอลเลกชันที่ไม่มีองค์ประกอบที่ซ้ำกันและองค์ประกอบที่ไม่มีลำดับใดเป็นพิเศษ ดังนั้น A HashSet<T>
จึงคล้ายกับ generic List<T>
แต่ได้รับการปรับให้เหมาะสำหรับการค้นหาที่รวดเร็ว (ผ่านแฮชเทเบิลตามที่ชื่อมีความหมาย) ในราคาที่เสียคำสั่ง
จากมุมมองของแอพลิเคชันหากความต้องการเพียงเพื่อที่จะหลีกเลี่ยงการซ้ำกันแล้วHashSet
คือสิ่งที่คุณกำลังมองหาเพราะมันของการค้นหาแทรกและลบความซับซ้อนเป็น O (1) - คงที่ สิ่งนี้หมายความว่าไม่สำคัญว่าองค์ประกอบจำนวนมากHashSet
จะใช้เวลาเท่ากันในการตรวจสอบว่ามีองค์ประกอบดังกล่าวหรือไม่รวมทั้งเนื่องจากคุณใส่องค์ประกอบที่ O (1) เช่นกันมันทำให้มันสมบูรณ์แบบสำหรับสิ่งนี้