Biện pháp nào của Rối loạn nên sử dụng khi Phân tích Quicksort


9

Tôi đang cố gắng hiểu tại sao quicksort sử dụng phân vùng Lomuto và một trục cố định lại hoạt động thất thường, nhưng nhìn chung rất kém, trên các đầu vào được tạo ngẫu nhiên. Tôi nghĩ rằng mặc dù các đầu vào được tạo ngẫu nhiên, có thể có rất nhiều thứ tự cho các chuỗi, nhưng tôi không chắc làm thế nào để đo mức độ rối loạn trong các chuỗi. Tôi đã nghĩ về việc sử dụng số lượng đảo ngược, nhưng tôi thấy từ câu hỏi khác này tôi đã hỏi rằng đó không thực sự là một biện pháp tốt trong trường hợp này.

Lý do tôi nghi ngờ rằng các chuỗi ngẫu nhiên của tôi có rất nhiều "trật tự" đối với chúng là việc ngẫu nhiên trục xoay khắc phục vấn đề hiệu năng. Nhưng về mặt lý thuyết, không nên có bất kỳ vấn đề hiệu suất nào trên các chuỗi đầu vào được cho là "ngẫu nhiên" này.


Một biện pháp tốt cho rối loạn cho loại điều này là độ phức tạp Kolmogorov. Về cơ bản nó nói rằng chuỗi bị rối loạn nhất là những chuỗi không thể nén được. Nó dẫn đến phương pháp không thể nén được, được sử dụng để thực hiện những việc như phân tích trường hợp trung bình của các thuật toán sắp xếp và tìm mối quan hệ giữa phân tích trường hợp trung bình và trường hợp xấu nhất.
Peter

Tôi nên lưu ý rằng tôi là sinh viên chưa tốt nghiệp ... Tôi đang tìm kiếm thứ gì đó thẳng hơn một chút, giống như có thể là một trong những biện pháp trong bài viết này (tôi chỉ không biết cái nào): citeseerx.ist.psu. edu / viewdoc / tóm tắt? doi = 10.1.1.45.8017
Robert S. Barnes


Bạn nên nghi ngờ một lỗi lập trình hơn là trường hợp xoay vòng đối nghịch. Chỉ cần sắp xếp một chuỗi các số nguyên được xáo trộn từ 1 đến N để xem thuật toán của bạn có sắp xếp không!
Yves Daoust

@YvesDaoust Tôi không nghĩ điều đó thực sự quan trọng, Lượng "không đơn điệu" thực sự chỉ là độ phức tạp Kolmogorov của chuỗi độ dàimã hóa thứ tự của các phần tử trong chuỗi. Tất nhiên, nó không thể tính toán được và bạn phải suy nghĩ về các chuỗi sâu như các giả danh, nhưng nó hữu ích theo nghĩa là mọi biện pháp rối loạn về cơ bản là xấp xỉ độ phức tạp Kolmogorov. Và bạn không cần phải tính toán nó để chứng minh mọi thứ với nó. Nhiều kết quả phức tạp đã được hiển thị với phương pháp không thể nén được. logn!
Peter

Câu trả lời:


1

Phân vùng Lomuto vs Hoare
Lomuto bị ảnh hưởng khi sắp xếp các khóa bằng nhau, trong khi phân vùng Hoare thì không.
Cả hai lược đồ phân vùng đều chịu đựng như nhau khi sử dụng một trục xa từ trung tuyến.

Biện pháp rối loạn
Biện pháp rối loạn để lựa chọn cho các mục đích của quicksort là đơn giản.
Trả lời: Khoảng cách xa trung bình là trục cố định, so với dữ liệu ngẫu nhiên?
Nếu bạn khăng khăng sử dụng phân vùng Lomuto và nếu bạn cho rằng các giá trị trùng lặp được cho phép, bạn cần thêm thử nghiệm sau đây chống lại tính ngẫu nhiên:
B: Có bao nhiêu yếu tố trùng lặp ở đó, so với ngẫu nhiên.

Tất nhiên, thật ngớ ngẩn khi cho rằng các giá trị trùng lặp được cho phép trong tập dữ liệu của bạn và vẫn đánh giá phân vùng Lomuto, vì vậy bạn có thể nên loại bỏ trùng lặp trước hoặc chuyển sang phân vùng Hoare hoặc giả sử là trùng lặp.

Cả hai biện pháp đều tầm thường để định lượng bằng cách sử dụng số liệu thống kê.

Chúng tôi có thể loại trừ dữ liệu bệnh lý
Bất kỳ sai lệch nào khác từ tính ngẫu nhiên sẽ không quan trọng đối với mục đích phân tích quicksort. Miễn là trục gần với trung vị, nó sẽ hoạt động tốt trên tất cả các dữ liệu không phải là bệnh lý.
Khoảng cách từ ngẫu nhiên sẽ phải thực sự lớn để trở thành bệnh lý nhanh chóng, vì vậy chúng ta có thể loại trừ điều đó.

Không bao giờ sử dụng bất kỳ trục cố định nào trong mã thực
Lưu ý rằng nếu bạn viết mã thực với trục cố định *) (bất kể trục đó có thể là gì), bạn đang tự mở một cuộc tấn công từ chối dịch vụ, bởi vì kẻ tấn công có thể chèn một giá trị bệnh lý tại thời điểm đó và do đó bạn nên luôn luôn chọn một yếu tố ngẫu nhiên làm trục.

*) hoặc nhiều pivots nếu bạn chọn xivots tốt nhất.

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.