Stevey Yeggeの Get That Job At Google の記事を読んだ後、私はこの小さな引用が興味深いことに気づきました:
誰かがあなたに問題を与えたときはいつでも、グラフを考えてください。これらはあらゆる種類の関係を表す最も基本的で柔軟な方法であるため、興味深い設計問題にグラフが含まれるのは約50〜50ショットです。他のソリューションタイプに進む前に、グラフを使用してそれを解決する方法を考えられないことを完全に確認してください。このヒントは重要です!
グラフのデータ構造/アルゴリズムによって最もよく表現および/または解決される問題の例は何ですか?
私が考えることができる1つの例:現在の場所から別の場所への道順を提供するナビゲーションユニット(ala Garmin、TomTom)は、グラフと高度なパスアルゴリズムを利用します。
他には何がありますか?
コンピュータネットワーク:グラフは、コンピュータネットワークとインターネットを直感的にモデル化します。多くの場合、ノードはエンドシステムまたはルーターを表し、エッジはこれらのシステム間の接続を表します。
データ構造:データをリンクするためのポインタを使用するデータ構造は、何らかのグラフを使用しています。これには、常に使用されるツリー構造とリンクリストが含まれます。
パスとマップ:ある場所から目的地までの最短または最長のパスを見つけようとすると、グラフが利用されます。これには、Googleマップなどのアプリケーションで表示されるようなパス、ビデオゲームでAIキャラクターが使用するパスの計算、その他多くの同様の問題が含まれます。
Constraint Satisfaction: AIの一般的な問題は、制約のリストを満たすいくつかの目標を見つけることです。たとえば、大学がコーススケジュールを設定するには、特定のコースが競合しないこと、教授が2つのコースを同時に教えていないこと、特定のタイムスロット中に講義が行われることなどを確認する必要があります。 。このような制約充足問題は、多くの場合、グラフを使用してモデル化および解決されます。
Molecules:グラフは、原子や分子をモデル化して、それらの間の相互作用や構造を研究するために使用できます。
私はグラフ理論に非常に興味があり、それを使用して非常に多くの異なる種類の問題を解決しました。グラフを使用して、パスに関連する多くの問題、マッチングの問題、構造の問題を解決できます。
パスの問題たくさんのアプリケーションがあります。
これは、キャリアカップのインタビューの質問でした。サブ配列の最長の合計を求めたいとしましょう。例えば、 [1, 2, 3, -1]
は、6の合計が最も長くなります。これをDirected Acyclic Graph([〜#〜] dag [〜#〜])、ダミーのソース、ダミーの宛先を追加します。各ノードを、番号に対応する重みを持つエッジに接続します。この問題を解決するには、DAGでLongest Pathアルゴリズムを使用します。
同様に、金融業界での裁定取引の問題や、最長の重なり合う構造を見つけるジオメトリの問題も、同様のパスの問題です。
明らかなものはネットワークの問題です(ネットワークにコンピューターの人、組織図などが含まれている可能性があります)。
多くの構造情報を収集できます
グラフを使用して、多くのプロジェクト管理関連の問題を解決しました。 イベントのシーケンスは有向グラフとして描くことができます(サイクルがない場合は、それよりも優れています)。だから、今することができます
マッチング問題の多くはグラフで解決できます。たとえば、プロセッサを作業負荷に一致させるか、ワーカーをジョブに一致させる必要がある場合などです。私の最終試験では、人々をレストランのテーブルにマッチさせなければなりませんでした。同じ原則に従います(2部マッチング->ネットワークフローアルゴリズム)。そのシンプルでありながら強力です。
特別なグラフであるtreeは、コンピューターサイエンスの世界で数多くの用途があります。たとえば、プログラミング言語の構文、またはデータベースのインデックス構造です。
最近、私はcompiler最適化問題でもグラフを使用しました。私はモルガンの本を使っています。それは私に魅力的な技術を教えています。
リストは本当にどんどん続いています。グラフはrelationの美しい数学の抽象化です。あなたはそれを正しくモデル化することができれば、本当に不思議をすることができます。そして、グラフ理論は非常に多くのアプリケーションを見つけたので、この分野には多くの活発な研究があります。そして、数多くの研究により、研究を後押ししているさらに多くのアプリケーションが見られます。
グラフ理論を使い始めたい場合は、初心者向けの優れた離散数学の本(Rosenが頭に浮かびます)を入手してください。Fouldまたは-のような著者から本を購入できます。 偶数。 [〜#〜] clrs [〜#〜]にも優れたグラフアルゴリズムがあります。
ソースコードはツリー構造であり、ツリーは一種のグラフです。 AST(Abstract Syntax Tree))について人々が話すのを聞くときはいつでも、彼らは一種のグラフについて話しています。
ポインタはグラフ構造を形成します。ポインタをたどることで、なんらかのグラフ操作が行われます。
ウェブは巨大な有向グラフです。 Googleの主要な洞察は、検索で彼らを支配するようになったのですが、ウェブのグラフ構造は、ページのテキストコンテンツと同等またはそれ以上に重要であるということです。
ステートマシンはグラフです。ステートマシンは、ネットワークプロトコル、正規表現、ゲーム、およびその他のあらゆる種類のフィールドで使用されます。
ある種のグラフ構造に関係しないことを考えるのはかなり難しいです。
ほとんどの人がよく知っている例:ビルドシステム。 Makeが典型的な例ですが、ほとんどすべての優れたビルドシステムは、有向非巡回グラフに依存しています。基本的な考え方は、方向がソースとターゲット間の依存関係をモデル化するということです。物事を正しく構築するには、グラフを特定の順序で「ウォーク」する必要があります->これはトポロジカルソートの例です。
別の例はソースコントロールシステムです。これもDAGに基づいています。たとえば、共通の親を見つけるためにマージするために使用されます。
まあ、コンパイラが使用する多くのプログラム最適化アルゴリズムはグラフに基づいています(たとえば、コールグラフ、フロー制御、多くの静的分析を理解します)。
多くの最適化問題はグラフに基づいています。多くの問題はグラフの色付けや同様の問題に還元できるため、他の多くの問題もグラフに基づいています。
グラフがすべての関係を表現するための最良の方法であることに私が同意するかどうかはわかりません。私は確かにこれらの「くぎを手に入れ、ハンマーを見つけましょう」というアプローチを避けようとします。グラフのメモリ表現は不十分であることが多く、行列やビットセットなどを使用して実装した場合、多くのアルゴリズムは実際には(実際には)より効率的です。
OCR。斜めにスキャンされたテキストのページを、画像にノイズがあり、テキストの行の間のスペースを見つける必要がある場所で描きます。 1つの方法は、ピクセルのグラフを作成し、ページの片側から反対側までの最短経路を見つけることです。ここで、明るさの違いはピクセル間の距離です。
この例は Algorithm Design Manual からのもので、グラフの問題に関する他の多くの実例があります。
2つの分子が一致するかどうかを調べる。薬物を開発するとき、薬物分子が体内のより大きな分子に適合できるかどうかを確認することにしばしば関心があります。これが可能かどうかを判断する際の問題は、分子が静的ではないことです。分子のさまざまな部分が化学結合の周りを回転することができるため、分子は非常に多くのさまざまな形に変化することができます。
各形状は、形状で構成される空間内のポイントを表すと言えます。この問題を解決するには、この空間を通る経路を見つける必要があります。そのためには、空間を通るロードマップを作成します。これは、基本的には有効な形状で構成され、形状がどの形状になるかを示すグラフです。このロードマップでA *グラフ検索アルゴリズムを使用すると、解決策を見つけることができます。
わかりませんでしたが、あまり理解できなかったか、明確ではなかったかもしれません。しかし、私の問題は、あらゆる種類の問題でグラフがポップアップするということです。
人気のある例の1つはガベージコレクションです。
コレクターは一連の参照で開始し、参照するすべてのオブジェクトをトラバースし、次に参照されるすべてのオブジェクトをトラバースします。見つかったものはすべて、到達可能なオブジェクトのグラフに追加されます。他のすべてのオブジェクトは到達不能であり、収集されます。
以下はグラフ理論に基づいています:
グラフは依存関係の管理に最適です。
最近、Castle Windsor Containerを使い始めました。カーネルを調べた後、GraphNodesプロパティを見つけました。 Castle Windsorはグラフを使用して、オブジェクト間のdependenciesを表すため、インジェクションが正しく機能します。これをチェックしてください 記事 。
また、単純なグラフ理論を使用してプラグインフレームワークを開発しました。各グラフノードはプラグインを表しており、依存関係が定義されると、グラフをトラバースしてプラグインのロード順序を作成できます。
各プラグインが特定のバージョンで重み付けされるようにダイクストラのアルゴリズムを実装するようにアルゴリズムを変更することを計画しています。したがって、単純な変更ではプラグインの最新バージョンのみがロードされます。
私はこれをもっと早く発見しました。 「誰かがあなたに問題を与えたときはいつでも、グラフを考えてください。」確かにそうだと思います。
私たちが通常のアプリケーションで使用するドメインモデルのほとんどは、いくつかの点でグラフです。すでにUMLダイアグラムを見ると、有向のラベル付きグラフを使用すると、それらを永続モデルに直接簡単に変換できることがわかります。 Neo4j にその例がいくつかあります
乾杯
/ peter
グラフはデータ構造ではありません。それらは関係の数学的表現です。はい、グラフを使用して問題について考え、理論化することができ、それについての理論の大部分があります。ただし、アルゴリズムを実装する必要がある場合は、グラフではなく、問題を最もよく表すデータ構造を選択します。一般的なグラフを表す多くのデータ構造があり、特別な種類のグラフについてはさらに多くのデータ構造があります。
あなたの質問では、あなたはこれら二つのことを混ぜ合わせます。同じ理論上の解決策はグラフの観点からありますが、実際の解決策は異なるデータ構造を使用してグラフを表す場合があります。
プロファイリングおよび/またはベンチマークアルゴリズムとコードでの実装。
あなたはNeo4j wikiのいくつかの例を見ることができます、
neo4jが使用されているプロジェクト(既知のプロジェクト)
それ以外の場合、推奨アルゴリズムはグラフの使用に適しています。たとえば、PageRankなどの情報を参照してください。
人々の間の社会的つながりは、興味深いグラフの例になります。従来のRDMSを使用して、データベースレベルでこれらの接続をモデル化しようとしましたが、非常に難しいことがわかりました。最終的にグラフデータベースを選択しましたが、人(ノード)間の接続(エッジ)を簡単にたどることができるので、それは素晴らしい選択でした。
リレーショナルデータベースのforeignキーとしてモデル化できるものはすべて、本質的にグラフではEdgeおよびnodesです。 。
ほとんどのものがRDBMSで容易にモデル化されるので、おそらくそれは例を考えるのに役立ちます。
トランザクションの分析 直列化可能性 データベース理論。
グラフは、問題のあるドメインオブジェクトをノードに定義できる場所ならどこでも利用でき、ノード間の制御やデータのフローとしてソリューションを利用できます。
ツリーは実際に非循環グラフに接続されているという事実を考慮すると、グラフ理論を使用できる領域はさらに多くあります。
基本的に、ツリー、リスト、キューなどのほぼすべての一般的なデータ構造は、グラフのタイプと考えることができます。制約のタイプが異なるものもあります。
私の経験では、グラフをネットワークフローの問題で集中的に使用しています。これはテレコミュニケーションネットワークルーティングや最適化、ワークロードの割り当てなどの多くの領域で使用されています=、マッチング、サプライチェーンの最適化および公共交通計画。
もう1つの興味深い領域は、以前の回答で述べたソーシャルネットワークモデリングです。
集積回路の最適化などのように、はるかに多くあります。