Tại sao Quicksort ngẫu nhiên có chi phí thời gian chạy trường hợp xấu nhất O (n log n)


18

Randomized Quick Sort là phần mở rộng của Quick Sort trong đó phần tử trục được chọn ngẫu nhiên. Điều gì có thể là sự phức tạp thời gian trường hợp xấu nhất của thuật toán này. Theo tôi, nó phải là O(n2) , vì trường hợp xấu nhất xảy ra khi trục được chọn ngẫu nhiên được chọn theo thứ tự được sắp xếp hoặc đảo ngược . Nhưng trong một số văn bản [1] [2] độ phức tạp trong trường hợp xấu nhất của nó được viết làO(nlogn)

Có gì đúng?


3
Bạn nên nói "một số văn bản" mà bạn đang nói về. Có một cái gì đó ẩn ở đó. Bạn sẽ tìm thấy nó nếu bạn đọc lại "văn bản" này
AJed

Lưu ý: Liên kết [1] đã chết. Liên kết [2] nói rõ rằng thuật toán là ngẫu nhiên, do đó, đối với mọi đầu vào bạn không có "thời gian chạy", nhưng "thời gian chạy dự kiến". Và thời gian chạy dự kiến ​​cho đầu vào tồi tệ nhất có thể là O (n log n).
gnasher729

Câu trả lời:


18

Cả hai nguồn của bạn đều đề cập đến "thời gian chạy dự kiến ​​trong trường hợp xấu nhất" của Tôi đoán điều này đề cập đến yêu cầu thời gian dự kiến, khác với trường hợp xấu nhất tuyệt đối.O(nlogn).

Quicksort thường có yêu cầu thời gian trong trường hợp xấu nhất tuyệt đối là . Trường hợp xấu nhất xảy ra khi, ở mỗi bước, thủ tục phân vùng chia một mảng thứ n thành các mảng có kích thước 1n - 1 . Sự lựa chọn các yếu tố trục "không may mắn" này đòi hỏi các cuộc gọi đệ quy O ( n ) , dẫn đến trường hợp xấu nhất O ( n 2 ) .O(n2)n1n1O(n)O(n2)

Việc chọn trục ngẫu nhiên hoặc xáo trộn ngẫu nhiên mảng trước khi sắp xếp có tác dụng khiến trường hợp xấu nhất rất khó xảy ra, đặc biệt đối với các mảng lớn. Xem Wikipedia để biết bằng chứng rằng yêu cầu về thời gian dự kiến . Theo một nguồn khác , "xác suất quicksort sẽ sử dụng số lượng so sánh bậc hai khi sắp xếp một mảng lớn trên máy tính của bạn ít hơn nhiều so với xác suất máy tính của bạn bị sét đánh".O(nlogn)

Biên tập:

Theo nhận xét của Bangye, bạn có thể loại bỏ chuỗi lựa chọn trục trong trường hợp xấu nhất bằng cách luôn chọn phần tử trung vị làm trục. Kể từ khi việc tìm kiếm trung bình phải mất thời gian, điều này sẽ cho Θ ( n log n ) thực hiện trường hợp xấu nhất. Tuy nhiên, vì quicksort ngẫu nhiên rất khó có thể vấp ngã trong trường hợp xấu nhất, nên biến thể tìm kiếm trung bình xác định của quicksort hiếm khi được sử dụng.O(n)Θ(nlogn)


Vì vậy, nói chung, chúng ta có thể nói nó hoạt động như một bậc hai trong trường hợp xấu nhất
Atinesh

@Atinesh Không, ít nhất nếu bạn có nghĩa là vì điều đó. Θ
Raphael

Tôi nghĩ thật đúng khi nói hiệu suất trong trường hợp xấu nhất của quicksort ngẫu nhiên là Ôi(n2).
James Evans

4
Quicksort có thể mất chỉ thời gian trong trường hợp xấu nhất nếu sử dụng một thuật toán tuyến tính thời gian để tìm ra trung bình là trục. Tất nhiên, quicksort ngẫu nhiên thường có hiệu suất thực tế tốt hơn. Θ(nđăng nhậpn)
Bangye

6

Bạn đã bỏ lỡ rằng các văn bản này nói về " thời gian chạy dự kiến tồi tệ nhất ", không phải là "thời gian chạy tồi tệ nhất".

Họ đang thảo luận về việc triển khai Quicksort liên quan đến một yếu tố ngẫu nhiên. Thông thường bạn có một thuật toán xác định, đó là một thuật toán mà với một đầu vào nhất định sẽ luôn tạo ra các bước chính xác giống nhau. Để xác định "thời gian chạy trường hợp xấu nhất", bạn kiểm tra tất cả các đầu vào có thể và chọn một trong đó tạo ra thời gian chạy tồi tệ nhất.

Nhưng ở đây chúng ta có một yếu tố ngẫu nhiên. Với một số đầu vào, thuật toán sẽ không luôn luôn thực hiện các bước tương tự vì một số ngẫu nhiên có liên quan. Thay vì có thời gian chạy cho mỗi đầu vào cố định, chúng tôi có "thời gian chạy dự kiến" - chúng tôi kiểm tra từng giá trị có thể có của các quyết định ngẫu nhiên và xác suất của chúng và "thời gian chạy dự kiến" là trung bình trọng số của thời gian chạy cho mỗi kết hợp các quyết định ngẫu nhiên , nhưng vẫn cho một đầu vào cố định.

Vì vậy, chúng tôi tính toán "thời gian chạy dự kiến" cho mỗi đầu vào có thể và để có được "thời gian chạy dự kiến ​​tồi tệ nhất", chúng tôi tìm thấy một đầu vào có thể có trong đó thời gian chạy dự kiến ​​là tồi tệ nhất. Và rõ ràng họ đã chỉ ra rằng trường hợp xấu nhất đối với "thời gian chạy dự kiến" chỉ là O (n log n). Tôi sẽ không ngạc nhiên nếu chỉ chọn ngẫu nhiên trục đầu tiên sẽ thay đổi thời gian chạy dự kiến ​​tồi tệ nhất thành o (n ^ 2) (ít o thay vì Big O), bởi vì chỉ một vài trong số các pivots sẽ dẫn đến trường hợp xấu nhất hành vi.


2

Lưu ý rằng có hai điều cần kỳ vọng / trung bình hơn: hoán vị đầu vào và pivots (một cho mỗi phân vùng).

nΘ(nđăng nhậpn)

Θ(nđăng nhậpn)

Tóm lại, hãy kiểm tra (các) nguồn của bạn để biết họ sử dụng triển khai nào và số lượng họ xem xét tương ứng ngẫu nhiên. cố định trong phân tích của họ.


Hãy xem xét câu hỏi này postimg.org/image/fiurc4z87 mà tôi đã hỏi trong kỳ thi. Những gì ans thích hợp bạn sẽ đề nghị tôi nghĩ (c)
Atinesh

1
@Atinesh Tôi nghĩ rằng câu trả lời của tôi cung cấp cho bạn đủ thông tin về điều này.
Raphael

-1

Ôi(n2)

Trường hợp xấu nhất cho quicksort ngẫu nhiên là các yếu tố tương tự như đầu vào. Vd: 2,2,2,2,2,2

T(n)= =T(n-1)+nÔi(n2)


Đó là nếu bạn có một triển khai cực kỳ nhanh chóng của quicksort. Bất kỳ triển khai tốt nào cũng sẽ được trao đổi trong phân vùng đầu tiên # 1 và # 6, # 2 và # 5, # 3 và # 4, sau đó sẽ sắp xếp hai phân đoạn có độ dài 3.
gnasher729

Tôi đoán bạn có <= cũng như> = trên cả hai con trỏ quét từ LHS và RHS. Đó là lý do tại sao bạn nói như vậy. '=' được liên kết với một trong hai con trỏ, không phải cả hai. Trong trường hợp đó, cây đệ quy phát triển cho đến n.
pratyay

Và đó là những gì tôi gọi là một triển khai cực kỳ daft. Bất kỳ việc thực hiện nào có thời gian chạy bậc hai cho trường hợp "tất cả các phần tử đều bằng nhau" là ngu ngốc. Có những triển khai thực sự mất thời gian tuyến tính trong trường hợp này (O (n), không phải O (n log n)).
gnasher729
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.