2013-03-29 16 views
5

Milyonlarca dizem var. Her dizenin bir int değeri vardır. Bu değeri giriş dizesiyle almak istiyorum ancak çok fazla yer kapladıklarından tüm bu dizeleri saklamak istemiyorum. Karma tabloyu kullanamam çünkü bellekte tüm veya en az çok dizeyi saklamak gerekiyor. Peki benim durumum için iyi bir veri yapısı nedir (herhangi bir dizeyi eklemem ya da silmem gerekmedim, zaten veri hazırladım ve okuyabiliyorum sadece çalışmaya izin veriliyor)Dizeleri saklamak için bellek verimli yolu

+2

Hangi programlama dili? Ayrıca, birçok özdeş dizeleri var mı? –

+0

@ jdv-Jan de Vaan Tüm dizeler benzersiz değildir. Soru dilime özgü olduğunu düşünmüyorum ama C# yi tercih ediyorum. – Neir0

+1

Yapmanız gereken şey açık değil. Sadece bu sayıları çıkarmanız ve başka bir dosyaya kaydetmeniz gerekiyor mu? Veya onlarla bazı hesaplamalar yapman gerekiyor mu? Giriş sırası korunmuyorsa tamam mı? –

cevap

0

Bir hash tablosunun kullanılma nedeniniz yok Ses şu anda sorunuzdaki sınırlı bilgilere dayanarak geçerlidir. İyi uygulandığında oldukça etkilidir. İhtiyaçlarınız için kabul edilebilirse, tekrarlı dizeleri saklamak için bellekleri boşa harcamamanın avantajına da sahip olabilir;

Ayrıca, aramalarınızı nasıl yapacağınız konusunda yaratıcıysanız, her bir dizenin sıkıştırılmış formunu hash tablosunda saklayabilirsiniz. Dizeler tipik olarak ne kadardır?

+0

Ortalama uzunluk 10 harftir. En azından, dizeleri hashtabamın bir öğe yığını ile depolayamıyorum. Bu yüzden bu yaklaşımı desteklemenin bir yolu var. – Neir0

4

kullanın ortak alt dizeleri depolamak önlemek için bir trie ..

+0

Trie iyi bir fikir ama çok daha yavaş, sonra hashtable. – Neir0

+0

@larsmans Heh!Çok büyük bir regex modelinin verimliliğini en üst düzeye çıkarmak için böyle bir şey hakkında olsa da, şimdi bir regex dize ayrıştırıldığında otomatik olarak yapılır eğer merak ediyorum. Ne aradığını bilmek güzel. – Nolo

+0

bir hashtable dizeleri saklamak için bellek etkin bir yol değil, ancak – argentage

1

Sen dize tuşları için tasarlanmış bir versiyonu hızlı ve kompakt hem olacak şekilde tasarlanmış ve vardır Judy tree, bakmak isteyebilirsiniz. Uygulaması sourceforge'da kullanılabilir.

2

Kelime listesini önceden işleyebilirseniz, CMPH gibi mükemmel karmalara bakın. (gperf başka bir şeydir, ama daha küçük veri kümeleri için optimize görünüyor.) Daha ziyade diyabet Dokümanlar

:

mükemmel hash fonksiyonu çarpıştırmadan m tamsayı sayı kümesinin içine n anahtarlarının bir statik dizi eşler, burada m n'den büyük veya eşittir. M n'ye eşitse, işlev minimal olarak adlandırılır.

...

daha ziyade diyabet Kütüphane kolay kullanımlı, üretim kaliteli, hızlı API en yeni ve daha verimli algoritmalar kapsüller. Kütüphane, ana belleğe sığamayan büyük girişlerle çalışmak üzere tasarlanmıştır. 100 milyondan fazla tuşa sahip takımlar için minimum mükemmel hash fonksiyonları oluşturmak için başarıyla kullanıldı, ...

İlgili konular