アルゴリズム洗脳シリーズ(8編)——第一篇のデリバリー思想
私のように最前線で奮闘している私たちは、プログラミングの勉強について言えば、XX言語を習得すればOKということです.実は私たちが理解しているのは、わずかな偏差があります.
三分の一、ほんとうのプログラミングはプログラミング=データ構造+アルゴリズム+XX言語です.
はい、XX言語はただの道具です.私たちはペンで字を書くことを知っていますが、張恨み水を傾倒させるいい字を書くことができるとは限りません.実は私も言ったことがあります.
アルゴリズムはプログラムデザインだけではなく、私たちの生活の中にも至るところにアルゴリズムが存在しています.例えば、私が大学二年生の時にCを勉強したことを覚えています.
アルゴリズムを知っている人は年齢規則という特徴を利用して「二分検索」を行います.この複雑さはlog 2 Nです.だから、アルゴリズムを理解することは、実際の応用においてより良い解決策をもたらすことができます.
はい、もういいです.今日は主に「デリバリー思想」を話します.
コンセプト
すでに知られている条件を利用して、特定の関係を利用して徐々に推して、最終的に結果を得るまでは、コアは常に既存の情報を利用して新しいものを導き出すことです.
二:分類
もちろん、「順押し」と「逆押し」の2種類があります.
条件から結果を出す.
逆推:結果から条件を出す.
ほほほ、感じのが1種のpolicemanが事件を解決する感じがあるのではありませんか?
例を挙げます
<1>順推しの例
大学に行ったことがある人なら、有名な「フィボナッチ」の数を知っていますよね.ウサギの繁殖問題を言います.
もし1対のウサギが毎月1対のウサギを生むことができるならば、それが生まれた後の第3ヶ月ごとに1対の小さいウサギを生むことができて、1対の初誕生の小さいウサギから始まるならば、1年後にできます.
ウサギはどれぐらい繁殖しますか?
考え方:実はこの問題はウサギを「1月のウサギ」「2月のウサギ」「3月のウサギ」に分けることができます.
①初期時: ペア1月のウサギのサイズは、合計1対です.
②最初の月: 1月のウサギは2月のウサギになります.総数はまだ1対です.
③二ヶ月目: 2月の大きなウサギは3月のウサギになり、つがいのうさぎを繁殖させました.総数は2対です.
④第三ヶ月: 3月の大きなウサギtmdのペアが生まれました.先月の1月に大きなウサギが2月のウサギになりました.総数は3対です.
...... ......
F 0=1
F 1=1
F 2=F 0+F 1
F 3=F 1+F 2
......
Fn=Fn-2+Fn-1
みんなは見てみて、体現していますか?「推す」の核心の思想を手渡して、コードもとても簡単です.
テスト結果:
<2>逆押しの例
このお金の問題について、息子の四年間の大学生活にお金を預けています.富三代は毎月三キロしか取れません.来月の生活費として、ゼロ貯金の方式を採用しています.
年利率は1.71%ですが、富二世代は一回でいくら預け入れますか?
考え方:このテーマは結果が分かりました.逆推進条件が必要です. 第48月富三代は利子を持って三kを取りに行きます.
第47月預金は:(48ヶ月目の預金+3000)/(1+0.0171/12(月));
第46月預金は:(47ヶ月目の預金+3000)/(1+0.0171/12(月));
..... .....
1ヶ月目の預金は次の通りです. (2ヶ月目の預金+3000)/(1+0.0171/12(月))
三分の一、ほんとうのプログラミングはプログラミング=データ構造+アルゴリズム+XX言語です.
はい、XX言語はただの道具です.私たちはペンで字を書くことを知っていますが、張恨み水を傾倒させるいい字を書くことができるとは限りません.実は私も言ったことがあります.
アルゴリズムはプログラムデザインだけではなく、私たちの生活の中にも至るところにアルゴリズムが存在しています.例えば、私が大学二年生の時にCを勉強したことを覚えています.
@Test
public void testMeiMei() {
Random random = new Random();
Scanner scanner = new Scanner(System.in);
int mm = random.nextInt(17) + 16;
int guess = 0;
int count = 0;
System.out.println(mm + " , (16,32)
");
do {
System.out.println(" :\t");
try {
guess = scanner.nextInt();
} catch (Exception e) {
return;
}
if (guess < mm)
System.out.println(" !
");
if (guess > mm)
System.out.println(" !
");
if (guess == mm)
System.out.println(" , !
");
count = count + 1;
} while (mm != guess);
System.out.println(" :\t" + count + " ");
}
この問題に対して、みんなはどのように“速くて安定します”のはmmの年齢を推測しますか?アルゴリズムが分からない人はforループで検索しますが、この複雑さはO(n)です.アルゴリズムを知っている人は年齢規則という特徴を利用して「二分検索」を行います.この複雑さはlog 2 Nです.だから、アルゴリズムを理解することは、実際の応用においてより良い解決策をもたらすことができます.
はい、もういいです.今日は主に「デリバリー思想」を話します.
コンセプト
すでに知られている条件を利用して、特定の関係を利用して徐々に推して、最終的に結果を得るまでは、コアは常に既存の情報を利用して新しいものを導き出すことです.
二:分類
もちろん、「順押し」と「逆押し」の2種類があります.
条件から結果を出す.
逆推:結果から条件を出す.
ほほほ、感じのが1種のpolicemanが事件を解決する感じがあるのではありませんか?
例を挙げます
<1>順推しの例
大学に行ったことがある人なら、有名な「フィボナッチ」の数を知っていますよね.ウサギの繁殖問題を言います.
もし1対のウサギが毎月1対のウサギを生むことができるならば、それが生まれた後の第3ヶ月ごとに1対の小さいウサギを生むことができて、1対の初誕生の小さいウサギから始まるならば、1年後にできます.
ウサギはどれぐらい繁殖しますか?
考え方:実はこの問題はウサギを「1月のウサギ」「2月のウサギ」「3月のウサギ」に分けることができます.
①初期時: ペア1月のウサギのサイズは、合計1対です.
②最初の月: 1月のウサギは2月のウサギになります.総数はまだ1対です.
③二ヶ月目: 2月の大きなウサギは3月のウサギになり、つがいのうさぎを繁殖させました.総数は2対です.
④第三ヶ月: 3月の大きなウサギtmdのペアが生まれました.先月の1月に大きなウサギが2月のウサギになりました.総数は3対です.
...... ......
F 0=1
F 1=1
F 2=F 0+F 1
F 3=F 1+F 2
......
Fn=Fn-2+Fn-1
みんなは見てみて、体現していますか?「推す」の核心の思想を手渡して、コードもとても簡単です.
@Test
public void feibonaqie() {
int month = 12;
int[] f = new int[month];
f[0] = 1;
f[1] = 1;
for (int i = 2; i < month; i++) {
f[i] = f[i - 2] + f[i - 1];
}
for (int i = 0; i < month; i++) {
System.out.println(" " + i + " , :" + f[i]);
}
}
テスト結果:
0 , :1
1 , :1
2 , :2
3 , :3
4 , :5
5 , :8
6 , :13
7 , :21
8 , :34
9 , :55
10 , :89
11 , :144
<2>逆押しの例
このお金の問題について、息子の四年間の大学生活にお金を預けています.富三代は毎月三キロしか取れません.来月の生活費として、ゼロ貯金の方式を採用しています.
年利率は1.71%ですが、富二世代は一回でいくら預け入れますか?
考え方:このテーマは結果が分かりました.逆推進条件が必要です. 第48月富三代は利子を持って三kを取りに行きます.
第47月預金は:(48ヶ月目の預金+3000)/(1+0.0171/12(月));
第46月預金は:(47ヶ月目の預金+3000)/(1+0.0171/12(月));
..... .....
1ヶ月目の預金は次の通りです. (2ヶ月目の預金+3000)/(1+0.0171/12(月))
@Test
public void deposit() {
int month = 49;
double[] f = new double[month];
f[48] = 3000d;
double monthRate = 1.71 / 100 / 12;
for (int i = 47; i > 0; i--) {
f[i] = (f[i + 1] + 3000) / (1 + monthRate);
}
for (int i = 48; i > 0; i--) {
System.out.println(" " + i + " , :" + f[i]);
}
}
48 , :3000.0
47 , :5991.462166412862
46 , :8978.667565132548
45 , :11961.622253421421
44 , :14940.332279922532
43 , :17914.803684671875
42 , :20885.04249911064
41 , :23851.054746097452
40 , :26812.846439920566
39 , :29770.423586310073
38 , :32723.792182450085
37 , :35672.95821699087
36 , :38617.92767006103
35 , :41558.706513279605
34 , :44495.300709768184
33 , :47427.716214163
32 , :50355.958972627006
31 , :53280.03492286193
30 , :56199.94999412031
29 , :59115.71010721753
28 , :62027.3211745438
27 , :64934.789100076196
26 , :67838.11977939056
25 , :70737.31909967352
24 , :73632.3929397344
23 , :76523.34717001712
22 , :79410.18765261215
21 , :82292.92024126834
20 , :85171.55078140483
19 , :88046.0851101229
18 , :90916.5290562178
17 , :93782.88844019052
16 , :96645.1690742597
15 , :99503.37676237331
14 , :102357.5173002205
13 , :105207.59647524328
12 , :108053.6200666483
11 , :110895.59384541858
10 , :113733.52357432517
9 , :116567.41500793885
8 , :119397.27389264184
7 , :122223.10596663937
6 , :125044.91695997141
5 , :127862.71259452422
4 , :130676.49858404195
3 , :133486.2806341383
2 , :136292.064442308
1 , :139093.85569793844