タグ付けされた質問 「graph-traversal」

3
ワームホールノードで最短パスを見つける方法
これは、コードでやりたいことの例です。ジャンプポイント検索を使用して、緑のノードから赤のノードに問題なく、またはA *でも簡単に取得できることを知っています。しかし、これをワープでどのように計算しますか。 画像では、青のパスを取るときに緑のノードから赤のノードに到達するのに8回の移動しか必要ないことがわかります。青いパスは、紫色のノードから次のノードにすぐに移動します。中央に2移動するスペースは、移動する必要がある2つのワープゾーンの間のポイントです。 黄色のパスまで半分(大まかに)移動するだけでよいので、青いパスを取る方が明らかに高速ですが、プログラムでこれを行うにはどうすればよいですか? この問題を解決するために、使用可能なグラフの周りに複数の紫色の「ワープ」があり、各紫色のポイントがワープする場所とグラフ上のどこにあるかを正確に把握します。 紫色のワープには双方向のものとそうでないものがあります。つまり、片側からしかワープに入ることができず、ワープ後に戻ることができない場合があります。 私は解決策について考えましたが、各ワープポイントまでの距離(一方向のポイントを差し引いたもの)、それらのポイント間の差、およびそれらに近いポイントをチェックすることで問題を計算できると結論付けました。 プログラムは、最初のジャンプから歩くのではなく、2番目のワープを取る方がより有益であることを何らかの方法で把握する必要があります。したがって、6つのスポットを移動してからワープし、残りの8ステップを徒歩で移動する代わりに(ワープをまったく使用しない場合よりも高速です)、6つの動きを取り、2つの動きを2番目のワープに移動します。 編集:青のパスは実際には8回ではなく12回の動きをすることに気付きましたが、問題は同じままです。

3
二分木の事前および事後順序走査の有用性
これは非常に単純かもしれませんが、すべてのトラバーサルタイプのバイナリツリー(プレーン、ソート、バランス)のコンテキストだと思いました。 深さ優先予約 深さ優先順 深さ優先順 幅優先 事前注文と事後注文の実際の有用性は何ですか?つまり、事前順序および/または事後順序のトラバーサルが他の2つよりも(いくつかの)利点をもたらすバイナリツリーのタイプおよび/または構成がありますか? AFAICS、特定のタイプとバイナリツリーの構成があります。これらに対して、順序と幅優先が特定の利点をもたらす可能性があります。 バランスの取れたバイナリツリーの場合、深さ優先のトラバースは幅優先と比較して使用するメモリストレージスペースが少なくなります(たとえば、6または7ノードのバランスの取れたバイナリツリーでは、高さが2であるため、深さ優先のトラバーサルは最大で任意の時点で2つのノード、最後のレベルには3つまたは4つのノードがあるため、幅優先スキャンでは、ある時点で最大3つまたは4つのノードを格納する必要があります。この場合、インオーダートラバーサルを使用すると、メモリの使用量が最小になり、ノードを自然な順序で訪問します。 バランスの取れていない二分木の場合、最悪の挿入シナリオに近い場合、幅優先で走査すると、深さ優先の走査に比べて使用するメモリが少なくなります。したがって、この場合、幅優先の方が有利です。順序通りのトラバーサルには、値を自然な順序で訪問するという利点があります。 ただし、トラバース前後が他の2つよりも有利になる状況は考えられません。

1
柔軟なDIFF実装のための発見的アプローチ
作業中のドキュメントリビジョンを比較するために、DIFF実装を作成しました。O(ND)差分アルゴリズムとそのバリエーションに基づいています。 重要になった1つのことは、変更のリストを取得し、それらを人間が読めるテキストに変換することです。現在のアルゴリズムは非常に効率的ですが、拡張するのが難しいほど非常に効率的です。 短い質問 私はA *と「ターン」にペナルティを追加するヒューリスティックを使用しようと考えていました。アイデアはしている滑らか人間が読むことができる何かに解析することが容易であるように「削除、追加、追加、削除、追加、削除」不要に。基本的に、私の最短経路問題を最も単純な経路問題に変えてください。 そしてもちろん、常に出力作成「削除しないすべてのものを、追加のすべてを」 これは理にかなっていますか? DIFF実装でヒューリスティックを使用するための優先順位はありますか?ヒューリスティックとは何ですか? 問題: 長い文が削除され、別の長い文が削除されたが、少なくとも1つの単語を共有している場合、「with」と言います。一般的な単語を単独で(追加と削除の両方ではなく)残すと、最短パスが作成されます。ただし、これは実際に、変更から印刷物を読み取ろうとする人間に対する変更のコンテキストを難読化するだけです。 現在のDIFFの例: 古いテキスト: クリーン:ショップエアでパワーウォッシュとブロードライ。 新しいテキスト: クリーニング:アセトンと糸くずの出ない布で拭きます。 メモリストの変更: 「Powerwash and blow dry」を「アセトンで拭く」に変更します 「ショップエア」を「アセトンと糸くずの出ない布」に変更します 注:「「ショップエア」の削除、「アセトン」の追加」の代わりに「変更」が使用されます。 ご覧のとおり、2番目のノートはすべてのコンテキストを失い、テキストの完全な古いテキストセットと新しいテキストセットを見ることなく、その意味を理解できません。 句読点に関する注意: 句読点を別の「単語」として区切り、次のようにします 追加 "(" の代わりに 「修復」を「(修復)」に変更します これは不快だったからです。ただし、これは、両方のテキストにコンマさえある場合(前の例の "with"という単語とは対照的に)、同じことが起こることを意味します。 可能な解決策: 代わりに、異なるパス検索アルゴリズムを使用して、人にとってより意味のある異なる変更「パス」に重みを追加する柔軟性を与えることができると思います。たぶん、句読点を含むノードへの移動にほとんど重みを付けないようにすることもできます(これが他のものにどのように影響するかはわかりません)。 次に、前の例を取得して以下をリストできます。 メモリストの変更: 「パワーウォッシュとショップエアでブロードライ」を「アセトンと糸くずの出ない布で拭いてください」に変更します。 見る!より明確に! パフォーマンスに打撃を与えることはわかっているので、プログラムの大幅なオーバーホールを行う必要があるかもしれませんが、最終結果を得ることがより重要です。 ボトムライン: 繰り返しますが、DIFF実装でヒューリスティックを使用するための優先順位はありますか? 他の考え?合理的な時間投資ですか?他のアイデア?他のアルゴリズム? 前もって感謝します! 編集: A *を使用するのではなく、質問を明確化/固化し、質問をアルゴリズムにヒューリスティックを追加するように一般化しようとしました。この例では基本的に同じことですが、今でもより正確だと思います。 この投稿は洞察に富んでいました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.