Sự phức tạp của việc tìm kiếm lớn nhất


7

Điều gì sau đây là thuật toán của tôi để làm điều này trong những gì tôi tin là Ôi(n)thời gian, và bằng chứng của tôi cho điều đó. Giáo sư của tôi không đồng ý rằng nó chạy vàoÔi(n) và thay vào đó nghĩ rằng nó chạy trong Ω(n2)thời gian. Bất kỳ ý kiến ​​liên quan đến bản thân bằng chứng, hoặc phong cách (nghĩa là ý tưởng của tôi có thể rõ ràng nhưng bản trình bày thì không).

Câu hỏi ban đầu:

Được n số, tìm số lớn nhất mn trong số họ trong thời gian o(nđăng nhậpn). Bạn không thể giả định bất cứ điều gì khác vềm.

Câu trả lời của tôi:

  1. Sắp xếp đầu tiên mcác phần tử của mảng. Cái này mấtÔi(1) thời gian, vì điều này hoàn toàn phụ thuộc vào m, không phải n.
  2. Lưu trữ chúng trong một danh sách liên kết (duy trì thứ tự sắp xếp). Điều này cũng mấtÔi(1) thời gian, với lý do tương tự như trên.
  3. Đối với mọi phần tử khác trong mảng, kiểm tra xem nó có lớn hơn phần tử nhỏ nhất của danh sách được liên kết không. Cái này mấtÔi(n) thời gian như n so sánh phải được thực hiện.
  4. Nếu số thực tế lớn hơn, sau đó xóa phần tử đầu tiên của danh sách được liên kết (phần thấp nhất) và chèn số mới vào vị trí sẽ giữ danh sách theo thứ tự được sắp xếp. Cái này mấtÔi(1) thời gian bởi vì nó được giới hạn bởi một hằng số (m) ở trên như danh sách không phát triển.
  5. Do đó, tổng độ phức tạp cho thuật toán là Ôi(n).

Tôi biết rằng việc sử dụng cây đỏ đen trái ngược với danh sách được liên kết sẽ hiệu quả hơn về mặt không đổi (vì giới hạn trên không đổi là Ôi(mđăng nhập2(m)) như trái ngược với m và vấn đề giữ một con trỏ đến phần tử thấp nhất của cây (để tạo điều kiện so sánh) rõ ràng là có thể thực hiện được, nó chỉ không xảy ra với tôi vào thời điểm đó.

Bằng chứng của tôi bị mất là gì? Có cách trình bày chuẩn hơn (ngay cả khi nó không chính xác)?


1
"tốt hơn O(nlogn)"- đó là thô. Tôi giả sử bạn có nghĩa là Θ(nlogn)? Một vấn đề khác của câu hỏi là nó không rõ ràngmlà cố định.
Raphael

@Raphael, tôi đang gửi cho bạn những gì tôi có. Không biết anh ta có ý gì. Giả sử rằng nó thực sự làÔi(ntôiog2(n)) Liên quan đến việc có hay không mlà cố định, tôi không có ý tưởng. Khi tôi tính toán độ phức tạp, tôi cho rằng nó là như vậy, nhưng không có cơ sở cho giả định đó.
soandos

1
@soandos: Sau đó, bạn hỏi giáo sư của bạn; cả bạn và chúng tôi đều không thể làm việc với một nửa câu hỏi. Nhân tiện, từ ngữ thực tế bạn trích dẫn có một vấn đề khác: Mọi thuật toán làÔi(1)nếu bạn sửa kích thước đầu vào của bạn lên 10 tỷ.
Raphael

1
@soandos: Tôi kết hợp cập nhật của bạn vào "trích dẫn". Câu trả lời của Louis và Joe giải quyết vấn đề của bạn đầy đủ (imho). Và không thể tha thứ giải quyết các bài tập, tất nhiên.
Raphael

1
@soandos Nếu những gì bạn muốn là một giải pháp cho bài tập (cảm ơn không tha thứ), thì bạn nên yêu cầu nó ngay từ đầu. Thay vào đó, bạn đã hỏi một cái gì đó như: "là thuật toán của tôiÔi(n)và làm thế nào tôi có thể cải thiện bằng chứng của mình? "
Joe

Câu trả lời:


17

Đây là một O(n) thuật toán giải bài toán.

  1. Sử dụng trong trường hợp xấu nhất O(n) thuật toán lựa chọn để xác địnhnm+1thống kê đơn hàng thứ. Để chok là số này, là số nhỏ nhất trong số m số lượng lớn nhất chúng tôi đang cố gắng xác định.

  2. Bây giờ phân vùng mảng xung quanh trục ksử dụng chức năng phân vùng QuickSort . Bước này cóO(n) quá.

  3. Xuất ra m số lớn nhất: chúng được đưa ra bởi k và tất cả các số trong phân đoạn trên được tạo bởi phân vùng ở bước 2.


1
Đẹp. Tùy thuộc vào thuật toán bạn chọn trong 1., 2. có thể đã được thực hiện.
Raphael

5

Thuật toán của bạn mất Θ(n+mn)thời gian. Tôi nghi ngờ rằng giáo sư của bạn đang tìm kiếm một cái gì đó mấtO(n+nlogm) thời gian, có thể là có thể, có thể bằng cách sử dụng một đống ...

Nguồn gốc của sự bất đồng của bạn với giáo sư là anh ấy hoặc cô ấy dường như không nghĩ mlà một hằng số, mặc dù câu hỏi được diễn đạt như thế nào. Nếu không, thìΘ(m) tệ hơn rất nhiều so với Θ(logm).


Cây đỏ đen không mất thời gian đó?
soandos

4
Câu trả lời này không cho OP biết anh ta sai ở đâu trong lý luận của mình, bạn có thể làm rõ điều đó không?
Juho

Xem cập nhật cho câu hỏi
soandos

1

Đúng
Thiếu từ bài thuyết trình của bạn là bất biến vòng lặp để thiết lập tính đúng đắn: bạn duy trì mức lớn nhấtmcác yếu tố gặp phải cho đến nay trong một danh sách liên kết. Do đó, vào cuối thuật toán của bạn, bạn đã kiểm tra tất cả các yếu tố và vì vậy bạn có số lượng lớn nhấtmcác phần tử trong mảng. Thuật toán của bạn vẫn đúng, nhưng việc nêu rõ mục đích của danh sách được liên kết ở đầu mô tả làm cho tính chính xác của nó rõ ràng hơn.

Thời gian chạy
log10(10 billion)=10, (với cơ sở 2, khoảng ~ 33), đó là một con số nhỏ hơn 10 triệu. Trong ví dụ đã cho,m lớn hơn nhiều lần lognvà vì vậy tôi không nghĩ bạn có thể cho rằng m là hằng số.

Bạn nên cung cấp một thuật toán đó là o(nlogn) miễn là m=o(n). Thay thế danh sách liên kết và tìm kiếm tuyến tính của bạn bằng cây tìm kiếm nhị phân cân bằng hoặc heap tối thiểu sẽ đạt được thời gian chạy này:O(mlogm+nlogm)=O(nlogm)=o(nlogn). (giả địnhm=o(n), nếu không thì thời gian của bạn là Θ(nlogn))

Trong trường hợp bạn không quen thuộc với ký hiệu, trực giác đằng sau o(nlogn)<O(nlogn), nhưng xem câu hỏi tương ứng trên cs.SE để biết chi tiết về ký hiệu.


Xem cập nhật cho câu hỏi
soandos

Có vẻ câu trả lời của bạn là câu trả lời gần nhất với những gì được hỏi, nhưng tôi nghĩ bạn có thể nói đơn giản với m=n/2 Thuật toán của OP gây ra Θ(n2).
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.