Tôi đã được đưa ra câu hỏi phỏng vấn này:
Đưa ra một tệp đầu vào có bốn tỷ số nguyên, cung cấp một thuật toán để tạo một số nguyên không có trong tệp. Giả sử bạn có bộ nhớ 1 GB. Theo dõi những gì bạn sẽ làm nếu bạn chỉ có 10 MB bộ nhớ.
Phân tích của tôi:
Kích thước của tệp là 4 × 10 9 × 4 byte = 16 GB.
Chúng tôi có thể thực hiện sắp xếp bên ngoài, do đó cho chúng tôi biết phạm vi của các số nguyên.
Câu hỏi của tôi là cách tốt nhất để phát hiện số nguyên bị thiếu trong các bộ số nguyên lớn được sắp xếp là gì?
Sự hiểu biết của tôi (sau khi đọc tất cả các câu trả lời):
Giả sử chúng ta đang nói về số nguyên 32 bit, có 2 số nguyên 32 = 4 * 10 9 .
Trường hợp 1: chúng ta có 1 GB = 1 * 10 9 * 8 bit = bộ nhớ 8 tỷ bit.
Giải pháp:
Nếu chúng ta sử dụng một bit đại diện cho một số nguyên riêng biệt, nó là đủ. chúng ta không cần sắp xếp.
Thực hiện:
int radix = 8;
byte[] bitfield = new byte[0xffffffff/radix];
void F() throws FileNotFoundException{
Scanner in = new Scanner(new FileReader("a.txt"));
while(in.hasNextInt()){
int n = in.nextInt();
bitfield[n/radix] |= (1 << (n%radix));
}
for(int i = 0; i< bitfield.lenght; i++){
for(int j =0; j<radix; j++){
if( (bitfield[i] & (1<<j)) == 0) System.out.print(i*radix+j);
}
}
}
Trường hợp 2: Bộ nhớ 10 MB = 10 * 10 6 * 8 bit = 80 triệu bit
Giải pháp:
Đối với tất cả các tiền tố 16 bit có thể, có 2 số nguyên 16 = 65536, chúng ta cần 2 16 * 4 * 8 = 2 triệu bit. Chúng tôi cần xây dựng 65536 xô. Đối với mỗi nhóm, chúng ta cần 4 byte chứa tất cả các khả năng vì trường hợp xấu nhất là tất cả 4 tỷ số nguyên thuộc về cùng một nhóm.
- Xây dựng bộ đếm của mỗi nhóm thông qua lần đầu tiên đi qua tệp.
- Quét các thùng, tìm người đầu tiên có ít hơn 65536 lượt truy cập.
- Xây dựng các nhóm mới có tiền tố 16 bit cao được tìm thấy trong bước 2 đến lần chuyển thứ hai của tệp
- Quét các thùng được xây dựng trong bước 3, tìm thùng đầu tiên không có hit.
Mã này rất giống với ở trên.
Kết luận: Chúng tôi giảm bộ nhớ thông qua việc tăng vượt qua tập tin.
Một sự làm rõ cho những người đến muộn: Câu hỏi, như đã hỏi, không nói rằng có chính xác một số nguyên không có trong tập tin Ít nhất đó không phải là cách mà hầu hết mọi người giải thích nó. Mặc dù vậy, nhiều bình luận trong luồng nhận xét là về sự biến đổi của nhiệm vụ. Thật không may, bình luận giới thiệu nó với chủ đề bình luận sau đó đã bị xóa bởi tác giả của nó, vì vậy bây giờ có vẻ như các câu trả lời mồ côi cho nó chỉ hiểu sai mọi thứ. Rất khó hiểu, xin lỗi.