Ứng dụng thực tế của Radix Sort


20

Về mặt lý thuyết, sắp xếp rất nhanh khi bạn biết rằng các khóa nằm trong một phạm vi giới hạn nhất định, ví dụ: giá trị trong phạm vi . Nếu bạn chỉ cần chuyển đổi các giá trị thành cơ sở mất thời gian , thực hiện sắp xếp cơ sở cơ sở và sau đó chuyển đổi trở lại cơ sở ban đầu của bạn cho thuật toán tổng thể .[ 0 ... n k - 1 ] k < lg n n Θ ( n ) n Θ ( n k )n[0Giáo dụcnk-1]k<lgnnΘ(n)nΘ(nk)

Tuy nhiên, tôi đã đọc được rằng trong thực tế, việc sắp xếp cơ số thường chậm hơn nhiều so với thực hiện một ví dụ ngẫu nhiên :

Đối với các mảng lớn, radix sort có số lệnh thấp nhất, nhưng do hiệu năng bộ đệm tương đối kém, hiệu năng tổng thể của nó kém hơn so với các phiên bản tối ưu hóa bộ nhớ của sáp nhập và quicksort.

Là radix sort chỉ là một thuật toán lý thuyết tốt đẹp, hay nó có những ứng dụng thực tế phổ biến?

Câu trả lời:


15

Trong thực tế, các loại Radix thường là các loại nhanh nhất và hữu ích nhất trên các máy song song.

Trên mỗi nút của bộ đa xử lý, bạn có thể làm một cái gì đó như quicksort, nhưng radix sort cho phép nhiều nút hoạt động cùng nhau với ít đồng bộ hóa hơn các loại đệ quy khác nhau.

Có những tình huống khác nữa. Nếu bạn cần một loại ổn định (một loại mà bất cứ khi nào hai khóa bằng nhau, chúng sẽ giữ cùng một thứ tự thay vì được sắp xếp lại) thì tôi không biết bất kỳ phiên bản quicksort nào sẽ được sử dụng. Mergesort cũng ổn định (nếu được thực hiện đúng). Liên kết của bạn là lần đầu tiên tôi từng nghe ai đó nói rằng việc sáp nhập có thể được thực hiện để có hành vi bộ đệm tốt hơn so với sắp xếp cơ số.


Patterson và Hennessy đưa ra quan điểm giống như bài báo được liên kết ở trên của Lamarca trong cuốn sách của họ, Tổ chức và Thiết kế Máy tính.
Robert S. Barnes

Việc bạn nhắc đến Patterson khiến tôi nhớ đến công việc quan trọng mà Andrea Arpaci -aleigheau đã làm khi sắp xếp các cụm khoảng 15 năm trước. (Patterson là đồng tác giả). Trong bài báo năm 1997, họ thực sự đã quyết định rằng loại radix một phần thích hợp hơn là quicksort trên các nút riêng lẻ. (Tôi đã thêm các tài liệu tham khảo cho câu trả lời).
Logic lang thang

Nó thật thú vị. Trong phiên bản thứ tư năm 2009 của CompOrg, họ đã tham khảo công việc của Lamarca về các phiên bản trước của Radix sort là bộ đệm không thân thiện (trg 489), nhưng sau đó trên trang 49 dưới biểu đồ so sánh Quicksort và Radix sắp xếp họ nói, "Do kết quả như vậy, các phiên bản mới của Radix sort đã được phát minh có tính đến hệ thống phân cấp bộ nhớ, để lấy lại lợi thế thuật toán của nó. " Tôi tò mò về cách các phiên bản mới này của Radix Sort hoạt động.
Robert S. Barnes

Sự nghi ngờ của tôi là Lamarca chỉ sử dụng một loại cơ số ngu ngốc (một loại giữ các thùng của nó như các danh sách được liên kết.) Không ai sẽ làm điều đó. Bạn sẽ triển khai các nhóm bằng cách sử dụng một số loại mảng động được tối ưu hóa (ví dụ như C ++ vector). Nhưng tôi không biết, vì tôi chưa đọc các bài báo của Lamarca.
Logic lang thang

@WanderingLogic sắp xếp radix sử dụng xô ở đâu? Bạn có nghĩa là sắp xếp xô ở đây?
Bar

3

@Robert: Liên kết của bạn khá đáng ngạc nhiên (thực sự tôi không thể tìm thấy câu trích dẫn). Kinh nghiệm cá nhân của tôi là cho đầu vào ngẫu nhiên, sắp xếp radix nhanh hơn nhiều so với STL std::sort(), sử dụng một biến thể của quicksort. Tôi đã sử dụng để tạo ra một thuật toán nhanh hơn 50% bằng cách thay thế std::sort()bằng một loại cơ số không ổn định. Tôi không chắc "phiên bản tối ưu hóa bộ nhớ" của quicksort là gì, nhưng tôi nghi ngờ nó có thể nhanh gấp đôi phiên bản STL.

Bài đăng trên blog này đã đánh giá sắp xếp cơ số cùng với một số thuật toán sắp xếp khác. Tóm lại, trong đánh giá này, std::sort()mất 5,1 giây để sắp xếp 50 triệu số nguyên, trong khi sắp xếp cơ số tại chỗ / không ổn định mất 2,0 giây. Loại radix ổn định nên thậm chí nhanh hơn.

Radix sort cũng được sử dụng rộng rãi để sắp xếp các chuỗi ổn định. Các biến thể của loại cơ số đôi khi được nhìn thấy để xây dựng các mảng hậu tố, BWT, v.v.


1

Sắp xếp Radix cũng là một cách tự nhiên để sắp xếp các từ có độ dài cố định trên một bảng chữ cái cố định, ví dụ: trong thuật toán Kärkkäinen & Sanders ( http://www.cs.cmu.edu/~guyb/realworld/ conS04 / KaSa03.pdf )

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.