最大10,000個の整数(0 <整数< 100,000)のシーケンスが与えられた場合、最大減少サブシーケンスとは何ですか?サブシーケンスは連続している必要はないことに注意してください。 再帰的な降下の解答以下のアルゴリズムの実行時の複雑さ
明らかなアプローチは、再帰的な降下です。再発と終末条件のみが必要です。
1 #include <stdio.h>
2 long n, sequence[10000];
3 main() {
4 FILE *in, *out;
5 int i;
6 in = fopen ("input.txt", "r");
7 out = fopen ("output.txt", "w");
8 fscanf(in, "%ld", &n);
9 for (i = 0; i < n; i++) fscanf(in, "%ld", &sequence[i]);
10 fprintf (out, "%d\n", check (0, 0, 999999));
11 exit (0);
12 }
13 check (start, nmatches, smallest) {
14 int better, i, best=nmatches;
15 for (i = start; i < n; i++) {
16 if (sequence[i] < smallest) {
17 better = check (i+1, nmatches+1, sequence[i]);
18 if (better > best) best = better;
19 }
20 }
21 return best;
22 }
行1-9と11-12は、間違いなく定型文です。彼らはいくつかの標準変数を設定し、入力を取得します。魔法は行10にあり、再帰ルーチンはcheck
です。 check
ルーチンは、より小さい整数、これまでの最長シーケンスの長さ、これまでの最小の整数の検索をどこから始めるべきかを知っています。余分なコールを犠牲にして、スタートが適切な範囲内になくなると自動的に終了します。ルーチンは簡単です。これは、これまでの最小値より小さい整数を探すリストに沿って移動します。見つかった場合、check
コール自体を再帰的にiが入力
ように完全に逆の順序 にあるときに、最悪の場合になるであろうと思う 詳細を見つけるために
このアルゴリズムの実行時の複雑さは何ですか、私はそれを見つけるのが難しいです...
それは、「最大の減少サブ」と呼ばれるが、「最長の減少サブシーケンス」ではないです。これは、「最長増加サブシーケンス」と似ています。これは、専用ウィキペディアページの古典的な問題です。ここに尋ねる前に、すでにそのようなリソースをチェックしましたか? – o9000
ランタイムの複雑さは、通常、* average *、* best case *、* worst case *の3つの量で記述されます。どちらをお探しですか?あなたはすでに最悪の場合を指摘しています - 再帰呼び出しを合計してください - 最良の場合は線形ですが、平均はより複雑になるでしょう。 – BeyelerStudios
@ o900が言ったことに沿って、これは確立された質問です。ソリューションがどのように見えているのかは分かりませんが、最初は時間の複雑さを考えずに問題を解決してください。確立され、実証された実装ができたら、それを切り捨てるか、より良いソリューションを特定することができます。 –