Vâng, đó là một chiến thắng dễ dàng trên SortedList. Chèn một mục yêu cầu tìm kiếm nhị phân (O (log (n)) để tìm điểm chèn, sau đó là List.Insert (O (n)) để chèn mục. Chèn() chiếm ưu thế, điền danh sách yêu cầu O (n^2) Nếu các mục nhập đã được sắp xếp thì Chèn sẽ sụp đổ thành O (1) nhưng không ảnh hưởng đến tìm kiếm. Populating bây giờ là O (nlog (n)) Bạn không lo lắng mức độ lớn của Oh, Việc phân loại đầu tiên luôn hiệu quả hơn Giả sử bạn có thể đủ khả năng yêu cầu lưu trữ tăng gấp đôi
SortedDictionary là khác nhau, nó sử dụng một cây đỏ đen Tìm điểm chèn yêu cầu O (log (n)). yêu cầu sau đó, điều đó cũng lấy O (log (n)), điền vào từ điển như vậy sẽ có O (nlog (n)) Sử dụng đầu vào sắp xếp không thay đổi nỗ lực để tìm điểm chèn hoặc cân bằng lại, nó vẫn là O (nlog (n)) Bây giờ các vấn đề Oh mặc dù, chèn đầu vào được sắp xếp đòi hỏi cây để consta nt tái cân bằng chính nó. Nó hoạt động tốt hơn nếu đầu vào là ngẫu nhiên, bạn không muốn đầu vào được sắp xếp.
Vì vậy, hãy điền SortedList với đầu vào được sắp xếp và điền vào SortedDictionary với đầu vào chưa được phân loại là cả O (nlog (n)). Bỏ qua chi phí cung cấp đầu vào được sắp xếp, Oh of SortedList nhỏ hơn Oh of SortedDictionary. Đó là một chi tiết thực hiện do cách List phân bổ bộ nhớ. Nó chỉ phải làm như vậy O (log (n)) lần, một cây đỏ đen phải phân bổ O (n) lần. Rất nhỏ Oh btw.
Đáng chú ý là không ai so sánh thuận lợi với việc đơn giản điền một Danh sách, sau đó gọi Sắp xếp(). Đó cũng là O (nlog (n)). Trong thực tế, nếu đầu vào đã được vô tình sắp xếp, bạn có thể bỏ qua cuộc gọi Sort(), điều này sụp đổ thành O (n). Phân tích chi phí bây giờ cần phải chuyển sang nỗ lực cần thiết để có được đầu vào được sắp xếp. Thật khó để bỏ qua sự phức tạp cơ bản của Sort(), O (nlog (n)). Nó có thể không được dễ dàng nhìn thấy, bạn có thể nhận được đầu vào được sắp xếp theo, nói, một truy vấn SQL. Nó sẽ chỉ mất nhiều thời gian hơn để hoàn thành.
Điểm sử dụng SortedList hoặc SortedDictonary là giữ bộ sưu tập được sắp xếp sau khi chèn. Nếu bạn chỉ lo lắng về populating nhưng không đột biến thì bạn không nên sử dụng những bộ sưu tập.
Nguồn
2010-01-10 15:10:26
Bạn đã thử lược tả mã của mình để đảm bảo rằng việc khởi tạo các datasctructures được sắp xếp của bạn thực ra là nút cổ chai trong mã của bạn? –
Cho đến nay nó là một câu hỏi giả định, nhưng có, đây sẽ là nút cổ chai, cho đến nay. – Martin
Tôi không thể nhớ nhưng tôi cho rằng tôi giả định rằng tất cả các phương pháp đều có hiệu suất tiệm cận tương đương nhau và có thể khác nhau về hiệu suất trung bình (O (1)) tùy thuộc vào trường hợp sử dụng. – Martin