C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#の再帰処理で回転されたソート済み配列から要素を検索する方法

概要

回転されたソート済み配列(ローテート・ソート配列)から特定の値を検索するには、通常の二分探索を少し改良した再帰的なアプローチが有効です。ポイントは、中央の要素(最小要素)のインデックスを基準に配列を2つの部分に分け、どちら側に目的の値が存在するかを判定しながら探索範囲を絞り込んでいくことです。

アルゴリズムの手順

  • 中央要素(最小要素)のインデックスを見つける。
  • 以下の条件に基づいて、該当する部分配列に対して二分探索を適用する。
  • 検索対象の値が開始要素から mid-1 番目の要素の間に存在する場合、start ~ mid-1 の範囲で二分探索を再帰的に実行する。
  • それ以外で、値が mid ~ 末尾の要素の間に存在する場合は、mid+1 ~ end の範囲で二分探索を再帰的に実行する。

この方法により、たとえ配列が途中で回転していても、各ステップで必ず片側の半分は正しくソートされているため、O(log n) の時間計算量で効率よく値を検索できます。

サンプルコード

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace ConsoleApplication{
    public class Arrays{
        public int FindNumberRotated(int[] array, int start, int end, int value){
            if (start > end){
                return -1;
            }
            int mid = (start + end) / 2;
            if (array[mid] == value){
                return mid;
            }
            if (array[start] <= array[mid]){
                if (value >= array[start] && value <= array[mid]){
                    return FindNumberRotated(array, start, mid - 1, value);
                }
                return FindNumberRotated(array, mid + 1, end, value);
            }
            if (value >= array[mid] && value <= array[end]){
                return FindNumberRotated(array, mid + 1, end, value);
            }
            return FindNumberRotated(array, start, mid - 1, value);
        }
    }
    class Program{
        static void Main(string[] args){
            Arrays a = new Arrays();
            int[] arr = { 3, 4, 5, 6, 7, 8, 9, 10, 1, 2 };
            int res = a.FindNumberRotated(arr, 0, arr.Length - 1, 1);
            Console.WriteLine(res);
        }
    }
}

実行結果

8

コードの解説

上記の例では、{ 3, 4, 5, 6, 7, 8, 9, 10, 1, 2 } という、元々昇順にソートされていた配列が途中で回転している状態を扱っています。FindNumberRotated メソッドは再帰的に呼び出され、まず中央要素と比較し、左半分がソート済みかどうか(array[start] <= array[mid])を判定します。ソート済みの側に目的の値が含まれる範囲であればそこを探索し、含まれない場合は反対側へ探索範囲を移します。値が見つかればそのインデックスを返し、見つからなければ -1 を返します。この例では値「1」はインデックス 8 に存在するため、結果として 8 が出力されます。

  1. Pythonで再帰関数を使って数値の累乗を計算する方法

    Pythonでは、再帰(リカーシブ)処理を利用することで、数値の累乗をシンプルに計算できます。本記事では、ユーザーから数値と指数を入力として受け取り、再帰関数によって累乗を求めるプログラムを紹介します。再帰による累乗計算の仕組み再帰とは、関数が自分自身を呼び出すことで処理を繰り返す手法です。累乗の計算では、「数値 × 数値^(指数-1)」という関係が成り立つため、指数を1つずつ減らしながら自分自身を呼び出すことで、最終的な結果を得られます。サンプルコード以下のプログラムは、ユーザーから数値(底)と指数を受け取り、再帰関数 rpower() を使って累乗を計算します。この関数は、数値を再帰的に繰

  2. Pythonで数値の階乗を求める方法を解説!forループとrange関数の使い方

    階乗(factorial)とは、1からその数までのすべての整数を掛け合わせた積のことです。例えば、5の階乗は「5 × 4 × 3 × 2 × 1 = 120」となります。 Pythonで指定した数の階乗を求めるには、range()関数を使って1からその数まで繰り返すforループを作成します。ここで注意すべき点は、range()関数は終了値(ストップ値)を含まないという仕様です。そのため、終了値は入力された数値より1大きい値(num+1)を指定する必要があります。 階乗を求めるPythonコードの例 ループ内では、各数値を変数 f に累積的に掛けていきます。この変数 f は初期値として 1 を設