Tại sao Radix Sắp xếp


23

Trong sắp xếp cơ số, trước tiên chúng ta sắp xếp theo chữ số có nghĩa ít nhất sau đó chúng ta sắp xếp theo chữ số có nghĩa nhỏ thứ hai và cứ thế và kết thúc với danh sách được sắp xếp.

Bây giờ nếu chúng ta có danh sách số, chúng ta cần log n bit để phân biệt giữa các số đó. Vì vậy, số lượng sắp xếp radix chúng tôi thực hiện sẽ là log n . Mỗi lượt đi mất thời gian O ( n ) và do đó thời gian chạy sắp xếp cơ số là O ( n log n )nđăng nhậpnlognO(n)O(nlogn)

Nhưng nó được biết rằng đó là thuật toán thời gian tuyến tính. Tại sao?


Đây là lý do tại sao các loại thời gian tuyến tính thường yêu cầu đầu vào phải là số nguyên trên một phạm vi cố định. Radix sort yêu cầu một phạm vi cố định trên các chữ số. Trong ví dụ của bạn, bạn giả sử rằng phạm vi là , nhưng bất kỳ phạm vi số nguyên nào cũng có thể cho các chữ số; ví dụ, bạn có thể lựa chọn [ 0 , [0,1][0,n]
Joe

Câu trả lời:


19

nếu chúng ta có một danh sách gồm số, chúng ta cần log n bitnlogn

Không: nếu chúng ta có một danh sách các số từ đến 2 k - 1 , chúng ta cần k bit. Không có mối quan hệ giữa klog n nói chung.02k1kklogn

Nếu các số đều khác nhau, thì và radix sắp xếp trên các số riêng biệt do đó có độ phức tạp thời gian là Ω ( n log n ) . Nói chung, độ phức tạp của loại cơ số là Θ ( nlognkΩ(nlogn) trong đó n là số phần tử cần sắp xếp và k là số bit trong mỗi phần tử.Θ(nk)nk

Để nói rằng độ phức tạp của sắp xếp cơ số là có nghĩa là lấy kích thước bit cố định cho các số. Điều này ngụ ý rằng đối với n đủ lớn , sẽ có nhiều giá trị trùng lặp.O(n)n


Có một định lý chung rằng một phương pháp sắp xếp danh sách hoặc mảng hoạt động bằng cách so sánh hai phần tử tại một thời điểm không thể chạy nhanh hơn trong trường hợp xấu nhất. Radix sort không hoạt động bằng cách so sánh các yếu tố, nhưng cùng một phương pháp chứng minh hoạt động. Radix sort là một quá trình quyết định để xác định hoán vị nào sẽ áp dụng cho mảng; có n ! hoán vị của mảng và sắp xếp cơ số có các quyết định nhị phân, nghĩa là nó quyết định có trao đổi hai phần tử hay không ở mỗi giai đoạn. Sau m quyết định nhị phân, sắp xếp cơ số có thể quyết định giữa 2 m hoán vị. Để đạt đến n ! hoán vị có thể, nó là cần thiết màΘ(nlogn)n!m2mn! .mlog(n!)=Θ(nlogn)

Một giả định trong bằng chứng mà tôi không viết ra ở trên là thuật toán phải hoạt động trong trường hợp khi các yếu tố khác biệt. Nếu được biết một tiên nghiệm rằng các yếu tố không hoàn toàn khác biệt, thì số lượng hoán vị tiềm năng ít hơn đầy đủ ! . Khi sắp xếp các số k -bit, chỉ có thể có n phần tử riêng biệt khi n 2 k ; trong trường hợp đó, độ phức tạp của loại cơ số thực sự là Ω ( n log n ) . Đối với giá trị lớn hơn của n , thì phải có va chạm, điều này giải thích cách sắp xếp cơ số có thể có một sự phức tạp đó là ít hơn Θ (n!knn2kΩ(nlogn)n khi n > 2 k .Θ(nlogn)n>2k


1
Một quan điểm khác là mô hình chi phí RAM từ: Máy của chúng tôi có thể hoạt động với các số nguyên của bit trong thời gian không đổi. (Các máy hiện tại có w = 64. ) Bằng cách đó, một bước sắp xếp phân phối với 2 w xô có thể được thực hiện trong thời gian O ( 1 ) bằng cách truy cập trực tiếp vào một phần tử mảng tương ứng. Theo cách đó, sắp xếp cơ số là tuyến tính cho n số nguyên của các bit w = O ( log n ) mỗi bit. ww=642wÔi(1)nw= =Ôi(đăng nhậpn)
Sebastian

9

Hãy cẩn thận với phân tích của bạn: bạn nghĩ gì để thực hiện sắp xếp chạy trong thời gian ? Điều này là do mỗi chữ số của bạn nằm trong phạm vi từ 0 đến k - 1 , có nghĩa là các chữ số của bạn có thể nhận k giá trị có thể. Bạn cần một thuật toán sắp xếp ổn định, ví dụ bạn có thể chọn sắp xếp đếm. Đếm loại chạy trong Θ ( n + k ) thời gian. Nếu k = O ( n ) , đếm sắp xếp chạy trong thời gian tuyến tính.Ôi(n)0k-1kΘ(n+k)k= =Ôi(n)

Mỗi một chuỗi hoặc số của bạn có số. Như bạn nói, bạn làm cho d vượt qua họ. Do đó, radix chạy loại rõ ràng trong Θ ( d ( n + k ) ) thời gian. Nhưng nếu chúng ta coi d là hằng số và k = O ( n ) , chúng ta sẽ thấy rằng loại cơ số chạy trong thời gian tuyến tính.ddΘ(d(n+k))dk= =Ôi(n)


1
Ví dụ: giả sử bạn đang sắp xếp các số nguyên trong phạm vi cho một số N = O ( n d ) cho hằng số d . Sau đó, bạn có thể có các chữ số O ( d ) với mỗi chữ số O ( n ) . [0,N-1]N= =Ôi(nd)dÔi(d)Ôi(n)
Joe

-2

Tôi nghĩ rằng giả định là sai. Bạn có thể thực hiện sắp xếp cơ số với các số trong, ví dụ, hex. Do đó, ở mỗi bước bạn chia mảng số thành 16 nhóm.k= =đăng nhập2(n)16


6
Theo như big-O, không có sự khác biệt giữa log 16 n . đăng nhập2nđăng nhập16n
Rick Decker
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.