Bu röportaj sorusu bana verildi:
Dört milyar tamsayı içeren bir girdi dosyası verildiğinde, dosyada bulunmayan bir tamsayı oluşturmak için bir algoritma sağlayın. 1 GB belleğiniz olduğunu varsayın. Yalnızca 10 MB belleğiniz varsa ne yapacağınızı takip edin.
Analizim:
Dosyanın boyutu 4 × 10 9 × 4 bayt = 16 GB'dir.
Harici sıralama yapabiliriz, böylece tamsayıların aralığını bize bildiririz.
Benim sorum sıralanmış büyük tamsayı kümelerinde eksik tamsayıyı tespit etmenin en iyi yolu nedir?
Anlayışım (tüm cevapları okuduktan sonra):
32 bit tamsayılardan bahsettiğimizi varsayarsak, 2 32 = 4 * 10 9 vardır. farklı tamsayı vardır.
Durum 1: 1 GB = 1 * 10 9'umuz var * 8 bit = 8 milyar bit belleğimiz var.
Çözüm:
Farklı bir tamsayıyı temsil eden bir bit kullanırsak, yeterlidir. sıralamaya ihtiyacımız yok.
Uygulama:
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);
}
}
}
Durum 2: 10 MB bellek = 10 * 10 6 * 8 bit = 80 milyon bit
Çözüm:
Tüm olası 16 bit önekler için, 2 16 sayı tamsayı = 65536, 2 16 * 4 * 8 = 2 milyon bite ihtiyacımız var. 65536 kova üretmemiz gerekiyor. Her kova için tüm olasılıkları elinde tutan 4 bayta ihtiyacımız var çünkü en kötü durum 4 milyar tam sayının hepsi aynı kovaya ait.
- Dosyadan ilk geçişte her bir bölümün sayacını oluşturun.
- Kovaları tarayın, 65536'dan daha az isabet alan ilk olanı bulun.
- Dosyanın ikinci geçişinden 2. adımda yüksek 16 bit önekleri bulunan yeni kovalar oluşturun
- 3. adımda inşa edilen kovaları tarayın, isabetsiz olan ilk kovayı bulun.
Kod yukarıdakine çok benzer.
Sonuç: Dosya geçişini artırarak hafızayı azaltıyoruz.
Geç gelenler için bir açıklama: Soru, sorulduğu gibi, dosyada bulunmayan tam olarak bir tamsayı olduğunu söylemez - en azından çoğu kişi bunu yorumlamaz. Yorum dizisindeki Birçok yorumlar vardır gerçi, görevin konusu varyasyonun hakkında. Ne yazık ki, yorum dizisine tanıtan yorum daha sonra yazarı tarafından silindi, bu yüzden artık yetim cevaplar her şeyi yanlış anladı gibi görünüyor. Çok kafa karıştırıcı, üzgünüm.