Tôi cần tìm các chỉ số của k phần tử lớn nhất của một unsorted, length n, array/vector trong C++, với k < n. Tôi đã thấy cách sử dụng nth_element() để tìm số liệu thống kê thứ k, nhưng tôi không chắc liệu đây có phải là sự lựa chọn đúng đắn cho vấn đề của tôi vì có vẻ như tôi cần phải gọi k tới nth_statistic, mà tôi đoán nó sẽ có độ phức tạp O (kn), mà có thể tốt như nó có thể nhận được? Hoặc là có một cách để làm điều này chỉ trong O (n)?chỉ số của k phần tử lớn nhất trong một mảng có chiều dài không phân loại
Thực hiện nó mà không có nth_element() có vẻ như tôi sẽ phải lặp lại toàn bộ mảng một lần, điền vào danh sách các chỉ mục của các phần tử lớn nhất ở mỗi bước.
Có điều gì trong thư viện C++ chuẩn làm cho một lớp lót này trở thành một lớp hay cách thông minh để thực hiện điều này chỉ trong một vài dòng? Trong trường hợp cụ thể của tôi, k = 3, và n = 6, vì vậy hiệu quả không phải là một mối quan tâm lớn, nhưng nó sẽ là tốt đẹp để tìm một cách sạch sẽ và hiệu quả để làm điều này cho k tùy ý và n.
Có vẻ như Mark the top N elements of an unsorted array có lẽ là bài đăng gần nhất tôi có thể tìm thấy trên SO, các bài đăng có bằng Python và PHP.
Bạn có thể sửa đổi véc tơ không? nth_element sẽ thực hiện sắp xếp một phần tại chỗ, do đó nó thay đổi vector. – amdn
Vectơ có thể được sửa đổi, tuy nhiên kết quả cuối cùng cần phải là các chỉ số (của vectơ gốc) của k phần tử lớn nhất. – hazelnusse
Đây chỉ là một thuật toán lựa chọn. Thông thường bạn sẽ sử dụng lựa chọn heap hoặc chọn nhanh. Xem http://stackoverflow.com/q/7746648/56778 để có câu hỏi tương tự. Có một câu trả lời với một giải pháp C++ tốt. (bằng cách sử dụng priority_queue) –