Bạn có thể làm điều đó trong thời gian và không gian thêm O ( l ) như sau:O(l+k log l)O(l)
- Xây dựng một đống nhị phân với một mục nhập cho mỗi mảng. Khóa cho mục là phần tử nhỏ nhất trong mảng A i . Cái này mấtiAithời gian O ( l ) .O(l)
- Chọn mục nhập nhỏ nhất từ heap và loại bỏ nó (mất thời gian )). Thêm mục nhập đó trở lại heap bằng cách sử dụng mục nhập nhỏ nhất tiếp theo trong mảng có liên quan làm khóa của nó (lại là thời gian O ( log l ) ).O(log lO(log l)
- Làm bước trước lần. Yếu tố cuối cùng bạn loại bỏ khỏi heap là câu trả lời của bạn.k
Nếu bạn thay thế heap nhị phân bằng heap Fibonacci, tôi nghĩ rằng điều này sẽ khiến bạn giảm thời gian khấu hao , nhưng trên thực tế, nó sẽ chậm hơn heap nhị phân trừ khi l là LỚN.O(l+k)l
Tôi nghi ngờ rằng giới hạn heap Fibonacci là tối ưu, bởi vì theo trực giác, bạn sẽ phải kiểm tra ít nhất phần tử để tìm phần tử nhỏ thứ k và bạn sẽ phải kiểm tra ít nhất một phần tử từ mỗi phần tử l mảng vì bạn không biết làm thế nào họ đang sắp xếp, mà ngay lập tức đưa ra một giới hạn thấp hơn của Ω ( max ( k , l ) ) = Ω ( k + l ) .kklΩ(max(k,l))=Ω(k+l)