効率の良いアルゴリズムをつくる方法を教えて頂けないでしょうか。
ノードで三角形を作っていき、全ての点を結んで行ったり、三角形を作ったりするアルゴリズムです。
以下のようなグラフについて、
行列Eと行列N があります。
行列Eは、それぞれの三角形1、2、3、....16においての3点を結んだものです。
行列Nは、それぞれの青い点1、2、3、...16に、隣接する、三角形の数字を並べたものです。
それぞれ、一番小さい数字からはじまり 、半時計周りです。
例えば、Eは6行目に、三角形6を作る3点、10、11、15があります。
また、Nは、10行目に、点10に隣接する三角形、5、7、8、6があります。
この行列において、
(1)
Nのみが与えられたとき、Eの行列を作り上げる
(Eの行列の中身の順番には、特に指定はありません)
ことができるプログラミングのアルゴリズム1
(教えて頂きました。本当にありがとうございました。)
1. N を読み込み、行数Nnを数える 2. N の一番大きな数字を見つける #(16) 3. 16行x3列のEという空の行列を作る。 1. For i 1:Nn # N行のループ 1. For j 1: len(N[i]) #Nそれぞれの行の要素数の分だけループ 1. E[ N[i ][j] ]に i を ストック
(2)
Eのみが与えられたとき、点と点を結ぶ線の数(黒線)を求める、
ことができるアルゴリズム2
1.
を考えています。
O(N)のあるアルゴリズムをつくっているのですが、
アルゴリズムがどうしても思いつかなくなり、質問をさせて頂きました。
ちなみに、
E行列からN行列を求めるO(N)アルゴリズムは、
(Eの行列から、N行列を求める) 1. EからNe行をの行数を数える 2. Nn = Eで一番大きい数をストックする 3. Counter ベクトル c=0 を、サイズNnで作る 4. N=0 空の行列 5. For e = 1: N 1. for i 1:3 #3つエントリーがあるから 2. n = E[e,i] 3. c[n] = c[n] +1 4. N[n,cn] = e
と導き出せたのですが、
上の(2)の効率の良いアルゴリズムが思いつきませんでした。
どなたか、効率の良いアルゴリズムを教えて頂けないでしょうか。
どうか、宜しくお願い致します。
(2)のアルゴリズム
1. EからNe行をの行数を数える 2. Nn = Eで一番大きい数をストックする 3. Counter ベクトル C=0 #三角形の辺の数 4. B=0 空の行列 #三角形の辺を保存する 5. A 0 空の行列 #現在みているの三角形辺を保存する 6. For e = 1: Nn 1. For i 1:3 #3つエントリーがあるが、 1. C = C + 3 1. テーブルの作成 1. If i == 3: 1. B[ i ] = [ E[e,i], E[e,i-2]] 2. A[ i ] = [ E[e,i], E[e,i-2]] 2. else: 1. B[ i ] = [ E[e,i], E[e,i+1]] 2. A[ i ] = [ E[e,i], E[e,i+1]] 1. num=A ∩ B をして、重なった数字をCから消す 2. C = C-num 3. 4. A を空にする。