Câu trả lời:
Khi thứ tự của các mục trong bộ sưu tập không quan trọng, các bộ mang lại hiệu suất tốt hơn cho việc tìm kiếm các mục trong bộ sưu tập.
Lý do là một tập hợp sử dụng giá trị băm để tìm các mục (giống như một từ điển) trong khi một mảng phải lặp lại toàn bộ nội dung của nó để tìm một đối tượng cụ thể.
Hình ảnh từ Tài liệu của Apple mô tả nó rất tốt:
Array
là một lệnh (thứ tự được duy trì khi bạn thêm) chuỗi các phần tử
[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
là một danh sách các phần tử riêng biệt (không trùng lặp), không có thứ tự
[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]
Câu trả lời tốt nhất là tài liệu của Apple .
Sự khác biệt chính là NSArray
là một bộ sưu tập lệnh và NSSet
là một bộ sưu tập có thứ tự.
Có một số bài báo nói về sự khác biệt về tốc độ giữa hai loại, như bài báo này . Nếu bạn đang lặp lại một bộ sưu tập không có thứ tự thì NSSet
thật tuyệt. Tuy nhiên, trong nhiều trường hợp, bạn cần phải làm những việc mà chỉ an NSArray
có thể làm, vì vậy bạn hy sinh tốc độ cho những khả năng đó.
NSSet
NSArray
Đó là tất cả những gì thực sự có! Hãy cho tôi biết nếu nó giúp được bạn.
NSSet
vì lợi ích của việc lập chỉ mục. Thông thường sử dụng hai cấu trúc dữ liệu khác nhau cho cùng một dữ liệu. Hoặc bạn xây dựng và lập chỉ mục trên mảng đó :) Nhưng sau đó tốt hơn nên sử dụng một DB có triển khai nó.
NSSet
và NSArray
, câu trả lời của tôi là chính xác và đầy đủ. Có, bạn có thể xây dựng các cấu trúc dữ liệu khác, nhưng tôi chỉ so sánh hai cấu trúc này.
NSArray
và một số chức năng từ NSSet
, câu trả lời đúng không phải là "sử dụng NSArray
và hy sinh hiệu suất". Câu trả lời là kết hợp cả hai hoặc sử dụng một cấu trúc dữ liệu khác.
Một mảng được sử dụng để truy cập các mục theo chỉ mục của chúng. Bất kỳ mục nào cũng có thể được chèn nhiều lần vào mảng. Mảng lưu giữ thứ tự của các phần tử của chúng.
Một tập hợp được sử dụng về cơ bản chỉ để kiểm tra xem mục có trong bộ sưu tập hay không. Các mục không có khái niệm về thứ tự hoặc lập chỉ mục. Bạn không thể có một mục trong một bộ hai lần.
Nếu một mảng muốn kiểm tra xem nó có chứa một phần tử hay không, nó phải kiểm tra tất cả các mục của nó. Bộ được thiết kế để sử dụng các thuật toán nhanh hơn.
Bạn có thể tưởng tượng một tập hợp giống như một cuốn từ điển không có giá trị.
Lưu ý rằng mảng và tập hợp không phải là cấu trúc dữ liệu duy nhất. Có những thứ khác, ví dụ như Queue, Stack, Heap, Fibonacci's Heap. Tôi khuyên bạn nên đọc một cuốn sách về thuật toán và cấu trúc dữ liệu.
Xem wikipedia để biết thêm thông tin.
contains
hoạt động là O(n)
. Số lần so sánh khi không có trong mảng là n
. Số lần so sánh trung bình khi đối tượng nằm trong mảng là n/2
. Ngay cả khi đối tượng được tìm thấy, hiệu suất là khủng khiếp.
NSArray
s có lợi thế về tốc độ khác so với NSSet
s. Như mọi khi, đó là một sự đánh đổi.
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);
mảng
2015-12-04 11: 05: 40.935 [598: 15730] (1, 2, 3, 4, 2, 1)
bộ
2015-12-04 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}
Sự khác biệt chính đã được đưa ra trong các câu trả lời khác.
Tôi chỉ muốn lưu ý rằng do cách các bộ và từ điển được triển khai (tức là sử dụng hàm băm), nên cẩn thận không sử dụng các đối tượng có thể thay đổi cho các khóa.
Nếu một khóa bị đột biến thì hàm băm (có thể) cũng sẽ thay đổi, trỏ đến một chỉ mục / nhóm khác trong bảng băm. Giá trị gốc sẽ không bị xóa và sẽ thực sự được tính đến khi liệt kê hoặc hỏi cấu trúc về kích thước / số lượng của nó.
Điều này có thể dẫn đến một số lỗi thực sự khó xác định.
Ở đây, bạn có thể tìm thấy một so sánh khá kỹ lưỡng giữa các cấu trúc NSArray
và cơ sở dữ liệu NSSet
.
Kết luận ngắn gọn:
Có, NSArray nhanh hơn NSSet vì chỉ cần giữ và lặp lại. Nhanh hơn ít nhất là 50% để xây dựng và nhanh hơn 500% để lặp lại. Bài học: nếu bạn chỉ cần lặp lại nội dung, đừng sử dụng NSSet.
Tất nhiên, nếu bạn cần kiểm tra để đưa vào, hãy làm việc chăm chỉ để tránh NSArray. Ngay cả khi bạn cần cả kiểm tra lặp lại và bao gồm, bạn có thể vẫn nên chọn NSSet. Nếu bạn cần giữ cho bộ sưu tập của mình có thứ tự và cũng như kiểm tra để đưa vào, thì bạn nên cân nhắc giữ hai bộ sưu tập (một NSArray và một NSSet), mỗi bộ chứa các đối tượng giống nhau.
NSDictionary được xây dựng chậm hơn NSMapTable - vì nó cần sao chép dữ liệu khóa. Nó bù đắp cho điều này bằng cách tra cứu nhanh hơn. Tất nhiên, hai người có khả năng khác nhau nên phần lớn thời gian, việc xác định này nên dựa vào các yếu tố khác.
Bạn thường sẽ sử dụng Bộ khi tốc độ truy cập là quan trọng và thứ tự không quan trọng hoặc được xác định bằng các phương tiện khác (thông qua một vị từ hoặc bộ mô tả sắp xếp). Ví dụ: Core Data sử dụng các tập hợp khi các đối tượng được quản lý được truy cập thông qua mối quan hệ nhiều
Chỉ để thêm một chút nó, đôi khi tôi sử dụng set chỉ để xóa các bản sao khỏi mảng như: -
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values