Phương pháp 1
Kể từ khi k là nhỏ, bạn có thể sử dụng phương pháp giải đấu để tìm ra thứ k lớn nhất. Phương pháp này được mô tả trong Nghệ thuật lập trình của Knuth, Tập 3, Trang 212.
Đầu tiên tạo giải đấu trên các phần tử n-k + 2. Một cái gì đó giống như một giải đấu quần vợt loại trực tiếp. Đầu tiên bạn chia thành các cặp và so sánh các thành viên của các cặp (như thể hai người đó đã chơi một trận đấu và một người thua). Sau đó, những người chiến thắng, bạn chia thành cặp một lần nữa và như vậy, cho đến khi bạn có một người chiến thắng. Bạn có thể xem nó như một cái cây, với người chiến thắng ở trên cùng.
Điều này có nghĩa là n-k + 1 so sánh chính xác.
Bây giờ, người chiến thắng của các n-k + 2 này không thể là phần tử lớn thứ k của bạn. Hãy xem xét con đường của nó P lên giải đấu.
Trong số k-2 còn lại bây giờ hãy chọn một, và theo đó, đường dẫn P sẽ cung cấp cho bạn một điểm mới lớn nhất. Về cơ bản bạn sắp xếp làm lại giải đấu với người chiến thắng trước đó được thay thế bằng một trong các yếu tố k-2. Hãy để P là con đường của người chiến thắng mới. Bây giờ hãy chọn một cái khác từ k-3 và đi theo con đường mới và vân vân.
Cuối cùng sau khi bạn thải ra k-2, thay thế lớn nhất bằng -infinity và lớn nhất của giải đấu sẽ là k lớn nhất. Các yếu tố bạn đã bỏ đi là các yếu tố k-1 hàng đầu.
Điều này chiếm tối đa n - k + (k-1) [log (n-k+2)]
so sánh để tìm k hàng đầu. Nó sử dụng O (n) bộ nhớ mặc dù.
Xét về số lần so sánh, điều này có thể sẽ đánh bại mọi thuật toán lựa chọn.
Phương pháp 2
Là một thay thế, bạn có thể duy trì một min-đống yếu tố k.
Đầu tiên chèn phần tử k. Sau đó, đối với mỗi phần tử của mảng, nếu nó nhỏ hơn phần tử min của heap, hãy vứt nó đi. Nếu không, xóa-min của heap và chèn phần tử từ mảng.
Cuối cùng, heap sẽ chứa các phần tử k trên cùng. Điều này sẽ mất O(n log k)
so sánh.
Tất nhiên, nếu n nhỏ, chỉ cần phân loại mảng phải đủ tốt. Mã sẽ đơn giản hơn.
Huh? -> Bây giờ, người chiến thắng của những n-k + 2 này không thể là phần tử lớn nhất của bạn –
@Ohmu: Typo. K lớn nhất ... Đã sửa. –
Có ai có một số mã cho điều này? Đó là thời gian tôi đã có một tổ chức của cuốn sách của Knuth ... –