Tôi gặp vấn đề về thuật toán mà tôi gặp phải nhưng không thể đưa ra giải pháp thỏa đáng. Tôi duyệt diễn đàn này một số và gần nhất tôi đã đến cùng một vấn đề là How to find a duplicate element in an array of shuffled consecutive integers?.Với danh sách số nguyên không theo thứ tự, trả lại giá trị không có trong danh sách
Tôi có một danh sách các phần tử N của các số nguyên có thể chứa các phần tử 1-M (M> N), hơn nữa danh sách không được phân loại. Tôi muốn một hàm sẽ lấy danh sách này làm đầu vào và trả về một giá trị trong phạm vi 1-M không có trong danh sách. Danh sách không chứa trùng lặp. Tôi đã hy vọng cho một giải pháp o (N), với việc sử dụng thêm không gian CẬP NHẬT: chức năng không thể thay đổi danh sách gốc L
Ví dụ N = 5 M = 10 Danh sách (L): 1, 2, 4, 8, 3 rồi f (L) = 5 Thành thật mà nói, tôi không quan tâm nếu nó trả về một phần tử không phải là 5, chỉ miễn là nó đáp ứng các giới hạn trên
Giải pháp duy nhất tôi đã đưa ra cho đến nay đang sử dụng mảng M khác. Đi qua danh sách đầu vào và thiết lập các phần tử mảng tương ứng thành 1 nếu có trong danh sách. Sau đó lặp lại trong danh sách này một lần nữa và trả về chỉ số của phần tử đầu tiên với giá trị 0. Như bạn có thể thấy điều này sử dụng không gian bổ sung o (M) và có độ phức tạp 2 * o (N). Bất kỳ trợ giúp nào chúng tôi sẽ đánh giá cao.
Cảm ơn sự giúp đỡ của mọi người. Cộng đồng tràn ngăn xếp chắc chắn là siêu hữu ích. Để cung cấp cho mọi người thêm một chút ngữ cảnh về vấn đề tôi đang cố giải quyết. Tôi có một bộ mã thông báo M mà tôi đưa ra cho một số khách hàng (một cho mỗi khách hàng). Khi một khách hàng được thực hiện với các mã thông báo họ nhận được trả lại cho đống của tôi. Như bạn có thể thấy thứ tự ban đầu tôi cung cấp cho khách hàng một mã thông báo được sắp xếp.
nên M = 3 Tokens
client1: 1 < 2,3>
client2: 2 < 3>
client1 trở lại: 1 < 1,3>
khách hàng 3: 3 < 1>
Bây giờ câu hỏi được đưa ra client4 mã thông báo 1. Tôi có thể ở giai đoạn này cung cấp cho khách hàng 4 thẻ 2 và sắp xếp danh sách. Không chắc chắn nếu điều đó sẽ giúp. Trong bất kỳ trường hợp nào nếu tôi nghĩ ra một giải pháp sạch sẽ, tôi chắc chắn sẽ đăng nó
Chỉ cần nhận ra rằng tôi có thể đã nhầm lẫn mọi người. Tôi không có danh sách mã thông báo miễn phí với tôi khi tôi được gọi. Tôi có thể duy trì tĩnh danh sách như vậy nhưng tôi không muốn
Bạn có thể cải thiện nó bằng cách xây dựng bộ băm có kích thước 'N' từ tất cả phần tử [thay vì tạo một mảng có kích thước' M'], và sau đó lặp lại [1, ...] cho đến khi kích thước của bộ tăng [bạn thực sự thêm một phần tử vào tập hợp]. Nó sẽ làm cho nó trở thành không gian + O (N) ', tốt hơn là giải pháp ban đầu của bạn với một mảng có kích thước' M' - mặc dù vẫn không phải là 'O (1)' không gian – amit
Một cách đơn giản hơn để làm cho nó O (N) không gian sẽ chỉ theo dõi các thành phần N đầu tiên trong danh sách. Bạn được đảm bảo hoặc kết thúc bằng một ô trống trong N giá trị đầu tiên trong M hoặc danh sách đầy đủ đầy đủ của số từ 1-N (trong trường hợp này câu trả lời của bạn là N + 1). – VeeArr
Tôi nghĩ rằng một câu trả lời hay cho câu hỏi này có thể được tìm thấy trong http://www.cs.bell-labs.com/cm/cs/pearls/ (chương đầu tiên có thể nhất). Nếu tôi nghĩ về ngày mai, tôi sẽ cố gắng tìm nó. http://stackoverflow.com/questions/1642474/find-a-missing-32bit-integer-among-a-unsorted-array-containing-at-most-4-billion – Josay