a
は「何回の再帰呼び出しがあるか」で、b
は「データを何個に分割するか」を直感的に示しています。再帰呼び出し内のパラメータは、n
を何かで割ったものである必要はないことに注意してください。通常、n
の任意の関数です。は、データの大きさがどのように変更されたかを表します。
たとえば、バイナリ検索では、各レイヤで1回の再帰呼び出しが行われ、データが2に分割され、各レイヤで一定の作業が行われるため、T(n) = T(n/2) + c
になります。 Merge sortは、毎回2つのデータを分割します(分割は作業をn
に比例させます)。の両方をサブアレイに再帰します。T(n) = 2T(n/2) + cn
となります。
あなたの例では、1回の再帰呼び出しを行い、毎回サイズを1ずつ減らして「データを分割する」ので、T(n) = T(n-1) + c
になります。
これより大きなO表記を取得するには、置換または展開するだけです。あなたの例で、それは簡単です:
T(n) = T(n-1) + c = T(n-2) + 2c = T(n-3) + 3c = ... = T(0) + nc
あなたは、いくつかの「定数ベース」T(0) = c0
を前提とした場合は、T(n) = nc + c0
を取得し、行われる作業がO(n)
であることを意味します。
バイナリ検索の例も似ていますが、置換を行う必要があります。n = 2^m
を取得して、どこで取得できるかを確認してください。最後に、例の大きなO表記を導出する。 T(n) = T(sqrt(n)) + c
は本当にクールなエクササイズです。
編集:再発関係を解決する他の方法があります - Master Theoremは標準的な方法です。しかし、その証明は特に良いことではありませんし、上記の方法は私が今まで適用したすべての再発に対して機能します。そして...まあ、それは数式に値を差し込むより面白いです。
T(n) = T(n-1) + constant
とマスターの定理は言う:あなたのケースの漸化式で
big-O表記は、ワーストケースのシナリオでの操作数によって計算されます。あなたは関数が配列の最後から始まり、配列内のすべての値を比較して後方に働くようです。ですから、一見すると、あなたの関数はO(n)です。 [こちら](https://en.wikipedia.org/wiki/Recurrence_relation#Computer_science)は良い説明です。 –