Sayı-Hazne Labirenti Çözme


18

Benim 8 yıl eski geleneksel labirentine oluşturmaktan sıkıldı ve böyle görünen varyantlar yaratmaya aldı:

Hazne Sayısı

Fikir x'ten başlamak ve normal kurallarla o'ya ulaşmaktır. Ayrıca, herhangi tamsayısından başka bir tamsayı b'ye "atlayabilirsiniz" , ancak | a - b | ayrıcalık için dolar. Amaç labirenti en düşük maliyetle çözmek. Yukarıdaki örnekte, 5'ten x-14-18-27-28-o yoluyla x'ten o'ya gidebiliriz, ancak yalnızca x-13-11-9-8-29-28-o'ya gitmek daha ucuzdur 4.ab|ab|

İşte sorum şu: Bunu çözmek için aklınıza gelebilecek en iyi çözüm nedir (asimtotik çalışma süresi açısından)? Giriş formatı hakkında makul varsayımlar yapabilirsiniz.

Not: Burada "bulmacalar" etiketini kullanıyorum çünkü bir cevabım var, ancak bunun en uygun olduğundan ve başka birinin çözümümü geliştirip geliştiremeyeceğini görmek istemiyorum. (Burada n , labirentteki tam sayıların sayısıdır.)O(n2)n


7
Böyle yaratıcı ve matematiksel bulmacalar oluşturmak için çocuğunuza sahne!
bbejot

2
@bbejot Bana sorduğu bazı şeyleri görmelisin ... bazen sorularını cevaplayamıyorum. Örneğin, math.stackexchange.com/questions/33094/…
Fixee

1
Maliyet hesaplamalarınızın doğru olduğundan emin değilim. x-14-18-27-28-o'nun maliyeti ve x-13-11-9-8-29-28-o'nun maliyeti 2 + 2 + 1 + 21 + 1 = 27 olmalıdır . 4+9+1=142+2+1+21+1=27
Dave Clarke

1
@ Geçişlerin hepsi atlama değildir. Atlamalar için 'ab' ( maliyeti vardır ) ve grafikte a'dan b'ye ( 0 maliyeti olan ) yürümek için 'a-> b' yazabiliriz. labirentte bir duvarı kırmadan ulaşılabilir. Bu gösterimde x-> 14-18-> 27-28-> o ve 5 ve x-> 13-11-> 9-8-> 29-28-> o bir maliyetimiz var. Fixee'nin gereksiz olduğu için bu gösterimi sunmadığını düşünüyorum: iki kez atlamak için bir neden yoktur ve bu nedenle labirentte şerbetçiotu ve yürüyüşler değişecektir. |ab|0
Artem Kaznatcheev

2
Bu mükemmel bir ev ödevi problemidir!
Jeffε

Yanıtlar:


15

Dijkstra algoritmasının bir varyasyonunu kullanarak zamanında bunu çözebilirsiniz . Yeni bir düğümü ziyaret ettiğimizde tüm mesafe güncellemelerini yapmamaktan kurtulabiliriz. Biz bir düğüm ziyaret ederseniz y , biz gelen her şeyi yapılabilen mesafeler güncellemek elde etmesi yeterli y 0 ve iki düğümlerine mesafeleri güncellemek için y - ve y + en yakın değerlerle y daha az ve daha fazla y değil sahip olduğu henüz seçildi.O(nlogn)yyyy+yy

Bu güncellemeler yığının minimum öğeyi döndürmesini sağlamak için yeterlidir, çünkü atladığınız en yakın düğüm sayısal olarak önceden ziyaret edilmiş bir düğümün hemen üstünde veya hemen altında olmalıdır.

Her düğüm en fazla bir kez 0'a güncellenir (kuadratik davranışı önlemek için kuyruktaki tüm sıfır mesafe düğümlerini çıkarırsak) ve her düğüm eklediğimizde, yalnızca O (1) diğer güncellemeleri yaparız. ve y + değerlerini bulmak, tamsayı değerlerine göre sıralanmış, tüm düğümlerin sıralı, çift bağlantılı bir listesini tutarsak, doğrusal zamanda yapılabilir. Bu doubly bağlı listesi oluşturmak alır Ç ( n log n ) saat ve son olarak O ( n ) yığın almak ila güncellemeleri ve babalar O ( n log n ) olmak üzere toplam çalışma zamanı için, zaman O (yy+O(nlogn)O(n)O(nlogn)O(nlogn)


Bu, tamsayılar için özel sıralama ve öncelik sıraları kullanılarak biraz geliştirilebilir, ancak aşağıdaki azalma ile görülebileceği gibi tamsayı sıralamasından daha iyisini yapamazsınız: tamsayı değerleri listemiz varsa , , x n , x değerini bunların minimum değerinin iki katı ve o değerinin maksimum değerin iki katı olacak şekilde ayarlayın. Birbirine x i için 2 x i ve 2 x i + 1 değerlerini içeren bir bölge oluşturun . En iyi çözüm her bölgeden x i'ye göre sıralanmış bir sırayla geçer ve böylecex1,,xnxo2xi2xi+1xixi değerleri. xi
Dave

Dave haklı, bu sadece y + ve y - ' yi güncelleyerek değerine indirilebilir . Ayrıca, bir bölgedeki her düğümü bölgedeki diğer düğümlere bağlamak yerine, yalnızca bölgedeki diğer 1 veya 2 düğüme bağlanması gerekir (bir yol oluşturur). Böylece, her bir düğümün sadece 4 kenarı vardır. Daha sonra Dijkstra'nın algoritması (min öncelik sırası ile) O ( n l g n ) süresi vererek uygulanabilir . O(nlgn)y+yO(nlgn)
bbejot

@bbejot: Öyleyse, Thorup'un integral öncelik kuyruğu , yönlendirilmemiş durumda bazı ek kovalama tekniğiyle veya hatta O ( n ) için çalışma süresini geliştirmiyor mu? O(nloglogn)O(n)
Hsien-Chih Chang 張顯 之

4

edebileceğiniz en iyi şey gibi hissediyorum .O(n2)

Bunu özel bir başlangıç ​​düğümü (x) ve bitiş düğümü (0) ile en kısa yol problemine dönüştürmek doğal görünmektedir. Ayrıca sayıların her biri için bir düğüm daha olacaktır. Hem x hem de 0, labirentte erişilebilen tüm sayı düğümlerine 0 ağırlık kenarlarına sahiptir. Tüm sayı düğümleri ya 0 ağırlığıyla (sayılara labirentle erişilebiliyorsa) ya da sayılar arasındaki farkla (labirente erişilemezse) bağlanır.

Bu grafikteki kısa yol az olarak çözülemez grafik kabaca olduğundan , n 2 , en kötü durumda, tek bir kez, her durumda görüntülemek gerekir, kenarları ve. Bu nedenle, en kısa yol için Dijkstra'a algoritması O ( n 2 ) zaman alır ve en kötü durum optimumdur.Ö(n2)n2Ö(n2)


Aklımdaki cevap bu; elbette, çalışma süresini elde etmek için Dijkstra'nın algoritması ile uygun veri yapısını kullanmanız gerekir . Tipik ikili yığının kullanılması O ( n 2 lg n ) verir . Ö(n2)Ö(n2lgn)
Fixee

1
rÖ(r2)

Ö(ngünlükn)Ö(r2+ngünlükn)Ω(ngünlükn)

Ω(n2)
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.