2010-12-16 11 views
3

私は渡された値のすぐ下のインデックスを検索する浮動小数点データのリストを持っています。簡単な例:バイナリサーチとLINQ selectステートメント

double[] x= {1.0, 1.4, 2.3, 5.6, 7.8}; 
double[] y= {3.4, 8.2, 5.3, 8.1, 0.5}; 
int lowerIndex = BinaryIndexSearch(x, 2.0); // should return 1 

意図は補間がその後lowerIndexlowerIndex+1を用いxyで実行されることです。

バイナリインデックス検索アルゴリズムは、LINQでこれを行うには、より効率的な方法があります

int BinaryIndexSearch(double[] x, double value) 
    { 
     int upper = x.Length - 1; 
     int lower = 0; 
     int pivot; 

     do 
     { 
      pivot = (upper + lower)/2; 

      if (value >= x[pivot]) 
      { 
       lower = pivot + 1; 
      } 
      else 
      { 
       upper = pivot - 1; 
      } 
     } 
     while (value < x[pivot] || value >= x[pivot + 1]); 

     return pivot; 
    } 

のように見えますか?それは通常より速いでしょうか? do..whileループの終了時の比較演算は、私のプログラムの "最もホットな"行です。

答えて

9

LINQはバイナリ検索よりも効率的ではありません。

ただし、既存のArray.BinarySearch methodを再発明しています。

要素が見つからない場合、Array.BinarySearchは、その位置にビット補数(~演算子)を返します。

5

LinqはIEnumerableで書かれています。パフォーマンスのためのものではありません。一般的な経験則として、使用されるデータ構造に関する詳細な知識を持つすべてのアルゴリズムは、汎用ソリューション(LINQなど)より高速です。