1

私の目標は、2D配列の最初の要素のみに対して二分探索を実行することです。.NETでBinarySearch()を使用して可能かどうかを調べるために一日中検索していますが、何も見つかりません。

これを明確にするため。ソートされていない1D配列があると想像してください。配列を並べ替えると、元のインデックスが失われます。元のインデックスを保持する配列の2番目の要素を作成し(これは実行できます)、最初の要素で並べ替えてから、最初の要素をバイナリ検索します。

誰かが私を正しい方向に押してくれるなら、私はとても感謝しています。ありがとう

4

4 に答える 4

3

まあ、私があなたを正しく理解しているなら、あなたはこのようなものが必要です:

// initialize the array and the indexes array
var a2D = new int[2][];
a2D[0] = new[] { 3, 14, 15, 92, 65, 35 }; // <-- your array (fake data here)
a2D[1] = Enumerable.Range(0, a2D[0].Length).ToArray(); // create the indexes row

// sort the first row and the second one containing the indexes
Array.Sort(a2D[0], a2D[1]);

// now a2D array contains:
//  row 0: 3, 14, 15, 35, 65, 92
//  row 1: 0,  1,  2,  5,  4,  3

// and you can perform binary search on the first row:
int columnIndexOf35 = Array.BinarySearch(a2D[0], 35);
// columnIndexOf35 = 3
// 
// a2D[0][columnIndexOf35] = 35 <- value
// a2D[1][columnIndexOf35] = 5  <- original index
于 2012-08-06T15:57:06.873 に答える
1

MSDNによると、メソッドは1Array.BinarySearch次元配列でのみ動作するため、ケースで直接使用することはできません。あなたが持っているオプションのいくつかは次のとおりです。

  1. 最初の列を別の配列に抽出し、それを呼び出しますArray.BinarySearch
  2. インターフェイスを実装するカスタムクラスPairを定義IComparableし、このクラスのインスタンスを使用して配列を構築します。
  3. 自分で2次元配列に二分探索を実装します。
于 2012-08-06T15:45:16.333 に答える
0

データと「元のインデックス」を保持するオブジェクトが必要であり、データでオブジェクトの配列を並べ替え/検索するよりも必要なようです。

(この回答はアンドレイのオプション2を示しています)

class IndexedData:IComparable
{
  public MyType Data;
  public int OriginalIndex;

  public int CompareTo(object obj) {
    // add correct checks for null,.. here
    // and return correct comparison result. 
    // I.e. if MyType is IComparable - just delegate.
    return Data.CompareTo(obj);
}

実装/使用法の詳細については、MSDNのIComparableを確認してください。

于 2012-08-06T15:50:57.170 に答える
0

後でアレイで何をする予定かによっては、別の解決策としてLINQを使用することもできます。

var unsortedStartingArray = new[] {3, 6, 2, 1, 20, 20};
var q = unsortedStartingArray
        .Select((item, index) => new {item, index})
        .ToLookup(x => x.item, x => x.index);

var notFound = q[30]; // An empty array. Nothing found
var indexOf1 = q[1].First(); // returns 3
var multipleIndexsOf20 = q[20]; // Returns an array with 4, 5

ルックアップへのインデックスは、検索している値になります。パフォーマンスに関しては、これは私の大まかなテストよりも約5倍遅くなると推測します

于 2012-08-06T17:02:35.417 に答える