2013-03-19 17 views
9

Sözlük veritabanından bir sözcük aramak için en etkili yöntem nedir. Cevabı aradım ve insanlar veri veri yapısını kullanmayı önerdiler. Ancak ağacın büyük miktarda kelime oluşturmaya yönelik stratejisi, birincil belleği yüklemek olacaktır. Veri yapısı projem için bu uygulamayı içeren bir android uygulaması yapmaya çalışıyorum. Öyleyse, herkes bana sözlüğün nasıl çalıştığını söyleyebilirdi.Belirli bir kelimeyi devasa bir veritabanından nasıl arayabilirim?

Telefonumda t9 sözlüğünü kullanırken bile, sözcük önerileri ekranda çok hızlı görünüyor. Algoritmayı ve arkasındaki tasarımı bilmek merak ediyor.

+0

Bu T9 tanımak yararlı olabilir [nasıl oluyor T9 eser] (http://stackoverflow.com/questions/2574016/data-structure-behind-t9-type-of-dictionary) –

+0

@MukulGoel Teşekkürler. bağlantınızı faydalı buldu. Ama yine de onu uygulayabileceğimi test etmek için .. Hala bundan yeni bir şey öğrendim ..Thanx :) –

+0

bir sözlük ağacını denediniz .. – Anshul

cevap

9

Büyük sözlükler aramak için en yararlı olan Trie'u kullanabilirsiniz. Çok fazla kelime benzer bir başlangıç, sabit faktör arama etrafında trie brgins kullanarak, aynı zamanda fiziksel bellek sınırlı sayıda erişim ile yerinde kullanabilirsiniz. Çok sayıda uygulamayı web'da bulabilirsiniz. Bir çok yönlü ağaç yapısı için yararlıdır (erişimle)

Bir traydan: Birisi tray ile aşina değilse

, ben this sitesi iyi olduğunu düşünüyorum ve ben sadece burada kendilerine ait örneği alıntı yapıyorum Dizeleri bir alfabe üzerinde depolar. Bu yazım denetimi programları ve doğal dillerde "anlayış" programlarında İngilizce (demek) kelimelerin büyük sözlükleri saklamak için kullanılmıştır. Verileri Verilen:

an, ant, all, allot, alloy, aloe, are, ate, be 

gelen tray olacaktır: Bu java iyi pratik Trie uygulamasıdır Sample Trie for above words

: http://code.google.com/p/google-collections/issues/detail?id=5

+0

Ama benim soru olarak belirttiğim gibi bir android app bir 10.000 kelime trie oluşturma bir sorun olabilir. Iyi arkadaşlarım bu çok kelime için trie yükleme zorla mobil uygulamayı yapmak için uygulamayı bırakacağını söyledi: | .. –

+0

@AcesSmart, Öncelikle arkadaşınızın "ağaç" kullanmayı önerdiğini, ancak bir saat sonra cevap ve yorumları gördüğünüzde, onu "trie" olarak değiştirdiğinizi söylediniz, bu aldatma ve yeni bir soru. Ayrıca "trie" ile aşina olmadığınız için, bu her yerde çalışan, arkadaşınızın "ağaç" yaklaşımından çok daha küçük bir şey, cevabımda söylediğim gibi "yerinde", bellekte yükleme yapmadan, çok sayıda arama motorları "trie" kullanıyor ve dünyadaki ilk mobil uygulamada geçerli olmadığını söylüyor. –

+0

Ayrıca, sorunuzu arkadaşınızın önerdiği "ağaç" yaklaşımından bahsetmiş olmanızdan dolayı, ama "trie" yaklaşımını önerdiği ve hala bir sorunuz olduğunu düşündüğünüzde, bu çok komik bir soru olsaydı, bu çok komik bir soru. test etmedi. (Düzenlemenizin geçmişte mevcut olduğunu unutmayın, böylece sorunuzu tamamen değiştiremezsiniz, bu da cevabımın okuyucusu için çok fazla değişiklik yapar, neden bu soruya bu şekilde cevap verdiğimi söyleyecektir, ancak yeni soru sorabilirsiniz) –

0

bunu birçok yol vardır. Bir süre önce kullanmış olduğum (özellikle sözlükte değişiklik yapmazsanız iyi olan) bir önek dizini oluşturmaktır.

Bu nedenle, girdilerinizi sözcükbilimsel olarak sıralarsınız. Ardından, farklı ilk harfler için aralıkların (son) konumlarını kaydedin. Yani, eğer girişlerinizin 1'den 1000'e kadar indeksleri varsa ve "aardvark - azerbaijan" kelimesi 1 ile 200 arasında değişirse, "a | 200" ayrı bir tabloda giriş yaparsınız, sonra ilk önce aynı şeyi yaparsınız. ve ikinci harfler. Ardından, belirli bir kelimeyi bulmanız gerekiyorsa, arama kapsamını büyük ölçüde azaltırsınız. Benim durumumda, ilk iki harf üzerindeki endeks yeterliydi.

Yine, bu yöntem, Android'de mevcut olduğunu düşündüğüm SQLite gibi bir DB'yi kullanmanızı gerektirir.

-1

Gerçekten de, bir kasayı kullanmak alan bilincindedir, sadece RAM'ım için 150.000 kelimeyi yükledikten sonra RAM kullanımımı kontrol ettiğimde fark ettim, kullanım 150 MB'dı (Trie C++ ile uygulandı). Bellek tüketimi, büyük ölçüde işaretçilerinden kaynaklandı. 30 MB civarında (150 MB'ye kıyasla) daha az hafıza israfına sahip olan üçlü denemelerle sonuçlandım ama zaman karmaşıklığı biraz arttı. Başka bir seçenek de, bellek kaybının çok daha az olduğu fakat zaman karmaşıklığının üçlü ağaçtan daha fazla olduğu "Sol çocuk Sağ kardeş" in kullanılmasıdır.

İlgili konular