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, ,SymmetricExceptWithUnionWith
หากคุณคุ้นเคยกับภาษาข้อ จำกัด ของวัตถุคุณจะระบุการดำเนินการชุดเหล่านี้ คุณจะเห็นว่ามันเป็นขั้นตอนหนึ่งที่ใกล้เคียงกับการใช้ UML ที่ปฏิบัติการได้
พูดง่ายๆและไม่เปิดเผยความลับของครัว:
ชุดโดยทั่วไปเป็นคอลเลกชันที่ไม่มีองค์ประกอบที่ซ้ำกันและองค์ประกอบที่ไม่มีลำดับใดเป็นพิเศษ ดังนั้น A HashSet<T>จึงคล้ายกับ generic List<T>แต่ได้รับการปรับให้เหมาะสำหรับการค้นหาที่รวดเร็ว (ผ่านแฮชเทเบิลตามที่ชื่อมีความหมาย) ในราคาที่เสียคำสั่ง
จากมุมมองของแอพลิเคชันหากความต้องการเพียงเพื่อที่จะหลีกเลี่ยงการซ้ำกันแล้วHashSetคือสิ่งที่คุณกำลังมองหาเพราะมันของการค้นหาแทรกและลบความซับซ้อนเป็น O (1) - คงที่ สิ่งนี้หมายความว่าไม่สำคัญว่าองค์ประกอบจำนวนมากHashSetจะใช้เวลาเท่ากันในการตรวจสอบว่ามีองค์ประกอบดังกล่าวหรือไม่รวมทั้งเนื่องจากคุณใส่องค์ประกอบที่ O (1) เช่นกันมันทำให้มันสมบูรณ์แบบสำหรับสิ่งนี้