C# .NET でのシーケンスの一般的な線形検索/順次検索


今年の初めに、アルゴリズムとデータ構造の知識をブラッシュアップすることにしました. Robert Horvick による PluralSight で、これらの 2 つのコース ( 12 ) を受講しました.
このコースで学んだことを実践するために、さまざまなアルゴリズムとデータ構造の汎用バージョンを作成することにしました.

ジェネリック バージョンとはどういう意味ですか?これらのタイプのコースでは、常に整数または文字列を使用してアルゴリズムを示します.これらのプリミティブ データ型を使用する代わりに、C# の generic type parameters を使用してアルゴリズムとデータ構造を再実装しています.

次に示すのは、1 つの T だけでなく T のシーケンスを検索する線形検索を実行する汎用メソッド LinearSearchSequence を使用したコンソール アプリケーションです.

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var numbers = Enumerable.Range(250, 750).ToArray();

        var index = LinearSearchSequence(numbers, new int[] { 500, 501, 502 });
        Console.WriteLine("Linear Search Sequence:");
        Console.WriteLine(index);
    }

    private static int LinearSearchSequence<T>(IEnumerable<T> list, IEnumerable<T> needle) where T : IComparable
    {
        var needleArray = needle.ToArray();
        var needleLength = needleArray.Length;
        var listLength = list.Count();
        for (int i = 0; i <= listLength - needleLength; i++)
        {
            for (int matchIndex = 0; matchIndex < needleLength; matchIndex++)
            {
                var item = list.ElementAt(i + matchIndex);
                var needleItem = needleArray[matchIndex];
                if (item.CompareTo(needleItem) != 0)
                {
                    break;
                }

                if (matchIndex == needleLength - 1)
                {
                    return i;
                }
            }
        }

        return -1;
    }
}


型が IComparable インターフェイスを実装する必要があるという制約を指定してジェネリック型パラメーターを使用することにより、使用している正確な型を知らなくても線形検索アルゴリズムを実行できます.

クイック ソート アルゴリズムの背後にあるロジックを理解したい場合は、前述のコースをチェックすることをお勧めします.オンラインには他にもたくさんの優れたリソースがあります.

免責事項: このコードは動作しますが、練習のためにのみ開発されています.自己責任で使用するか、並べ替えライブラリを使用してください.改善の余地がある場合は、おそらく、私はすべての耳です〜