2012-11-09 53 views
5

Đây là một câu hỏi thú vị mà tôi đã gặp phải trong một thời gian trước và đã gặp một số vấn đề khi giải quyết nó.m số nguyên bị thiếu trong một mảng có kích thước n

Có một mảng số nguyên được phân loại kích thước N lưu trữ với số 1,2 .., N + M , với M số nguyên thiếu từ nó. MN được biết trước mặt. Viết một thuật toán để tìm số thiếu M số nguyên theo cách hiệu quả nhất.

Đã cố gắng lập bản đồ nó vào một mảng có kích thước N + M, do đó i chỉ số thứ chứa các phần tử với giá trị i, nhưng điều này đòi hỏi 2 quét (1 cho lập bản đồ, 1 để tìm số M số bị thiếu).

Cuốn sách mà tôi đề cập đến điều này đề cập đến một giải pháp quét đơn lẻ là có thể nhưng tôi không thể đến được nó. Bất kỳ ý tưởng về cách đi về điều này?

+1

Bạn có thể viết xuống một bản quét không? Cảm ơn. –

+0

Câu hỏi này có vẻ rất bản địa hóa và bạn cũng không đưa ra bất kỳ bằng chứng nào cho thấy bạn đã tự mình giải quyết vấn đề. – lockstock

+0

@lockstock xin lỗi về điều đó. Tôi đã chỉnh sửa câu hỏi. Hi vọng điêu nay co ich. – sanz

Trả lời

1

Bạn có thể thực hiện việc này với danh sách được liên kết kép được lập bản đồ trên đầu một mảng.

position 1 2 3 4 5 6 ... 
next  2 3 4 5 6 7 ... 
prev  0 1 2 3 4 5 ... 

Khi vượt qua đầu vào, bạn chỉ mục vào vị trí tương ứng với mỗi số đầu vào và cập nhật danh sách liên kết để xóa (bỏ qua) vị trí đó khỏi danh sách được liên kết. Vào cuối đầu vào, danh sách liên kết sẽ chỉ chứa các vị trí không được truy cập.

+0

Nhưng bạn không phải lặp qua danh sách liên kết để in ra các số nguyên còn thiếu? Đó là vòng lặp '> 1' khi tôi hiểu nó? – irrelephant

+0

@irrelephant Bạn đặt cược, giả sử bạn muốn in chúng. Tôi không nghĩ rằng bạn có thể làm tốt hơn từ quan điểm phức tạp thời gian là 'O (N) + O (M)' bởi vì cho đến khi bạn đạt tới điểm cuối của 'N' bạn không thể biết cái cuối cùng của cái thiếu từ' M '. Nếu bạn đã bắt đầu in, phần cuối của 'N' có thể làm hỏng đầu ra của bạn bằng cách chứa một cái gì đó bạn đã in. Tôi chắc rằng bạn có thể làm tốt hơn từ góc nhìn phức tạp về không gian khi M << N, như [câu trả lời toán học khá ấn tượng] (http://stackoverflow.com/a/3492967/1756702) được liên kết trong các nhận xét ở trên dường như làm. –

+0

Tôi không nên sử dụng ký hiệu Big-O ở đó. Tôi có nghĩa là để nói rằng tôi không nghĩ rằng bạn không thể làm tốt hơn so với một đi qua 'N' và' M' nếu bạn muốn in 'M'. –

Các vấn đề liên quan