Sắp xếp một phần có thể giúp với chi phí tra cứu trong mảng?


7

Tìm kiếm thứ gì đó trong danh sách chưa sắp xếp là một nhiệm vụ với độ phức tạp thời gian . Tuy nhiên, nếu danh sách được sắp xếp, độ phức tạp thời gian là . Điều đó có nghĩa là đôi khi đáng để sắp xếp một mảng. Tuy nhiên, đó là một sự đánh đổi vì thuật toán sắp xếp có độ phức tạp thời gian là .Ôi(n)Ôi(đăng nhập(n))Ôi(nđăng nhập(n))

Theo tôi biết, bạn không thể sắp xếp một mảng trong thời gian ít hơn . Tuy nhiên tôi tự hỏi liệu có thuật toán nào có thể sắp xếp một phần mảng trong thời gian ít hơn không? Tôi khá chắc chắn rằng bạn không thể tìm kiếm một giá trị trong một mảng được sắp xếp một phần như vậy trong thời gian , nhưng bạn có thể làm tốt hơn không?Ôi(nđăng nhập(n))Ôi(đăng nhập(n))Ôi(n)

Nói tóm lại, có thể xử lý một mảng chưa được sắp xếp với thuật toán nhanh hơn sao cho thuật toán tra cứu có thể thực hiện tìm kiếm nhanh hơn , mặc dù không nhanh như ?Ôi(nđăng nhập(n))Ôi(n)Ôi(đăng nhập(n))


Tôi biết rằng có thể có một lỗi rất cơ bản hoặc quan niệm sai lầm ở đâu đó, tôi không và chưa bao giờ nghiên cứu về khoa học máy tính, và tôi không thoải mái với ký hiệuÔi
SE - ngừng bắn những người tốt vào

2
Bạn có thể sắp xếp một danh sách trong thời gian . Ôi(nđăng nhậpn)
Rick Decker

1
Có một chút không rõ chính xác những gì bạn đang tìm kiếm, nhưng hãy sử dụng một phiên bản trục nhanh - trung bình (được đảm bảo để làm việc trong nlogn để đổi lấy chi phí trung bình. Bây giờ hãy thực hiện một nửa các bước. Dữ liệu được phân vùng và trong mọi thành phần phân vùng không nằm xa chỉ mục được sắp xếp nhưng trong quá trình tra cứu, bạn phải duyệt qua một phân vùng.
Evil

2
Vui lòng xác định chính xác những gì bạn có nghĩa là "sắp xếp một phần". Có nhiều khái niệm cạnh tranh về sự sắp xếp trong tài liệu.
Raphael

1
"Có thể xử lý một mảng chưa sắp xếp với thuật toán nhanh hơn O(nlog(n))thuật toán tra cứu có thể thực hiện tìm kiếm nhanh hơn O(n)" Có thể. "Sắp xếp một phần có thể giúp với chi phí tra cứu trong mảng không?" Hoàn toàn không (cho một tra cứu duy nhất).
Vịt Mooing

Câu trả lời:


12

Nếu bạn chạy "Quicksort cân bằng" (sử dụng trung bình chính xác ở mỗi bước) cho đến độ sâu (với chi phí là ), bạn sẽ có được một phân vùng của mảng ban đầu thành các phần được sắp xếp của phần tử chưa sắp xếp mỗi. Với một phần tử, chúng ta có thể xác định phần chính xác trong thời gian bằng cách tìm kiếm nhị phân, và sau đó tìm kiếm nó bằng cách sử dụng một bổ sung , cho a tổng độ phức tạp của .kÔi(nk)2kn/2kÔi(đăng nhập(2k))= =Ôi(k)Ôi(n/2k)Ôi(n/2k+k)

Nếu thì việc sắp xếp một phần sẽ mất thời gian . Nếu thì thuật toán tra cứu sẽ mất thời gian . Do đó, nếu chúng ta sẽ có thời gian tiền xử lý và thời gian tra cứu . Ví dụ: nếu thì quá trình tiền xử lý sẽ lấy và việc tra cứu sẽ mất .k= =o(đăng nhậpn)o(nđăng nhậpn)k= =ω(1)o(n)1«k«đăng nhậpno(nđăng nhậpn)o(n)k= =đăng nhậpđăng nhậpnÔi(nđăng nhậpđăng nhậpn)Ôi(n/đăng nhậpn)


2
Nếu quicksort cân bằng biết giá trị đích và chỉ đệ quy ở bên có giá trị đích, thì thời gian là ~ 4n để đi hết chiều sâu. Đây là cách std::partial_sorttriển khai của C ++ .
Vịt Mooing

Một thay thế là phân loại cơ số không đầy đủ. Thời gian tiền xử lý có thể nhanh hơn, nhưng có ít sự kiểm soát hơn đối với kích thước thùng. Một nhận xét tương tự có thể được thực hiện về tiền băm hoàn hảo.
Tháp Eric
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.