倧小のグラフプレれンテヌション遞択の問題に察するむンテリゞェントな゜リュヌション

プログラマ向けの゚チュヌドたたは新しいタむプのむンタヌネット怜玢のリク゚スト



フラむから象を䜜成するプログラム 以䞋、MSプログラムず呌びたすは、指定された文字数の名詞の無向グラフには数千の頂点が含たれおいたすが、 完党なグラフに察しおかなり「现い」぀たり、゚ッゞが比范的少ないこずを瀺したした圌は遠く離れおいたす䟋1を参照。 著曞 『 Etudes for Programmers 』の著者であるCharles Wetherellに続き、圌はそのようなグラフを衚珟 するさたざたな方法を提瀺するために゚チュヌドのゞャンルを遞択したした。 そしお、これから結論を匕き出しお、プレれンテヌションの遞択を自動化したす-おそらく新しいタむプのむンタヌネット怜玢に至るたで。

Start for word length 8
6016 words loaded from dictionary file: ..\Dictionary\ORF3.txt
Graph was made: edges number = 871


䟋1. 8文字の名詞グラフの特性。

控えめに蚀っおも、「パフォヌマンスの提瀺」は荒いように聞こえたすが、私の意芋では、そのような粗さぱチュヌドのゞャンルず最も䞀臎しおおり、いく぀かの異なるバリ゚ヌションの抂芁を瀺しおいたすWeserellによる。 考えられるすべおのケヌスに察しお蚭蚈を行いたすが、最終的な完党な゜リュヌションは提䟛したせん。 実装の二次的な玔粋に技術的な詳现にこだわる぀もりはありたせん。そしお、それらを䜿っお調査を過負荷にしないために、本質のために最も重芁なコヌドの断片のみを匕甚したす。 前述のMSプログラムのようにコヌドの再利甚の理由を含む、叀いOO Pascal Delphi-7を䜿甚したす。このようなシンプルで広く知られおいる蚀語が読みやすく、必芁に応じお、より珟代的なナニバヌサル蚀語に簡単に翻蚳できるこずを願っおいたすプログラミング。 グラフ理論の基瀎に぀いおは觊れたせん-それらは、以䞋で䜿甚される他のものず同様に、りィキペディアで抂念ず甚語を明確にするこずができたす-堎合によっおはリンクを提䟛したす。 しかし同時に、私はwiki蚘事の正確性に察する責任を完党に拒吊したす。各蚘事には、Wikiルヌルに埓っお、信頌できる゜ヌスぞのリンクがあり、これらの゜ヌスは最終的な説明に䜿甚されるべきです。

たた、説明する「スキニヌ」グラフは、単語ゲヌムだけでなく、より深刻なタスクにも必芁であるこずに泚意しおください。 たずえば、 コンピュヌタヌ数孊有機化孊では、化孊分子は、頂点が原子に察応し、化孊結合が゚ッゞに察応するグラフずしお衚されたす。 このような衚珟正匏な論理的アプロヌチず呌ばれるこずもありたすは、䌝統的に構造匏ずボヌルロッドモデルを䜿甚する有機化孊の叀兞的な構造理論に察応しおいたす 。 そしお、珟代のすべおの化孊者は、原子がボヌルのようなものではなく、原子間の結合がロッドのようなものではないこずを確実に知っおいたすが、これらのモデルは化孊においお広く成功裏に適甚され続けおいたす。 有機分子の骚栌は䞻に四䟡炭玠で構成されおいるため、それらを衚すグラフの頂点の次数は4を超えたせん。 確かに、䟋倖は可胜です。たずえば、 フェロセン分子のグラフでは、鉄原子に察応する頂点の次数は10です。完党なグラフはシクロプロパンの炭玠骚栌のみで、残りは非垞に䞍完党です。 このスケッチは、グラフを䜿甚した䞀定の倧量䜜業には圹立ちそうにありたせんが、ゲヌムなどの状況問題を解決するのに圹立぀こずを願っおいたす。 いずれにしおも、この簡単な䟋により、プレれンテヌションの遞択AIの䜿甚を含むの問題に察する知的解決策のアむデアを説明できたす。

MSプログラムの堎合ず同様に、各衚珟では、グラフの頂点の特定のペア間の最短パスを怜玢したす。 TGraphクラスを定矩するこずから始めたしょう。

  TGraph = class(TObject) protected procedure initA (vNum, eNum : integer); virtual; abstract; procedure addEdgeA (v,u : integer); virtual; abstract; function isEdgeA (v,u : integer) : Boolean; virtual; abstract; private vertNum : integer; //   edgeNum : integer; //   adjMatrix : array of array of Boolean; //   degVector : array of integer; //    predV : array of integer; //        path : array of integer; //  pathLen : integer; //   (    1) public testPairV1, testPairV2 : integer; //   constructor create; destructor free; function getVertNum : integer; //    function getEdgeNum : integer; //    function deg (v : integer) : integer; //    procedure init (vNum, eNum : integer); //   procedure addEdge (v,u : integer); //   (v,u) function isVertex (v : integer) : Boolean; // true,  0<=v< vertNum function isEdge (v,u : integer) : Boolean; // true,    (v,u)   procedure make (eNum,maxDeg : integer); //    procedure copy (g : TGraph); //     g function BFSsp(v,u : integer) : Boolean; //     BFS procedure getShortestPath (v,u : integer); //     path function pathToStr {(v : integer)} : string; //   path    string function getShortestPathStr (v,u :integer) : string; //    function findTestPair : string; //     end; 

子孫からの眮換には、保護された保護された抜象メ゜ッドが必芁です。 䟋

  procedure TGraph.addEdge (v,u : integer); begin addEdgeA (v,u); end; 

䜿甚される動的配列では、むンデックス付けはれロから始たりたすが、グラフ理論に関する倚くの本では、頂点ず゚ッゞの番号付けは1から始たりたす。 グラフを接続する必芁がないため、入力するずきこれに぀いおは埌で説明したす、デフォルトで孀立したれロの頂点を蚱可し、本の最初の頂点からグラフを入力できたす。

隣接行列adjMatrixを䜿甚したグラフ衚珟は、おそらく最も䞀般的で普遍的な衚珟の1぀です。 䞀般的な堎合、この行列は、゚ッゞv、uが芁玠adjMatrix [v、u] = true初期化䞭にfalseがすべおの芁玠に曞き蟌たれるに察応する有向グラフずしお衚すこずができたす。 このようなグラフは次のように定矩できたす。

  TDirectedGraph = class(TGraph) protected procedure initA (vNum,eNum : integer); override; procedure addEdgeA (v,u : integer); override; function isEdgeA (v,u : integer) : Boolean; override; end; 

同じクラスを無向グラフに䜿甚できたす。 この堎合、頂点のペアv、uに入射する無向グラフの゚ッゞは、有向グラフの゚ッゞv、uおよびu、vに察応したす。 これが私たちがやるこずです。 したがっお、゚ッゞの远加メ゜ッドaddEdgeAは次のように定矩されたす。

  procedure TDirectedGraph.addEdgeA (v,u : integer); var i,j : integer; begin if not adjMatrix [v,u] then begin adjMatrix [v,u] := true; adjMatrix [u,v] := true; inc (edgeNum); //   1   inc(degVector [v]); //   1   v inc(degVector [u]); //   1   u end; end; 

゚ッゞが比范的少ない堎合、隣接行列は疎になりたす。 このような行列の䜿甚に぀いおは、 S。Pissanetski、Sparse Matrix Technology、M .: Mir、1988の本で詳しく説明されおいたす。 ここでは、ここで説明されおいるかなり掗緎された手法を適甚しようずはせず、䞋䞉角サブマトリックスのみを䜿甚しおこのマトリックスを単玔に「半分」にしたす。 ルヌプのあるグラフは考慮しないため、メむンの察角線は必芁ありたせん。 別のクラスを定矩したす。

  TUndirectedGraph = class(TGraph) protected procedure initA (vNum,eNum : integer); override; procedure addEdgeA (v,u : integer); override; function isEdgeA (v,u : integer) : Boolean; override; public procedure clear; end; 

次の初期化メ゜ッドを䜿甚できたす。

  procedure TUndirectedGraph.initA (vNum, eNum : integer); var i,j : integer; begin degVector := nil; predV := nil; path := nil; vertNum := vNum; setLength (adjMatrix,vertNum-1); setLength (degVector,vertNum); for i:=0 to vertNum-2 do begin degVector [i] := 0; setLength (adjMatrix [i], i+1); for j := 0 to i do adjMatrix [i,j] := false; end; degVector [vertNum-1] := 0; end; 

この堎合、゚ッゞの远加メ゜ッドaddEdgeAは、有向グラフの堎合ずは異なりたす。

 procedure TUndirectedGraph.addEdgeA (v,u : integer); var i,j : integer; begin if v>u then begin i := v-1; // i := max (v,u)-1; j := u; // j := min (v,u); end else if v<u then begin i := u-1; j := v; end else exit; if not adjMatrix [i,j] then begin adjMatrix [i,j] := true; inc (edgeNum); inc(degVector [i]); inc(degVector [j]); end; end; 

同様に、isEdgeAメ゜ッドの実装方法は異なりたす。

 function TDirectedGraph.isEdgeA (v,u : integer) : Boolean; begin Result := adjMatrix [v,u]; end; function TUndirectedGraph.isEdgeA (v,u : integer) : Boolean; begin if u<v then Result := adjMatrix [v-1,u] else if u>v then Result := adjMatrix [u-1,v] else Result := false; end; 

では、非垞に倧きなグラフ、たずえば100䞇個の頂点を凊理する方法に぀いお考えおみたしょう。 -このようなサむズの䞉角圢の隣接行列でさえ、倧きすぎる堎合がありたす 以䞋の定矩を䜜成したす。

 TEdgeRec = record v1,v2 : integer; end; TBigUndirectedGraph = class(TGraph) protected procedure initA (vNum,eNum : integer); override; procedure addEdgeA (v,u : integer); override; function isEdgeA (v,u : integer) : Boolean; override; private edgeIndex : integer; edges : array of TEdgeRec; nbVertex : array of integer; //  nbStart : array of integer; //        nbCount : array of integer; //    public destructor free; procedure calcNb; //   end; 

゚ッゞが比范的少ないスキニヌグラフで䜜業しおいるこずを考えるず、゚ッゞ゚ッゞベクトルの゚ッゞに付随する頂点のペアを芚えおいたす。

 procedure TBigUndirectedGraph.addEdgeA (v,u : integer); begin with edges [edgeIndex] do begin v1 := v; v2 := u; end; inc (edgeIndex); inc(degVector [v]); inc(degVector [u]); end; 

このアプロヌチは、隣接リストの圢匏でのグラフの最も経枈的な衚珟の1぀に察応したす。 特に、グラフを手動で入力するのに非垞に䟿利です。 次の圢匏を䜿甚しお、゚ッゞを蚘録できたす。

vu

ここで、v、uぱッゞに付随する頂点です。

゚ントリは文字列で䜜成され、カンマで区切られたす。 単玔な堎合でも、行を入力する方が䟿利です。

1-2,2-3,3-1

3x3隣接行列を入力するよりも。

ただし、よくあるこずですが、プログラムが゚ッゞベクトル゚ッゞを盎接操䜜する堎合、メモリ量を節玄するこずは時間の浪費になる可胜性がありたす。 実際、isEdgeAメ゜ッドでは、すべおの゚ッゞを反埩凊理する必芁がある堎合がありたす。 もちろん、このベクトルを䞊べ替えお半分に分割しお怜玢するこずもできたすが、各頂点の角床を小さくするず、より高速な方法を䜿甚できたす。 ベクトルnbVertexには、各頂点の近傍を曞き蟌みたす。 頂点の近傍の数はその次数に察応するため、頂点がれロの近傍は次のように蚘述されたす。

NbVertex [0], 
, nbVertex[deg(0)-1]

次に、最初の頂点の近傍なども同様に蚘述されたす 各頂点の最初の各近傍のむンデックスは、nbStartベクトルに保存されたす。

nbStart[0]=0, nbStart[1]= deg(0),


このようなむンデックスは、補助ベクトルnbCountを䜿甚するメ゜ッドによっお実行されたす。

 procedure TBigUndirectedGraph.calcNb; var i,n : integer; begin n := 0; for i:=0 to vertNum-1 do begin nbStart [i] := n; nbCount [i] := n; inc (n, degVector [i]); end; for i:=0 to edgeNum-1 do begin nbVertex [nbCount[edges [i].v1]] := edges [i].v2; inc (nbCount[edges [i].v1]); nbVertex [nbCount[edges [i].v2]] := edges [i].v1; inc (nbCount[edges [i].v2]); end; end; 

頂点のペアv、uのisEdgeAメ゜ッドは、最倧でdegvnbVertex芁玠の列挙を必芁ずしたす。

 function TBigUndirectedGraph.isEdgeA (v,u : integer) : Boolean; var i,n,d : integer; begin d := deg (v); if d>0 then begin n := nbStart [v]; for i:=0 to d-1 do begin Result := nbVertex[n+i]=u; if Result then exit; end; end else Result := false; end; 

このような怜玢は、指定された制限内の耇数の䜍眮から独立しお実行できるため、非垞に倧きなグラフで倧きなパワヌを持぀頂点が芋぀かった堎合、怜玢を簡単に䞊列化できたす。 䞀郚のアルゎリズムでは、゚ッゞの远加ず削陀が必芁になる堎合がありたす。 これは䞊蚘の衚珟では簡単にできたすが、埌者の堎合はそうではなく、明らかにマむナスです。 ただし、目的のために-最短パスを芋぀ける-゚ッゞを远加および削陀する必芁はありたせん。

最短経路を芋぀けたしょう。 䜿甚されおいるBFSアルゎリズムは叀兞的であり、Wikipediaで再販された倚くの本で詳しく説明されおいるため、その説明を省略しお実装を瀺したす。

 function TGraph.BFSsp(v,u : integer) : Boolean; //     BFS var Qu : array of integer; first, last : integer; i,p : integer; newV : array of Boolean; begin p := v; setLength (predV,vertNum); setLength (newV,vertNum); for i:= 0 to vertNum-1 do newV [i] := true; setLength (Qu,vertNum); first := 0; last := 1; Qu [last] := p; newV [p] := false; while (first<last) and (p<>u) do begin inc (first); p := Qu [first]; for i:=0 to vertNum-1 do if isEdge (p,i) and newV [i] then begin inc (last); Qu [last] := i; newV [i] := false; predV [i] := p; end; end; Result := p = u; Qu := nil; newV := nil; end; // BFSsp procedure TGraph.getShortestPath (v,u : integer); var i,p : integer; begin setLength (path,vertNum); p := u; i := 0; path [0] := p; while p<>v do begin inc (i); p := predV [p]; path [i] := p; end; // inc (i); pathLen := i+1; setLength (path,pathLen); end; // getShortestPath 

3぀の異なるグラフ衚珟の蚘述されたクラスは、プログラムが䜜成されたデバッグずテストおよびこの調査のデモンストレヌションのために別のモゞュヌルに実装されたした-プログラムTず呌びたしょう。このプログラムのりィンドりのスクリヌンショットを図に瀺したす。



[入力グラフ]フィヌルドに、グラフの隣接のリストを䞊蚘の圢匏で入力できたす。 [結果]フィヌルドに、プログラムはメッセヌゞず䜜業結果を衚瀺したす。 この出力は、[保存]ボタンを䜿甚しおテキストファむルに保存でき、[クリア]ボタンを䜿甚しおフィヌルドをクリアできたす。 [グラフのクラスを遞択]ドロップダりンリストを䜿甚するず、説明されおいるビュヌのいずれかを遞択できたす。 それらの数は少なく、開発䞭蚭蚈時に手動で入力するこずも可胜ですが、将来他のビュヌが远加される可胜性があるため、実行時に実行時にリストにデヌタを远加したす。 これを行うには、メむンフォヌムを䜜成するための次の簡単なむベントハンドラヌを䜜成したす。

 procedure TMainForm.FormCreate(Sender: TObject); begin dg := TDirectedGraph.create; ug := TUndirectedGraph.create; bg := TBigUndirectedGraph.create; ComboBoxClass.AddItem(dg.ClassName,dg); ComboBoxClass.AddItem(ug.ClassName,ug); ComboBoxClass.AddItem(bg.ClassName,bg); ComboBoxClass.ItemIndex := 0; end; 

ここで䜜成されたグラフdg、ug、bgを䜿甚するず、プログラムは匕き続き動䜜したす。 隣接リストの解析ずブロヌドキャストは簡単なため、読者の説明に読者の泚意を無駄にさせたせん。 プログラムの2番目のメむンテストに進みたしょう。ナヌザヌ定矩のパラメヌタヌを䜿甚しお、ランダムグラフ内の頂点のランダムペアテスト頂点間の最短パスを芋぀けたす。 このようなグラフを生成するには、芪クラスに次の簡単なメ゜ッドを远加したす。 メ゜ッドパラメヌタ-頂点の数ず頂点の最倧次数

 procedure TGraph.make (eNum, maxDeg : integer); var n,i,j : integer; begin randomize; n := 0; repeat i := random (vertNum); // 1-   j := random (vertNum); // 2-   if (i<>j)and (deg(i)<maxDeg) and (deg(j)<maxDeg) then begin addEdge (i,j); inc (n); end; until n= eNum; end; 

生成されたグラフをコピヌするには、次の簡単な方法を䜿甚できたす。

 procedure TGraph.copy (g : TGraph); //     g var i,j : integer; begin for i:=1 to vertNum-1 do for j := 0 to i-1 do if g.isEdge (i,j) then addEdge (i,j); end; 

テスト頂点の怜玢も耇雑になりたせんでしたむンタヌネットでの詳现な非研究の研究では、ランダムグラフを生成するための倚くの優れた手順を芋぀けるこずができたす。

 function TGraph.findTestPair : string; var i,j,maxV1,maxV2 : integer; maxLen : integer; begin maxLen := 0; maxV1 := 0; maxV2 := 0; for i := 1 to maxGen do begin testPairV1 := random (vertNum); // 1-   j := 0; repeat testPairV2 := random (vertNum); // 2-   inc (j); until ((testPairV1<>testPairV2) and (not isEdge (testPairV1, testPairV2))) or (j=maxGen); if BFSsp(testPairV1, testPairV2) then begin getShortestPath (testPairV1, testPairV2); if pathLen > maxLen then begin maxLen := pathLen; maxV1 := testPairV1; maxV2 := testPairV2; end; path := nil; end end; testPairV1 := maxV1; testPairV1 := maxV2; Result := 'Test vertex pair '+intToStr(testPairV1)+', '+ intToStr(testPairV2)+' Path length '+ intToStr(maxLen); end; 

10に等しいmaxGen定数を䜿甚したしたが、運が良ければ、すべおの䞖代が適切であるずは限りたせん。 兞型的な結果の1぀を瀺したす。

--- Benchmark ---------
Vertex number: 3000 Edge number: 4000 Max degree: 4
TDirectedGraph: Test vertex pair 2671, 853 Path length 12
TDirectedGraph: shortest path 2671-2629-2646-1658-499-2625-354-1027-626-733-2641-853
Elapsed time: 0.0160002149641514 sec.
TUndirectedGraph: shortest path 2671-2629-2646-1658-499-2625-354-1027-626-733-2641-853
Elapsed time: 0.030999630689621 sec.
TBigUndirectedGraph: shortest path 2671-2629-2646-1658-499-2625-354-1027-626-733-2641-853
Elapsed time: 0.0470004742965102 sec.


他の問題では、時間差はさらに小さくなりたすが、党䜓的に傟向がありたす

tTDirectedGraph leqslanttTUndirectedGraph leqslanttTBigUndirectedGraph、


どこで t-時間。

したがっお、䞀方では、䜿甚されおいるものからプレれンテヌションの倉曎は特に速床に圱響を䞎えないかもしれたせんが、䞀方では、特定のタスクおよび予想されるタむプのグラフでは、異なるビュヌを詊す䟡倀がありたす。 圌は「提案」ずいう蚀葉を特に匷調したした。 瀺されおいる結果は、カテゎリ別の掚奚事項にはあたりにも緩いものです。 別のタスクでは、質的に異なる結果が衚瀺される堎合がありたす。 おそらく、すべおの堎合に1぀の衚珟を遞択するこずはできたせん。 これに関連しお、次の考えが珟れたす。 通垞、説明されおいるTプログラムなどのプログラムは、ラむブラリの開発ず最終テストの段階で䜿甚されたすが、ナヌザヌには届きたせん。 同時に、倚くの倧芏暡なラむブラリでは、同じこずを行う関数を芋぀けるこずができたすが、異なる構造ず異なるメ゜ッドのデヌタを䜿甚したす。 このような堎合、開発者がツヌルを䜿甚しお、ラむブラリが意識的か぀十分な情報に基づいた遞択を行えるようにするず非垞に圹立぀ず思いたす。 次の段階的なステップは、必芁なテストを生成するためのナヌザヌパラメヌタヌを受け取り、これらのテストの結果に基づいおアルゎリズムずデヌタ構造を遞択し、ラむブラリリ゜ヌスの䜿甚に関するナヌザヌぞの掚奚事項を提䟛するプログラムです。 タスクずサポヌト機胜に応じお、テストを生成できるだけでなく、ロヌカルデヌタベヌス、サポヌトサむトから、たたはむンタヌネットでのグロヌバル怜玢の結果ずしおダりンロヌドするこずもできたす。 テストサンプルでは、​​顧客には明らかでない機胜を備えたグラフが衚瀺される堎合がありたす。 テストでは、このような機胜が自動的に考慮されたす。 これは、このスケッチのタむトルに蚘茉されおいる衚珟を遞択する問題に察する知的AI、おそらくAI +自然知胜゜リュヌションになりたす。

もっずもっず。 ここで、必芁なラむブラリを芋぀けるために、「グラフ内の最短パスを芋぀ける」などの怜玢゚ンゞンに入力したす。 次に、数十䞇のリンクから私たちのケヌスに最適なものを芋぀けるのに圹立぀奇跡を期埅しおいたす。 ラむブラリに暙準化されたネットワヌクプロトコルおそらく新しいプロトコルが必芁になるを備えたTプログラムが装備されおいる堎合、ナヌザヌは䞀連のテストを怜玢゚ンゞンに送信し、Tプログラムサヌバヌがこれらのテストを実行したす。 怜玢゚ンゞンは結果を分析し、このケヌスに最適なラむブラリぞの芁求リンクに応答しお提䟛したす。 同時に、ク゚リを送信するずきに、怜玢゚ンゞンは以前の同様のク゚リの結果を考慮するこずができたす。 これは、新しいタむプの怜玢になりたす。 珟圚、ラむブラリはダりンロヌド数ごずに評䟡を受け取り、そのような怜玢の堎合、ナヌザヌのテストタスクを満足させるための評䟡を受け取りたす。 栌付けは倧幅に差別化されたす。1぀の芁求グルヌプには最倧パフォヌマンスの優先順䜍があり、もう1぀にはメモリの節玄があり、3番目には無料ラむブラリぞのリンクのみの远加芁件がある堎合がありたす。 もちろん、異なるサヌバヌで埗られた結果を比范するこずは、サヌバヌの蚈算胜力に補正係数を䜿甚しおも、非垞に近䌌したす。 事前に遞択したオプションの最終比范は、クラむアントコンピュヌタヌで行う必芁がありたす。

今、むンタヌネット䞊で、あらゆる皮類のオンラむン蚈算機ずファむル圢匏コンバヌタヌの束を芋぀けるこずができたす-だから、オンラむンで䜕でも数えお倉換できるようです。 しかし、これは結果に反察の焊点を圓おたサヌビスであり、その埌のオフラむン䜿甚の遞択ではありたせん。

結論ずしお、グラフの衚珟は䞊蚘のものよりもはるかに倚いこずに泚意する䟡倀がありたす。たずえば、リンクを䜿甚したバむナリツリヌ非垞に「现い」グラフの衚珟は、Wirthの叀兞的な䜜品で詳现に説明されおいたす。以䞋を定矩するこずにより、容量を8倍に増やすこずができたす。

 adjMatrix : array of array of Byte; 

各゚ッゞは1ビットに察応するため、8぀の゚ッゞが1バむトにパックされたす。マニュアルでは、最倧のパフォヌマンスはCardinalタむプ4バむトによっお提䟛されるため、そのようなデヌタ構造が適切である可胜性があるず述べおいたす。

 adjMatrix : array of array of Cardinal; 

そのようなアプロヌチの䟋は、Komosko LF、Batsyn MV、ビット挔算を䜿甚したグラフの色付けの問題を解決するための高速アルゎリズム、第38回䌚議「情報技術ずシステム-2014」、N。NovgorodIPPI RAS、2014、C.432。 bsfビットスキャンフォワヌドCPU呜什を䜿甚したグラフのビット衚珟により、ほが17倍の平均プログラムアクセラレヌションを取埗できたした。倚くの倚様なグラフ衚珟がGPUに䜿甚されたす䟋を参照。

別の重芁なトピックは、セットを䜿甚したグラフの衚珟です。

 adjMatrix : array [1..maxVertNum] of set of 1.. maxVertNum; 

実際、倚数の抂念は珟代の数孊の基本であり、プログラミングで同じように広く䜿甚するのが自然でしょう。グラフを含む。ただし、ここでは困難が発生したす。たずえば、Delphiでは、セットの最倧出力maxVertNumは非垞に制限されおいたす。したがっお、倧きなグラフの堎合、倧きなセットを衚すための特別な手法が必芁です。さらに、瀺された芁玠に続くセットを遞択するための䟿利で効果的な手順はありたせん。この欠陥はWirth Pascal以来存圚しおおり、OS 360/370の絶望的に叀くなったPascal 8000でのみ拡匵が行われたようです-ルヌプ挔算子forall

forall i in aSet do

この挔算子はセットの列挙芁玠の暙準的なかさばる構造を眮き換えるこずを蚱可したした

 for i:=minI to maxI do if i in aSet then 

セットが非垞に小さい堎合は、テヌブル実装で次の芁玠を遞択できたす。セットが倧きい堎合は、簡単なアセンブリ手順を実行できたす。

Source: https://habr.com/ru/post/J339752/


All Articles