配列のバイナリ・サーチ
System.Arrayクラスには、ソートだけでなくバイナリ・サーチ(2分検索)の機能もある。バイナリ・サーチとは、あらかじめソートされたデータを高速に検索する手法である。これを使用した例を以下に示す。
1: using System;
2:
3: namespace ConsoleApplication80
4: {
5: class Class1
6: {
7: static void Main(string[] args)
8: {
9: int [] ar = { 4,9,3,6,1,0
};
10: Array.Sort( ar );
11: foreach( int n in ar
)
12: {
13: Console.WriteLine(
n );
14: }
15: int index = Array.BinarySearch(
ar, 3 );
16: Console.WriteLine( "index
of 3 is {0}", index );
17: }
18: }
19: } |
|
配列に対してバイナリ・サーチを行っているサンプル・プログラム11 |
配列から特定の要素のインデックスを高速に検索することができる。 |
これを実行すると以下のようになる。
|
サンプル・プログラム11の実行結果 |
値が“3”である要素のインデックスが“2”であることが分かる。
|
実際にバイナリ・サーチを行うのは、BinarySearchメソッドである。バイナリ・サーチを行うには、データがソートされている必要があるので、10行目でソートを行っている。そして、15行目で、3という値を指定して、配列arに検索を実行する。その結果、3という値は添え字が2の要素に格納されているので、15行目の変数indexには2が格納される。
引数と戻り値に使われる配列
配列型はれっきとしたデータ型なので、メソッドの引数に使ったり、メソッドの戻り値として使ったりすることもできる。その際、配列型は要素数を限定しないため、大きさの決まっていない配列を受け渡すことができる。以下はメソッドの引数と戻り値に配列型を使った例である。
1: using System;
2:
3: namespace ConsoleApplication81
4: {
5: class Class1
6: {
7: static public int [] makeArray(
bool select )
8: {
9: if( select )
10: {
11: int [] ar
= { 0,1,2,3 };
12: return ar;
13: }
14: else
15: {
16: int [] ar
= { 0,1 };
17: return ar;
18: }
19: }
20: static public void dumpArray( int
[] ar )
21: {
22: foreach( int n in ar
)
23: {
24: Console.WriteLine(
n );
25: }
26: }
27: static void Main(string[] args)
28: {
29: int [] ar = makeArray(false);
30: dumpArray( ar );
31: Console.WriteLine();
32: ar = makeArray(true);
33: dumpArray( ar );
34: }
35: }
36: } |
|
メソッドの引数と戻り値に配列型を使ったサンプル・プログラム12 |
その要素数に関係なく、配列を受け渡しすることができる。 |
これを実行すると以下のようになる。
|
サンプル・プログラム12の実行結果 |
各要素の表示にforeach文を使用すれば、要素の個数を調べる必要はない。
|
まず注目していただきたいのが、7〜19行目のmakeArrayメソッドである。7行目で、戻り値としてint []が指定されていることから分かるとおり、このメソッドは、整数の配列を返す。しかし、9行目の条件判断により、11行目の4つの内容を持つ配列を返したり、16行目の2つの内容を持つ配列を返したりする。つまり、要素の数がいくつであっても関係なく、戻り値として渡すことができるのである。
次に注目していただきたいのは、20〜26行目のdumpArrayメソッドである。このメソッドは引数に整数型の配列を受け取る。しかし、要素数に関する情報は何も指定されていない。つまり、要素が何個の配列でも受け取ることができる。そして、メソッドの内部では、foreach文で配列のすべての要素にアクセスしているが、foreach文は配列自身に何個の要素を持っているかを問い合わせるので、ソースコード上に要素の個数を調べるコードは記述されていない。
最後に1つだけ、このソースコードには注意すべきポイントがあることを付記しておく。29行目で作成された配列変数arは、32行目で再度代入されている。このような使い方は許される。そして、32行目で再度代入されたことで、29行目で作成された配列は破棄されることになる。もちろん、別の場所から参照されていたら、破棄されないかもしれないし、破棄されるとしてもいつ破棄されるかは分からない。しかし、配列変数への代入は、配列の再利用にはならず、別個の配列インスタンスが生成されるということは、覚えておく方がよいだろう。
Insider.NET 記事ランキング
本日
月間