ナンバーホッパー迷路を解く


18

私の8歳の子供は、従来の迷路を作成するのに飽きてしまい、次のようなバリエーションを作成することに取りかかりました。

番号ホッパーサンプル

アイデアは、xから始まり、通常のルールを介してoに到達することです。また、あなたは整数いずれかから「ホップ」することができます任意の他の整数にが、あなたが支払わなければならない特権のためのドル。目標は、最小のコストで迷路を解決することです。上記の例では、コスト5でx-14-18-27-28-oを介してxからoに行くことができますが、x-13-11-9-8-29-28-oに行く方が安くなります4。ab|ab|

だからここに私の質問です:これを解決するために考えることができる(漸近的な実行時間の観点から)最良の解決策は何ですか?入力形式について合理的な仮定を行うことができます。

注:回答を念頭に置いているため、ここで「パズル」タグを使用していますが、それが最適であるかどうかはわかりません。(ここで、は迷路内の整数の数です。)O(n2)n


7
そのような創造的で数学的なパズルを作成するためにあなたの子供に小道具を!
-bbejot

2
@bbejot彼が私に尋ねたもののいくつかを見るはずです...時々私は彼の質問に答えることができません。たとえば、math.stackexchange.com / questions
33094

1
コスト計算が正しいかどうかはわかりません。x-14-18-27-28-oは、x-13-11-9-8-29-28-oは2 + 2 + 1 + 21 + 1 = 27です。4+9+1=142+2+1+21+1=27
デイブクラーク

1
@Daveは、すべての遷移がジャンプではありません。ジャンプ(コストは)の場合は「ab」、グラフをaからb(コストが0の場合)を歩く場合は「a-> b」と書くことができます。それらは迷路の壁を壊さずに到達可能です。この表記では、x-> 14-18-> 27-28-> oとコスト5、x-> 13-11-> 9-8-> 29-28-> oがあります。Fixeeは冗長であるため、この表記法を導入しませんでした。2回ホップする理由がないため、迷路でのホップとウォークが交互に行われます。|ab|0
アルテムKaznatcheev

2
これは素晴らしい宿題の問題です!
ジェフ

回答:


15

ダイクストラのアルゴリズムのバリエーションを使用して、時間でこれを解決できます。新しいノードにアクセスしたときに、すべての距離の更新を実行しなくても問題ありません。我々はノード訪れる場合はYを、我々はからすべての歩きやすいの距離更新するだけで済み、Yを 0にし、2つのノードまでの距離を更新するために、Y -Y +に最も近い値とyの少ないより大きいyのではない持っていますまだ選ばれています。O(nlogn)yyyy+yy

ジャンプする最も近いノードは、既に訪問したノードのすぐ上またはすぐ下にある必要があるため、これらの更新はヒープが最小要素を返すのに十分です。

各ノードは最大で1回0に更新され(2次動作を回避するためにキューからすべてのゼロ距離ノードをポップアウトした場合)、ノードを追加するたびに、O(1)の他の更新のみを行います。整数値でソートされたすべてのノードの順序付けられた二重リンクリストも保持する場合、値およびy +の検索は線形時間で実行できます。この二重リンクリストの作成にはO n log n 時間かかり、最後にO n )の更新とヒープからのポップにはO n log n 時間かかり、O yy+O(nlogn)O(n)O(nlogn)O(nlogn)


これはおそらく、整数に特化されているソートと優先順位キューを使用して少し改善することができますが、以下の減少によって見ることができるようにあなたは、並べ替え、整数よりも良い行うことができない:私たちは、整数値のリストがある場合xをこれらの最小値の2倍、oを最大値の2倍に設定します。値を持つ領域を作成する2 XをI2 X I + 1、互いにX I。最適なソリューションは、x iでソートされた順序で各領域を通過するため、x1,,xnxo2xi2xi+1xixi値。xi
デイブ

Daveは正しい。y +y −を更新するだけで、これを減らすことができる。また、リージョン内のすべてのノードをリージョン内の他のすべてのノードに接続する代わりに、リージョン内の1つまたは2つの他のノードに接続するだけで済みます(パスを作成します)。したがって、各ノードには最大4つのエッジしかありません。次に、Dijkstraのアルゴリズム(最小優先度キューを使用)を適用して、O n l g n 時間を許可します。O(nlgn)y+yO(nlgn)
-bbejot

@bbejot:しかし、もしそうなら、Thorupの不可欠な優先度キューは、無向の状況で追加のバケット技術を使用してまたはO n までの実行時間を改善しませんか?O(nloglogn)O(n)
Hsien-Chih Chang張顯之

4

私はがあなたが得ることができる最高のものであるように感じます。O(n2)

特別な開始ノード(x)と終了ノード(0)を使用して、これを最短パス問題に変換するのは自然なことです。また、各番号ごとに1つのノードがあります。xと0の両方には、迷路内で到達可能なすべての番号ノードに対する重み0のエッジがあります。すべての数値ノードは、重み0(数値が迷路に到達可能な場合)または数値間の差(迷路に到達できない場合)のいずれかで接続されます。

このグラフの最短経路は未満では解決できません。これは、グラフのエッジがおよそn 2であり、最悪の場合、すべてのケースを一度表示する必要があるためです。そのため、最短パスのダイクストラアルゴリズムはO n 2時間かかり、最悪の場合に最適です。O(n2)n2O(n2)


これは私が念頭に置いていた答えです。もちろん、ダイクストラのアルゴリズムで適切なデータ構造を使用して、実行時間を取得する必要があります。典型的なバイナリヒープを使用すると、O n 2 lg n )が生成されます。O(n2)O(n2lgn)
フィクシー

1
今朝、この問題について考えていましたが、少しスピードアップできます。迷路の各番号に1つのノードを使用する代わりに、迷路の各領域に1つのノードを使用します。その場合、ノード間のコストは、ある領域から次の領域にジャンプする際の最小コストです。開始ノードはxの領域であり、終了ノードは0の領域です領域がある場合、これはこれまで議論してきた方法によってO r 2時間で解くことができます。rO(r2)
bbejot

グラフを作成するには時間も必要なので、合計実行時間はO r 2 + n log n )になります。領域が2つしかない場合でも、2つの数値セットの間で最も近いペアを見つける必要があり、代数計算ツリーモデルにはその問題のΩ n log n )の下限があります。(ビットトリックは、おそらくログファクターを削減または削除する可能性があります。)O(nlogn)O(r2+nlogn)Ω(nlogn)
ジェフ

下縁は、入力の一部ではないため、適用されないエッジの数に基づいて、結合した-それらが暗示しています。関連するものを計算できるので、それらすべてを見る必要はありません。Ω(n2)
デイブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.