Skip to content

Commit 86d2144

Browse files
authored
Merge pull request #163 from chvmvd/add-order-article
Add order article
2 parents 78b7239 + 87af24b commit 86d2144

File tree

10 files changed

+264
-0
lines changed

10 files changed

+264
-0
lines changed

docs/02advanced/05order/index.mdx

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
---
2+
sidebar_position: 5
3+
---
4+
5+
import ViewSource from "@site/src/components/ViewSource";
6+
import Answer from "@site/src/components/Answer";
7+
8+
# 計算量
9+
10+
ここでは、計算量について学んでいきます。
11+
12+
## 計算量とは
13+
14+
計算量とは、アルゴリズムの実行に要する計算資源の量です。
15+
16+
計算量には、大きく時間計算量と空間計算量の2つがあります。
17+
18+
時間計算量は、アルゴリズムの実行に要するステップの数です。
19+
20+
空間計算量は、アルゴリズムの実行に要する記憶容量の数です。
21+
22+
## 計算量オーダー
23+
24+
ここで、計算量を比較することを考えてみましょう。
25+
26+
例えば、次の 2 つのプログラムを考えてみましょう。
27+
28+
<ViewSource path="/order/example1.ipynb" />
29+
30+
<ViewSource path="/order/example2.ipynb" />
31+
32+
$n = 2$ なら、2 番目のプログラムは、1 番目のプログラムの 2 倍の計算が必要です。
33+
しかし、$n = 10000$ なら、2 番目のプログラムは、1 番目のプログラムの 10000 倍の計算が必要です。
34+
$n = 2$ 程度なら計算量の差はほとんどありませんが、$n$ の値が大きくなると非常に大きな差が生まれてきます。
35+
36+
このように、アルゴリズムを比較するときには、入力サイズ $n$ が大きい時にどうなるのかを考えることが大切になります。
37+
そのため、計算量を比較するときには、入力サイズ $n$ に対する関数を比較します。
38+
1 番目のプログラムでは、$n$ 回、2 番目のプログラムでは、$n^2$ 回の計算が必要と考えます。
39+
40+
また、$n$ が十分大きいときには、$n$ と $n^2$ には大きな差が生じますが、$2n^2$ や $n^2 + n$ と $n^2$ の間にはほとんど違いがありません。このため、定数倍は無視し、最高次数以外の項も考えません。
41+
42+
## ランダウの記号
43+
44+
計算量を表すのには、ランダウの記号が便利です。
45+
46+
ランダウの記号は、$n$ が非常に大きい時の計算量を表します。
47+
例えば、$n$ 回のステップが必要な時には、$O(n)$ と表します。
48+
49+
1. 最高次以外の項は、無視します。例: $n^2 + n + 1 = O(n^2)$
50+
1. 係数は無視します。例: $3n^2 = O(n^2)$
51+
52+
## 各オーダーの比較
53+
54+
それぞれのオーダーを比較してみましょう。Python では、1 秒で $10^7$ 回ぐらいの計算ができます。$10^7$ 回を超えたところは、「-」で表します。
55+
56+
| データサイズ | $O(1)$ | $O(\log n)$ | $O(n)$ | $O(n\log n)$ | $O(n^2)$ | $O(n^3)$ | $O(2^n)$ | $O(n!)$ |
57+
| ------------ | ------ | ----------- | -------- | ------------ | -------- | -------- | -------- | ------- |
58+
| 5 | 1 | 3 | 5 | 12 | 25 | 125 | 32 | 120 |
59+
| 10 | 1 | 4 | 10 | 34 | 100 | 1000 | 1024 | 3628822 |
60+
| 20 | 1 | 5 | 20 | 87 | 400 | 8000 | 1048576 | - |
61+
| 50 | 1 | 6 | 50 | 283 | 2500 | 125000 | - | - |
62+
| 100 | 1 | 7 | 100 | 665 | 10000 | 1000000 | - | - |
63+
| 1000 | 1 | 10 | 1000 | 9966 | 1000000 | - | - | - |
64+
| $10^4$ | 1 | 14 | 10000 | 132878 | - | - | - | - |
65+
| $10^5$ | 1 | 17 | 100000 | 1660965 | - | - | - | - |
66+
| $10^6$ | 1 | 20 | 1000000 | - | - | - | - | - |
67+
| $10^7$ | 1 | 24 | 10000000 | - | - | - | - | - |
68+
| $10^8$ | 1 | 27 | - | - | - | - | - | - |
69+
| $10^9$ | 1 | 30 | - | - | - | - | - | - |
70+
| $10^10$ | 1 | 34 | - | - | - | - | - | - |
71+
72+
## 練習問題 1
73+
74+
次のプログラムの計算量を求めてください。
75+
76+
<ViewSource path="/order/exercise1.ipynb" />
77+
78+
<Answer>
79+
80+
for 文の中が `n` 回繰り返されるので、$O(n)$ となります。
81+
82+
</Answer>
83+
84+
## 練習問題 2
85+
86+
次のプログラムの計算量を求めてください。
87+
88+
<ViewSource path="/order/exercise2.ipynb" />
89+
90+
<Answer>
91+
92+
こちらも for 文の中がデータ数を $n$ とすると、 $n$ 回繰り返されるので、$O(n)$となります。
93+
94+
</Answer>
95+
96+
## 練習問題 2
97+
98+
次のプログラムの計算量を求めてください。
99+
100+
<ViewSource path="/order/exercise3.ipynb" />
101+
102+
<Answer>
103+
104+
処理自体は一回しか行われないので、$O(1)$となります。
105+
106+
</Answer>
File renamed without changes.
File renamed without changes.

static/order/example1.ipynb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"nbformat": 4,
3+
"nbformat_minor": 2,
4+
"metadata": {},
5+
"cells": [
6+
{
7+
"metadata": {},
8+
"source": [
9+
"def calc_sum(n):\n",
10+
" s = 0\n",
11+
" for i in range(1, n + 1):\n",
12+
" s += i\n",
13+
" return s\n",
14+
"\n",
15+
"\n",
16+
"print(calc_sum(10))"
17+
],
18+
"cell_type": "code",
19+
"outputs": [
20+
{
21+
"output_type": "stream",
22+
"name": "stdout",
23+
"text": [
24+
"55\n"
25+
]
26+
}
27+
],
28+
"execution_count": null
29+
}
30+
]
31+
}

static/order/example2.ipynb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"nbformat": 4,
3+
"nbformat_minor": 2,
4+
"metadata": {},
5+
"cells": [
6+
{
7+
"metadata": {},
8+
"source": [
9+
"def calc_sum_square(n):\n",
10+
" s = 0\n",
11+
" for i in range(1, n + 1):\n",
12+
" for j in range(1, n + 1):\n",
13+
" s += i * j\n",
14+
" return s\n",
15+
"\n",
16+
"\n",
17+
"print(calc_sum_square(10))"
18+
],
19+
"cell_type": "code",
20+
"outputs": [
21+
{
22+
"output_type": "stream",
23+
"name": "stdout",
24+
"text": [
25+
"3025\n"
26+
]
27+
}
28+
],
29+
"execution_count": null
30+
}
31+
]
32+
}

static/order/exercise1.ipynb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"nbformat": 4,
3+
"nbformat_minor": 2,
4+
"metadata": {},
5+
"cells": [
6+
{
7+
"metadata": {},
8+
"source": [
9+
"n = 10\n",
10+
"for i in range(n):\n",
11+
" print(i)"
12+
],
13+
"cell_type": "code",
14+
"outputs": [
15+
{
16+
"output_type": "stream",
17+
"name": "stdout",
18+
"text": [
19+
"0\n",
20+
"1\n",
21+
"2\n",
22+
"3\n",
23+
"4\n",
24+
"5\n",
25+
"6\n",
26+
"7\n",
27+
"8\n",
28+
"9\n"
29+
]
30+
}
31+
],
32+
"execution_count": null
33+
}
34+
]
35+
}

static/order/exercise2.ipynb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"nbformat": 4,
3+
"nbformat_minor": 2,
4+
"metadata": {},
5+
"cells": [
6+
{
7+
"metadata": {},
8+
"source": [
9+
"def calc_max(data):\n",
10+
" max_val = data[0]\n",
11+
" for i in range(1, len(data)):\n",
12+
" if max_val < data[i]:\n",
13+
" max_val = data[i]\n",
14+
" return max_val\n",
15+
"\n",
16+
"\n",
17+
"print(calc_max([1, 4, 3, 5, 2]))"
18+
],
19+
"cell_type": "code",
20+
"outputs": [
21+
{
22+
"output_type": "stream",
23+
"name": "stdout",
24+
"text": [
25+
"5\n"
26+
]
27+
}
28+
],
29+
"execution_count": null
30+
}
31+
]
32+
}

static/order/exercise3.ipynb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"nbformat": 4,
3+
"nbformat_minor": 2,
4+
"metadata": {},
5+
"cells": [
6+
{
7+
"metadata": {},
8+
"source": [
9+
"def calc_square(n):\n",
10+
" return n**2\n",
11+
"\n",
12+
"\n",
13+
"print(calc_square(9))"
14+
],
15+
"cell_type": "code",
16+
"outputs": [
17+
{
18+
"output_type": "stream",
19+
"name": "stdout",
20+
"text": [
21+
"81\n"
22+
]
23+
}
24+
],
25+
"execution_count": null
26+
}
27+
]
28+
}

0 commit comments

Comments
 (0)