Bir grafikteki yolların kompakt gösterimi


9

Bir grafikteki basit yolların bir alt kümesine sahibim. Yolların uzunluğud.

Seçili yollardan başka hiçbir yol temsil edilmeyecek şekilde yolları temsil edebileceğim en kompakt yol nedir (bellek açısından)?

Bu temsili yolların bu alt kümesini tekrar tekrar yineleyecek bir algoritmada kullanmak ve oldukça hızlı olmak istiyorum, örneğin, herhangi bir standart sıkıştırma algoritmaları kullanamazsınız unutmayın.

Aklıma gelen bir temsil onları bir ağaç kümesi olarak temsil etmekti. Ben en uygun sayıda ağaç aşağı almak NP-zor olsa da tahmin ediyorum? Başka hangi temsiller iyi olurdu?


2
"Bu alt kümeden yineleme" yaparken, her bir yol hakkında hangi bilgilere ihtiyacınız var? Uzunluk? Ziyaret edilen düğümler? Diğer yollarla kesişimler? ... Orada olabilir2dBu nedenle, tüm yolları saklamanız gerekiyorsa "gerçekten hızlı değil" için hazırlıklı olmalısınız.
Raphael

Size sadece bilinmeyen bir işlemle yolların verilip verilmediğini bilmiyorum, ancak ilgi alanlarını hesaplarken belki de defter tutma yapabilirsiniz. Hızlı fikir: hadiG,ana grafik olun ve her kenarın ağırlığını sıfıra ayarlayın. İlgilenilen bir yol bulduğunuzdaP, her kenarın ağırlığını G, içinde P. Sonunda, kenar ağırlığı o kenarın kaç yolda göründüğünü söyler. Belki de şu anda minimum yayılan ağacı hesaplayabilirsinizG,ve tüm kenarları sıfır ağırlıkla veya bunun gibi bir şeyle düşürün.
Juho

Kenardan ayrık iki basit yolun birleşimi bile bir döngü oluşturabilir, bu nedenle MST'yi hesaplamak sanırım yollardan birini kaybetmenizi sağlayacaktır. Ancak yukarıdakiler size bazı fikirler verebilir.
Juho

2
Eppstein'ın makalesini kontrol etmek isteyebilirsiniz ken kısa yollar ve ilgili literatür. Kompakt sunumlarla da ilgileniyorlar.
Juho

yolları temsil etmek için FSM'leri kullanma olasılığı vardır ve daha sonra sendikalar, kavşaklar, çıkarma, vb. havent bunun bir gazetede yapıldığını gördü ancak başka bir benzer problem üzerinde önerdi ...
vzn

Yanıtlar:


4

Bir Trie hile yapabilir: http://en.wikipedia.org/wiki/Trie

Grafiğinizin her kenarını bir harfle etiketleyin. Ardından, grafiğinizdeki yolları trie'ye gösteren dizeleri ekleyin. "Seçili yollardan başka hiçbir yolun temsil edilmemesi" gerekliliğini yerine getirmek için, trie'nin tüm köşelerini boş bırakıp kenarları etiketleyebilirsiniz, ancak kökten köşeye giden kenarların yollarınızdan birini temsil etmesi dışında, tepe noktasını bir şeyle etiketleyin. Bir bool, bazı siparişlerin altındaki yolun sayısı, vb.

Üçgeninizi oluşturduktan sonra, onu en uygun (veya en uygun) gösterime sıkıştırmak için algoritmalar vardır. (bağlantılı Wikipedia makalesine bakın.)


İlginç. Bir trie, gerçekten umursamadığım çok daha büyük bir özellik seti ile birlikte geliyor (hızlı arama, bir anahtarla ilişkilendirme, vb.) Bu yüzden daha iyi bir şeyin mümkün olup olmadığını merak ediyorum ...
Opt

2

Belki de özlü veri yapılarına bir göz atmalısınız . Bunlar, bilgi teorik alt sınırına yakın bir yerde bilgi depolamaya çalışan ve yine de üzerlerinde işlemler gerçekleştirme yeteneğini koruyan veri yapılarıdır.

Ağaçlar, sözlükler, vb. İçin böyle yapılar var. Tam olarak ne istediğinizi yapacak bir şey hatırlamıyorum ama belki de bunların bir kombinasyonu veya modifikasyonu size yardımcı olacaktır.


1

Karmaşıklığınıza ve algoritmanız için gereken ön / son işlemeye bağlı olarak, belki de en basit seçenek yoldur. Onları önemsiz bir şekilde diziler olarak temsil edebilir ve bir HDF5'te sıkıştırılmış olarak kaydedebilirsiniz. Bu kütüphane bazı hızlı sıkıştırma algoritmaları ile donatılmıştır, böylece sıkıştırılmış verilerin okunması ve yazılması sıkıştırılmamış olanlardan bile daha hızlı olabilir.

İşte bazı çizimler:

15 GB EArray ve farklı parçalar için öğe başına sıralı erişim süresi: http://pytables.github.io/_images/seq-chunksize-15GB.png

PyTable'larda Blosc kullanarak dekompresyon hızı: resim açıklamasını buraya girin

Ve eğer uzunca sınırlanmışlarsa, onları bir masada saklayabilir ve muhtemelen biraz daha fazla alan kazanabilirsiniz. Ve onları bellekten alırken, algoritmanızı uygulamak için zaten çok uygun bir formda olursunuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.