私は点を持つ地図を持っています。私は各点の間の距離を知りたいと思います。 (これは、Undirected Cyclic Graphとも呼ばれます)。多くの点があり、ストレージが限られているため、アレイは密集している必要があります。単一ベクトルに格納された三角形隣接行列の順方向および逆方向のインデックス付け
Index #, City1 <> City2
=========================
Index #0, 1 <> 2
Index #1, 1 <> 3
Index #2, 1 <> 4
Index #3, 2 <> 3
Index #4, 2 <> 4
Index #5, 3 <> 4
Index total = 6
Cities = 4
または三角形見:4つの都市(N = 4)、Iは、これらの4都市をマッピングするために6つのインデックスを必要とするため
(1-2)(1-3)(1-4)
(2-3)(2-4)
(3-4)
この(いずれかの方向/エッジ - すべての道路は、2であります方法)。 260都市ある場合は、260x260や67600のインデックスではなく、33670のインデックスが必要です。例:4つの都市では、インデックス#4は2から4までの距離です(または4から2に「反転」されます)。
注:上の例は、都市を1つずつ、次に都市を1、...、最後の都市から最後の都市(n-1〜n)を除いて2つの都市にそれぞれ2つずつの例です。他の「形」は議論のために開いています(逆順や別の計画など)。
私に260の都市がある場合、ゼロベースのインデックス#iがどの都市を参照しているかをどのようにして知ることができますか? city1とcity2をインデックスから取得して戻すために使用できる2つの式がありますか? (例:インデックス#33333は234から249までです)。
getIndex(city1, city2) // returns index
getCities(Index) // returns city1, city2
これは良い応答です。あなたは逆転の費用で正しいです。デコードする配列を整理する/別の 'shape'でより速くエンコードする別の方法があるのだろうか? (都市のインデックスは0または1から始めることができます) – codeaperature
@codeaperature未使用のスペースはありません。索引付けをどのように配置するかに関わらず、順方向変換は、(1 + 2 + 3 + ... + n = n(n + 1)/ 2の合計に基づいて)常に2次であるため、逆数は常に平方根を必要とします。もちろん、逆変換を完全に回避するために、順変換でバイナリ検索を使用することもできますが、高速のハードウェア平方根はそれより簡単に高速になる可能性があります。 – Gene
@codeaperature実際、あなたの質問は私に別のアイデアを与えました。上記を参照。 – Gene