คำตอบ:
เมื่อลำดับของรายการในคอลเลกชันไม่สำคัญชุดจะมีประสิทธิภาพที่ดีกว่าในการค้นหารายการในคอลเลกชัน
เหตุผลก็คือชุดใช้ค่าแฮชเพื่อค้นหารายการ (เช่นพจนานุกรม) ในขณะที่อาร์เรย์ต้องวนซ้ำเนื้อหาทั้งหมดเพื่อค้นหาวัตถุเฉพาะ
ภาพจากเอกสารของ Appleอธิบายได้เป็นอย่างดี:
Array
เป็นลำดับ (ลำดับจะคงอยู่เมื่อคุณเพิ่ม) ลำดับขององค์ประกอบ
[array addObject:@1];
[array addObject:@2];
[array addObject:@3];
[array addObject:@4];
[array addObject:@6];
[array addObject:@4];
[array addObject:@1];
[array addObject:@2];
[1, 2, 3, 4, 6, 4, 1, 2]
Set
เป็นรายการองค์ประกอบที่แตกต่างกัน (ไม่ซ้ำกัน) โดยไม่เรียงลำดับ
[set addObject:@1];
[set addObject:@2];
[set addObject:@3];
[set addObject:@4];
[set addObject:@6];
[set addObject:@4];
[set addObject:@1];
[set addObject:@2];
[1, 2, 6, 4, 3]
คำตอบที่ดีที่สุดคือการนี้เป็นเอกสารของตัวเองแอปเปิ้ล
ความแตกต่างที่สำคัญNSArray
คือสำหรับคอลเลกชันที่สั่งซื้อและNSSet
สำหรับคอลเลกชันที่ไม่มีการเรียงลำดับ
มีหลายบทความออกมีที่พูดคุยเกี่ยวกับความแตกต่างในความเร็วระหว่างสองเหมือนเป็นคนนี้ หากคุณทำซ้ำผ่านคอลเลกชันที่ไม่มีการเรียงลำดับNSSet
จะดีมาก อย่างไรก็ตามในหลาย ๆ กรณีคุณต้องทำสิ่งที่ทำได้เพียงอย่างเดียวNSArray
ดังนั้นคุณจึงยอมสละความเร็วเพื่อความสามารถเหล่านั้น
NSSet
NSArray
นั่นคือทั้งหมดที่มีจริงๆ! แจ้งให้เราทราบหากช่วยได้
NSSet
เพื่อการจัดทำดัชนีเสมอไป เป็นเรื่องปกติที่จะใช้โครงสร้างข้อมูลสองแบบที่แตกต่างกันสำหรับข้อมูลเดียวกัน หรือคุณสร้างและทำดัชนีในอาร์เรย์นั้น :) แต่จะดีกว่าถ้าใช้ฐานข้อมูลที่มีการนำไปใช้งาน
NSSet
และNSArray
คำตอบของฉันจึงถูกต้องและสมบูรณ์ ใช่คุณสามารถสร้างโครงสร้างข้อมูลอื่น ๆ ได้ แต่ฉันแค่เปรียบเทียบสองสิ่งนี้
NSArray
และ functioanlity จากNSSet
คำตอบที่ถูกต้องคือไม่ได้ "การใช้งานNSArray
และการเสียสละประสิทธิภาพ" คำตอบคือรวมทั้งสองอย่างหรือใช้โครงสร้างข้อมูลที่แตกต่างกัน
NSOrderSet พร้อมใช้งานใน iOS 5+ ดังนั้นความแตกต่างที่สำคัญจะกลายเป็นว่าคุณต้องการให้วัตถุซ้ำกันในโครงสร้างข้อมูลหรือไม่
NSArray :
NSSet :
อาร์เรย์ใช้เพื่อเข้าถึงรายการโดยดัชนีของพวกเขา รายการใด ๆ สามารถแทรกลงในอาร์เรย์ได้หลายครั้ง อาร์เรย์เป็นส่วนหนึ่งของลำดับขององค์ประกอบ
โดยทั่วไปชุดจะใช้เพื่อตรวจสอบว่าสินค้าอยู่ในคอลเลกชั่นหรือไม่ รายการไม่มีแนวคิดในการสั่งซื้อหรือจัดทำดัชนี คุณไม่สามารถมีรายการในชุดสองครั้ง
หากอาร์เรย์ต้องการตรวจสอบว่ามีองค์ประกอบหรือไม่ก็ต้องตรวจสอบรายการทั้งหมด ชุดได้รับการออกแบบมาเพื่อใช้อัลกอริทึมที่เร็วขึ้น
คุณสามารถจินตนาการถึงชุดเช่นพจนานุกรมที่ไม่มีค่า
โปรดทราบว่าอาร์เรย์และชุดไม่ใช่โครงสร้างข้อมูลเพียงอย่างเดียว ยังมีอีกเช่น Queue, Stack, Heap, Fibonacci's Heap ฉันอยากจะแนะนำให้อ่านหนังสือเกี่ยวกับอัลกอริทึมและโครงสร้างข้อมูล
ดูวิกิพีเดียสำหรับข้อมูลเพิ่มเติม
contains
จำนวนของการเปรียบเทียบเมื่อไม่ได้อยู่ในอาร์เรย์O(n)
จำนวนเฉลี่ยของการเปรียบเทียบเมื่อวัตถุอยู่ในอาร์เรย์คือn
n/2
แม้ว่าจะพบวัตถุ แต่ประสิทธิภาพก็แย่มาก
NSArray
s ยังมีข้อได้เปรียบด้านความเร็วอื่น ๆ มากกว่าNSSet
s เช่นเคยมันเป็นการแลกเปลี่ยน
NSArray *Arr;
NSSet *Nset;
Arr=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"2",@"1", nil];
Nset=[NSSet setWithObjects:@"1",@"2",@"3",@"3",@"5",@"5", nil];
NSLog(@"%@",Arr);
NSLog(@"%@",Nset);
อาร์เรย์
2015-12-04 11: 05: 40.935 [598: 15730] (1, 2, 3, 4, 2, 1)
ชุด
2015-12-04 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}
ความแตกต่างหลักได้รับไปแล้วในคำตอบอื่น ๆ
ฉันแค่อยากจะทราบว่าเนื่องจากวิธีการใช้งานชุดและพจนานุกรม (เช่นการใช้แฮช) จึงควรระมัดระวังไม่ให้ใช้วัตถุที่ไม่แน่นอนสำหรับคีย์
หากคีย์ถูกกลายพันธุ์แฮชก็จะ (อาจ) เปลี่ยนไปด้วยโดยชี้ไปที่ดัชนี / ที่เก็บข้อมูลอื่นในตารางแฮช ค่าดั้งเดิมจะไม่ถูกลบและจะนำมาพิจารณาเมื่อแจกแจงหรือถามโครงสร้างสำหรับขนาด / จำนวน
ซึ่งอาจนำไปสู่การหาจุดบกพร่องได้ยาก
ที่นี่คุณสามารถค้นหาเปรียบเทียบอย่างละเอียดสวยของNSArray
และNSSet
datastructures
ข้อสรุปสั้น ๆ :
ใช่ NSArray เร็วกว่า NSSet เพียงแค่ถือและทำซ้ำ เร็วขึ้นเพียง 50% สำหรับการสร้างและการทำซ้ำเร็วขึ้นมากถึง 500% บทเรียน: หากคุณจำเป็นต้องทำซ้ำเนื้อหาอย่าใช้ NSSet
แน่นอนว่าหากคุณต้องการทดสอบการรวมเข้าด้วยกันให้พยายามหลีกเลี่ยง NSArray แม้ว่าคุณจะต้องการทั้งการทดสอบซ้ำและการทดสอบรวมคุณก็ยังควรเลือก NSSet หากคุณต้องการให้คอลเลคชันของคุณเป็นระเบียบและทดสอบการรวมด้วยคุณควรพิจารณาเก็บสองคอลเลคชัน (NSArray และ NSSet) โดยแต่ละคอลเลคชันมีวัตถุเดียวกัน
NSDictionary สร้างช้ากว่า NSMapTable - เนื่องจากต้องคัดลอกข้อมูลสำคัญ ทำให้ขึ้นโดยการค้นหาได้เร็วขึ้น แน่นอนว่าทั้งสองมีความสามารถที่แตกต่างกันโดยส่วนใหญ่แล้วการตัดสินใจนี้ควรพิจารณาจากปัจจัยอื่น ๆ
โดยทั่วไปคุณจะใช้Set เมื่อความเร็วในการเข้าถึงเป็นสิ่งสำคัญและลำดับไม่สำคัญหรือถูกกำหนดโดยวิธีอื่น (ผ่านตัวอธิบายเพรดิเคตหรือการเรียงลำดับ) ข้อมูลหลักเช่นใช้ชุดเมื่ออ็อบเจ็กต์ที่มีการจัดการถูกเข้าถึงผ่านความสัมพันธ์ต่อกลุ่ม
เพียงเพื่อเพิ่มเล็กน้อยฉันใช้ set บางครั้งเพื่อลบรายการที่ซ้ำกันออกจากอาร์เรย์เช่น: -
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values