2009-03-06 18 views
3

Bir süredir otomatik tamamlama açılan açılan kutuyu uygulamak için veri yapısı olarak bir süredir Ternary Search Tree kullanıyordum. "Fo" kullanıcı tipi, açılan kutunun aşağı açılanCase Duyarsız Üçlü Arama Ağacı

foo gıda futbol

sorundur, Üçlü Arama Tree kullanılan benim şimdiki görüntüler alırken hangi harfe duyarlıdır, anlamına gelir. Uygulamam takip gibidir. Gerçek dünya tarafından yaklaşık 1 ++ yeas için kullanılmıştır. Bu nedenle, oldukça güvenilir olduğunu düşünüyorum.

My Ternary Search Tree code

Ancak, ben demektir duyarsız Üçlü Arama Ağacı, ben "fo" yazıp bir durumda arıyorum, açılan kutu aşağı düşmesi bana

Foo Yiyecek futbol gösterecektir

TST için bazı önemli arabirimler aşağıdadır; burada yeni durumun TST'nin de benzer arabirime sahip olduğunu umuyorum.

/** 
* Stores value in the TernarySearchTree. The value may be retrieved using key. 
* @param key A string that indexes the object to be stored. 
* @param value The object to be stored in the tree. 
*/  
public void put(String key, E value) { 
    getOrCreateNode(key).data = value; 
} 

/** 
* Retrieve the object indexed by key. 
* @param key A String index. 
* @return Object The object retrieved from the TernarySearchTree. 
*/ 
public E get(String key) { 
    TSTNode<E> node = getNode(key); 
    if(node==null) return null; 
    return node.data; 
} 

Kullanım örneği aşağıdaki gibidir. TSTSearchEngine, temel omurgası olarak TernarySearchTree kullanıyor.

Example usage of Ternary Search Tree

// There is stock named microsoft and MICROChip inside stocks ArrayList. 
TSTSearchEngine<Stock> engine = TSTSearchEngine<Stock>(stocks); 
// I wish it would return microsoft and MICROCHIP. Currently, it just return microsoft. 
List<Stock> results = engine.searchAll("micro"); 

cevap

3

Geçerli Üçlü Arama Ağacı'nı büyük/küçük harfe duyarlı olmayan aramaları desteklemeyi zorlaştıran temel etkenlerden biri, temel veri yapmamın birebir eşleştirmesidir. Aşağıdaki test kodu bakmak edin: benim şimdiki kısa vadeli bir çözüm Ben bütün TernarySearchTree tamamlamayı TSTSearchEngine kullanıyorum, yani

public void testPut() { 
    System.out.println("put"); 
    Name name0 = new Name("abc"); 
    Name name1 = new Name("abc"); 
    TernarySearchTree<Name> instance = new TernarySearchTree<Name>(); 
    instance.put(name0.toString(), name0); 
    instance.put(name1.toString(), name1); 
    assertEquals(2, instance.matchPrefix("a").size()); // fail here. Result is 1 
} 

Ne. TSTSearchEngine, eşlemek için UPPER-CASE anahtarını sağlayan bir TernarySearchTree olan

(1) TernarySearchTree'den oluşur.

(2) Dize ArrayList bir harita.

TSTSearchEngine<Name> engine = TSTSearchEngine<Name>(); 
engine.put(name0); // name0 is new Name("Abc"); 
engine.put(name1); // name0 is new Name("aBc"); 

(1) name0.toString() ÜST-HALİNDE ("ABC") dönüştürülür:

İşte gerçekleştirdiğinde ne budur. TernarySearchTree'ye eklenir. "ABC", TernarySearchTree için hem anahtar hem de değer olacaktır.

(2) "ABC", bir liste listesine name0 eklemek için anahtar kelime olarak kullanılacaktır.

(3) name1.toString(), UPPER-CASE ("ABC") dönüştürülecektir. TernarySearchTree'ye eklenir. S1, TernarySearchTree için hem anahtar hem de değer olacaktır.

(4) "ABC", bir liste listesine name1 eklemek için anahtarın anahtarı olarak kullanacaktır.

I (1) TernarySearchTree "ABC" dönecektir

engine.searchAll("a"); 

çalıştığınızda.

(2) "ABC", haritaya erişim anahtarı olarak kullanılacaktır. Harita, name0 ve name1 içeren bir dizi listesi döndürecektir.

Bu çözüm çalışır. Örnek kod, Sample Code for New TSTSearchEngine

olarak adlandırılabilir. Ancak, bu, iki arama geçişi gerektirdiğinden etkili bir çözüm olmayabilir. C++ C++ Implementation of Case Insensitive Ternary Search Tree'da bir uygulama olduğunu öğreniyorum. Bu nedenle, C++ kodunun Java'ya taşınabileceği bir fırsat var.

1

Daha önce TST kullanmadıysanız, ancak bu depolama sırasında ve arama sırasında her iki alt veya anahtarlarınızı uppercasing kadar basit değil mi? Kod snippet'inizden işe yarayacak gibi görünüyor.

+0

Hayır. Bu şekilde yapılamaz. Orijinal veri kümesinin ABC ve aBc olduğunu düşünün. Eğer onu "ALL" ı büyük harfe dönüştürerek saklarsanız, sadece ABC'yi alma şansınız olacaktır. aBc uzayda kaybedecek. Benim dileğim, abc veririm, bana ABC ve aBc –

+0

döndürür Ama ABC ve aBc değeri değil anahtar değil mi? – tddmonkey

+0

Evet. ABC ve aBc değerleridir. TernarySearchTree'nin nasıl kullanıldığıyla ilgili TSTSearchEngine. –