2012-01-17 18 views
7

Bir komut aramak ve bir komut cümlesi oluşturmak için kullanılacak bir sözlüğü içe aktarması gereken Qt kullanarak bir sınıf yazıyorum. Komutlar hiyerarşik bir şekilde düzenlenir ve karşılık gelen bir onaltılık anahtar ve değer tanımına sahiptir. Gösterim amacıyla, bu gibi görünebilir:Qt Tree Modeli, çeviriler için bir sözlük saklamak için yuvalanmış haritalara karşı

 
01 : Volume 
     | - 01 : Step : 00=Down, 01=Up 
     | - 02 : Set : ceil(255/100 * x) 
02 : Power 
     | - 01 : Power : 00=Off, 01=On 
     | - 02 : Sleep : ...etc 

bu sözlüğü yüklemek ve ardından "Ses/Set/50" için arama yapabilmek ve dönüş komutu cümle "01 02 80" veya bakmak istiyorum "01 02 80" yukarı ve "Volume/Set/50" yi döndür.

Gerçek uygulama biraz daha karmaşıktır ve ağaç yapısında farklı düzeylerde komutlara sahiptir ve tek bir cümlede farklı düzeylerdeki komutların herhangi bir sayısını ve kombinasyonunu içerebilir.

Düzenleme:

aşağıda Volodymyr tarafından sağlanan açıklama bir kavramı ben aşina değildi (Trie) tanıtır. Bu senaryo için en iyi uygulama olabilir, ama biraz daha araştırmam gerekiyor. Orijinal soruma hala yanıtla ilgileniyorum (Trie eklenmesiyle):

Bu uygulama için bu yöntemlerin her birinin kullanılmasının avantajları ve dezavantajları nelerdir?

  • Qt Ağacı Modeli
  • İçiçe Haritalar
  • Trie

Orijinal soru:

(bağlam için) Benim bir Qt Ağacı Modeli, iç içe geçmiş haritalar veya diğer bazı sözlük saklamak için daha uygun olmalı? "Daha iyi" in öznel olabileceğinin farkındayım, ancak ticaret offs'larını bilmek isterim.

QTreeView'deki diğer verileri görüntülemek için bir Qt Ağacı Modeli oluşturuyorum, bu nedenle kod zaten var olacak ve kolayca kullanılabilir. Ağaç Modeli, farklı yapılara sahip sözlüklerin yüklenmesinde daha fazla esnekliğe izin verir mi? Bunu yapmanın daha iyi bir yolu var mı? ya da belki standart bir tasarım deseni?

+4

Doğal diller için sözlükler söz konusu olduğunda, trie veri yapısı kullanılabilir (http://en.wikipedia.org/wiki/Trie#Dictionary_representation). Belki sizin için yararlı olacaktır. –

+0

Denemeler araştırıldıktan sonra, bir kelime (kodlama) ile ilişkilendirilmiş hex anahtarlarını bulmak için yararlı olabilir, ancak bir hex cümlesini bir kelimeye (kod çözme) kolayca dönüştürebilme özelliği sağlamaz. Verilerin bir Qt Ağacı Modeli oluşturmak ve sonra kodlama için kodların konumunu dizine eklemek için bir Trie oluşturmak, sonra sadece kod çözme işlevini gerçekleştirmek için Qt Ağacı Modeli boyunca yinelemek uygun olur mu? – Chris

+0

Böyle bir yaklaşımın verimliliği hakkında bir şey söyleyemem, ancak tekrar kullanılabilen bir kodunuz olduğu gerçeği beni denemeniz gerektiğini düşünmemi sağlıyor. Her neyse, bahsettiğiniz gibi, Trie durumunda geriye dönüşe izin vermek için TreeModel gibi bazı yardımcı yapılara ihtiyacınız olacak. Ayrıca, hex'e çeviri sırasında verilen argümanlar üzerinde bazı eylemler gerçekleştirmeniz gerektiği gibi görünüyor (ceil (255/100 * x) gibi). Bunu hesaba katmalısınız, çünkü bu durumda sadece doğrudan çeviri değildir. Onaltılık ve dize gösterimi arasında doğrudan uygunluk olması durumunda iki yollu karma kullanılabilir. –

cevap

1

Kanaatimce, komut ağacındaki her bir seviyedeki öğe sayısı bir trie kullanarak gerekçelendirmek için çok küçük. Büyük dallanma faktörüne bağlı olarak bir çentik (bkz. http://en.wikipedia.org/wiki/Trie), çok sayıda öğe için en iyisidir - örneğin, volodymyr'nin işaret ettiği gibi doğal bir sözlük. Aslında, sayı std :: map 'i bile doğrulamak için çok küçük olabilir. Ağacın belirli bir noktasında birkaç düzine komut veya koddan daha fazlası yoksa, doğrusal bir arama muhtemelen bir haritadaki arama kadar hızlıdır veya daha hızlıdır. Bir vektör veya liste olarak hafıza gösterimi de daha kompakt olacaktır. Yani, std :: map'in arayüzü, yapmaya çalıştığınız şey için çok uygun görünüyor, bu yüzden, pratikte, muhtemelen genel olarak en iyi seçenek.

QTreeModel'in std :: map'den daha iyi olabileceğini göremiyorum (hız, bellek, kullanım kolaylığı). tabanlı. Bununla birlikte, eğer bu bölümün Qt'siz bir kullanımı olabileceğinden şüpheleniyorsanız bile, standart kütüphane materyallerini (std :: map) seçmekten çekinmem.QTreeModel'ı std :: map üzerinde seçmenin tek gerçek sebebi, QTreeView'da gerçekten kullanmış olmanızdır.

+0

bir başka ilgi alanı: Qt içinde bir atlama listesi olarak uygulanan bir QMap var, hem Qt ile entegre olmanın hem de az miktarda eşya ile iyi performans sunmanın avantajına sahip. İç içe QMaps kesinlikle çalışırdı. –

0

Qt TreeModels, TreeViews ile çalışacak şekilde optimize edilmiştir ve sıralama için iyidir. Rastgele erişimlerin iki yönlü eşleştirmesi için gerçekten uygun değildir.

İç içe geçmiş haritalar tek yönde çeviri yapmak için en uygun hale getirilecektir. Geriye ve ileriye doğru gitmek için, ileri ve geri çeviri için haritaları ayrı ayrı yansıtmanız gerekir.

Std :: maps ile oluşturun. Eğer gerekiyorsa onu profil ve optimize edin.

İlgili konular