Đưa ra một std::vector
trong các phần tử riêng biệt được sắp xếp theo thứ tự tăng dần, tôi muốn phát triển một thuật toán xác định xem có hai phần tử trong bộ sưu tập có tổng là một giá trị nhất định hay không sum
.
Tôi đã thử hai cách tiếp cận khác nhau với sự đánh đổi tương ứng của họ:
Tôi có thể quét toàn bộ vectơ và, đối với mỗi phần tử trong vectơ, áp dụng tìm kiếm nhị phân (
std::lower_bound
) trên vectơ để tìm kiếm một phần tử tương ứng với sự khác biệt giữasum
và phần tử hiện tại. Đây là một giải pháp thời gian O (n log n) không yêu cầu thêm không gian.Tôi có thể đi qua toàn bộ vectơ và điền vào một
std::unordered_set
. Sau đó, tôi quét vectơ và, đối với mỗi phần tử, tôi tìm kiếmstd::unordered_set
sự khác biệt giữasum
phần tử hiện tại. Vì tìm kiếm trên bảng băm chạy trong thời gian trung bình không đổi, giải pháp này chạy trong thời gian tuyến tính. Tuy nhiên, giải pháp này đòi hỏi không gian tuyến tính bổ sung vìstd::unordered_set
cấu trúc dữ liệu.
Tuy nhiên, tôi đang tìm kiếm một giải pháp chạy trong thời gian tuyến tính và không yêu cầu thêm không gian tuyến tính. Có ý kiến gì không? Có vẻ như tôi buộc phải đánh đổi tốc độ lấy không gian.