Tại sao java không sử dụng một loại cơ số trên các nguyên thủy?


12

java.util.Arrays.sort(/* int[], char[], short[], byte[], boolean[] */) được triển khai như một 'quicksort điều chỉnh' chứ không phải là một loại cơ số.

Tôi đã thực hiện một so sánh tốc độ cách đây một thời gian và với thứ gì đó như n> 10000, loại radix luôn nhanh hơn. tại sao?

Câu trả lời:


17

Tôi sẽ suy đoán rằng:

  • Array.sort được triển khai dưới dạng quicksort, bởi vì quicksort có thể sắp xếp mọi thứ trong thời gian phù hợp với một bộ so sánh.
  • Sắp xếp một danh sách 10000 mục không quá phổ biến. Truy cập cấu trúc dữ liệu từ 10000 yếu tố trở lên là khá phổ biến. Nếu bạn cần duy trì trật tự, một cây tìm kiếm cân bằng thường là cách tốt hơn để sắp xếp toàn bộ mảng của bạn mỗi khi bạn cần phần tử nhỏ nhất.
  • Sắp xếp nguyên thủy không quá phổ biến, mặc dù những gì trường đại học có thể dạy.

Vấn đề là, đây không phải là trường hợp sử dụng phổ biến, mà tối ưu hóa cần phải có trong thư viện chuẩn. Nếu bạn đã viết một ứng dụng, có vấn đề về hiệu năng, trong đó bạn xác định thông qua hồ sơ rằng việc sắp xếp một mảng hơn 10000 ints thực sự là nút cổ chai, thì bạn cũng có thể viết cách sắp xếp bằng tay hoặc xem xét lại lựa chọn cấu trúc dữ liệu của bạn trước tiên địa điểm.


Không chắc chắn 100%, nhưng tôi nghĩ TimSort được sử dụng trong một số trường hợp.
Martijn Verburg

1
Nhưng không có cái gì như Array.sort, có nhiều Array.sort và câu hỏi là về chuyên ngành này cho các kiểu số.
Thủy thủ Danubian

6

Back2dos đã nói lên tất cả, tôi sẽ chỉ cố gắng làm rõ hơn điểm mà tôi nghĩ là quan trọng nhất:

Sắp xếp Radix chỉ có thể sắp xếp các giá trị nguyên thủy thực sự có trong mảng, dựa trên các mẫu chữ số nhị phân của chúng. Trong các kịch bản kỹ thuật phần mềm trong thế giới thực, trường hợp này gặp phải hầu như không bao giờ . Những gì chúng ta có xu hướng làm thường xuyên hơn là sắp xếp các mảng cấu trúc dữ liệu phức tạp hơn (không nguyên thủy) và đôi khi chúng ta sắp xếp các mảng chỉ mục cho các thực thể khác.

Bây giờ, một mảng các chỉ mục cho các thực thể khác trên thực tế là một mảng các nguyên hàm, nhưng thứ tự sắp xếp được cung cấp bởi giao diện so sánh (và / hoặc ủy nhiệm trong C #) không so sánh các chỉ mục, nhưng các thực thể được lập chỉ mục bởi các chỉ mục. Do đó, thứ tự sắp xếp hoàn toàn không có mối quan hệ nào với thứ tự các giá trị của nguyên thủy, và do đó sắp xếp cơ số là hoàn toàn vô dụng đối với kịch bản này.

Một ví dụ:

Chúng tôi có một chuỗi các chuỗi: [0] = "Mike", [1] = "Albert", [2] = "Zoro". Sau đó, chúng tôi khai báo một mảng các chỉ mục cho các chuỗi đó: [0] = 0, [1] = 1, [2] = 2. Sau đó, chúng tôi sắp xếp mảng các chỉ mục, chuyển cho nó một bộ so sánh không so sánh chính các chỉ mục, mà là các chuỗi thực tế được gọi bởi các chỉ mục này. Sau khi sắp xếp, mảng kết quả của các chỉ mục sẽ trông như thế này: [0] = 1, [1] = 0, [2] = 2. Như bạn có thể thấy, thứ tự sắp xếp này không liên quan gì đến các mẫu nhị phân của các giá trị có trong mảng và bằng cách duyệt qua mảng chỉ mục này và tìm nạp từng chuỗi tương ứng, chúng ta truy cập các chuỗi theo thứ tự được sắp xếp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.