背景
EditGraphの最短距離を計算したくなりました。
えーそりゃぁもー突然に…
MyersさんやらWuさんやらのアルゴリズムを実装すれば良いです。実装サンプルや解説サイトは簡単に見つかります。
でも、ここ等辺で解説されているのは例えば-D
から+D
までの索引を持った作業エリアを使ったりするのですが、プログラムで表現する際は、まぁ当然のようにオフセットを掛けて0
~2*D
の範囲をアクセスしている訳です。
いや、全く問題ありません。
それで良いじゃないですか。
良いんですけどぉ、マイナス索引でアクセスできるArray
ってのがあっても良いかなぁ…
なんて。
方針
-
Collection
系は何となく重いような気もするんで、あくまでもSystem.Array
系で実装したいかなぁ -
System.Array
をサブクラス化しても何ともならん気がするので、ラッパする感じで行きましょう - となると、
Array
と同等に扱うにはICloneable, IList, ICollection, IEnumerable
等をインタフェース継承するのが良いんでしょうけど、とてもめんどくさいのでforeach
できれば良いよね、位のノリで…
実装
で、こんな感じで…
public class VArray<T> {
public VArray(int LBound, int UBound) {
array = new T[UBound - LBound + 1];
this.LBound = LBound;
this.UBound = UBound;
}
T[] array;
public int Length { get { return array.Length; } }
public T this[int index] {
get { return array[index - LBound]; }
set { array[index - LBound] = value; }
}
public int LBound { get; private set; }
public int UBound { get; private set; }
public IEnumerator<T> GetEnumerator() {
foreach (T item in array)
yield return item;
}
}
使い方はこんな感じ。
VArray<int> array = new VArray<int>(-5, 5);
for(int i=-5; i<=5; i++)
array[i] = i;
foreach(int item in array)
Console.WriteLine(item);
これで、11個のitem
がWriteLine
されてきます。
ま、どれだけ役に立つかは微妙ですけどね。