From dbeda60d49f820462d898d57e19e5c7e79dae35b Mon Sep 17 00:00:00 2001 From: chvmvd Date: Mon, 2 Jan 2023 23:04:24 +0900 Subject: [PATCH 1/2] Rename folders --- docs/02advanced/{05monte-carlo => 06monte-carlo}/index.mdx | 0 .../binary-search-algorithm.drawio.svg | 0 .../binary-search.drawio.svg | 0 .../{06search-algorithm => 07search-algorithm}/index.mdx | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename docs/02advanced/{05monte-carlo => 06monte-carlo}/index.mdx (100%) rename docs/02advanced/{06search-algorithm => 07search-algorithm}/binary-search-algorithm.drawio.svg (100%) rename docs/02advanced/{06search-algorithm => 07search-algorithm}/binary-search.drawio.svg (100%) rename docs/02advanced/{06search-algorithm => 07search-algorithm}/index.mdx (100%) diff --git a/docs/02advanced/05monte-carlo/index.mdx b/docs/02advanced/06monte-carlo/index.mdx similarity index 100% rename from docs/02advanced/05monte-carlo/index.mdx rename to docs/02advanced/06monte-carlo/index.mdx diff --git a/docs/02advanced/06search-algorithm/binary-search-algorithm.drawio.svg b/docs/02advanced/07search-algorithm/binary-search-algorithm.drawio.svg similarity index 100% rename from docs/02advanced/06search-algorithm/binary-search-algorithm.drawio.svg rename to docs/02advanced/07search-algorithm/binary-search-algorithm.drawio.svg diff --git a/docs/02advanced/06search-algorithm/binary-search.drawio.svg b/docs/02advanced/07search-algorithm/binary-search.drawio.svg similarity index 100% rename from docs/02advanced/06search-algorithm/binary-search.drawio.svg rename to docs/02advanced/07search-algorithm/binary-search.drawio.svg diff --git a/docs/02advanced/06search-algorithm/index.mdx b/docs/02advanced/07search-algorithm/index.mdx similarity index 100% rename from docs/02advanced/06search-algorithm/index.mdx rename to docs/02advanced/07search-algorithm/index.mdx From 87af24bd85e5bbf84461b67a4a36e646abab2802 Mon Sep 17 00:00:00 2001 From: chvmvd Date: Tue, 3 Jan 2023 13:27:59 +0900 Subject: [PATCH 2/2] Add order article --- docs/02advanced/05order/index.mdx | 106 ++++++++++++++++++++++++++++++ static/order/example1.ipynb | 31 +++++++++ static/order/example2.ipynb | 32 +++++++++ static/order/exercise1.ipynb | 35 ++++++++++ static/order/exercise2.ipynb | 32 +++++++++ static/order/exercise3.ipynb | 28 ++++++++ 6 files changed, 264 insertions(+) create mode 100644 docs/02advanced/05order/index.mdx create mode 100644 static/order/example1.ipynb create mode 100644 static/order/example2.ipynb create mode 100644 static/order/exercise1.ipynb create mode 100644 static/order/exercise2.ipynb create mode 100644 static/order/exercise3.ipynb diff --git a/docs/02advanced/05order/index.mdx b/docs/02advanced/05order/index.mdx new file mode 100644 index 000000000..bc7daf5b6 --- /dev/null +++ b/docs/02advanced/05order/index.mdx @@ -0,0 +1,106 @@ +--- +sidebar_position: 5 +--- + +import ViewSource from "@site/src/components/ViewSource"; +import Answer from "@site/src/components/Answer"; + +# 計算量 + +ここでは、計算量について学んでいきます。 + +## 計算量とは + +計算量とは、アルゴリズムの実行に要する計算資源の量です。 + +計算量には、大きく時間計算量と空間計算量の2つがあります。 + +時間計算量は、アルゴリズムの実行に要するステップの数です。 + +空間計算量は、アルゴリズムの実行に要する記憶容量の数です。 + +## 計算量オーダー + +ここで、計算量を比較することを考えてみましょう。 + +例えば、次の 2 つのプログラムを考えてみましょう。 + + + + + +$n = 2$ なら、2 番目のプログラムは、1 番目のプログラムの 2 倍の計算が必要です。 +しかし、$n = 10000$ なら、2 番目のプログラムは、1 番目のプログラムの 10000 倍の計算が必要です。 +$n = 2$ 程度なら計算量の差はほとんどありませんが、$n$ の値が大きくなると非常に大きな差が生まれてきます。 + +このように、アルゴリズムを比較するときには、入力サイズ $n$ が大きい時にどうなるのかを考えることが大切になります。 +そのため、計算量を比較するときには、入力サイズ $n$ に対する関数を比較します。 +1 番目のプログラムでは、$n$ 回、2 番目のプログラムでは、$n^2$ 回の計算が必要と考えます。 + +また、$n$ が十分大きいときには、$n$ と $n^2$ には大きな差が生じますが、$2n^2$ や $n^2 + n$ と $n^2$ の間にはほとんど違いがありません。このため、定数倍は無視し、最高次数以外の項も考えません。 + +## ランダウの記号 + +計算量を表すのには、ランダウの記号が便利です。 + +ランダウの記号は、$n$ が非常に大きい時の計算量を表します。 +例えば、$n$ 回のステップが必要な時には、$O(n)$ と表します。 + +1. 最高次以外の項は、無視します。例: $n^2 + n + 1 = O(n^2)$ +1. 係数は無視します。例: $3n^2 = O(n^2)$ + +## 各オーダーの比較 + +それぞれのオーダーを比較してみましょう。Python では、1 秒で $10^7$ 回ぐらいの計算ができます。$10^7$ 回を超えたところは、「-」で表します。 + +| データサイズ | $O(1)$ | $O(\log n)$ | $O(n)$ | $O(n\log n)$ | $O(n^2)$ | $O(n^3)$ | $O(2^n)$ | $O(n!)$ | +| ------------ | ------ | ----------- | -------- | ------------ | -------- | -------- | -------- | ------- | +| 5 | 1 | 3 | 5 | 12 | 25 | 125 | 32 | 120 | +| 10 | 1 | 4 | 10 | 34 | 100 | 1000 | 1024 | 3628822 | +| 20 | 1 | 5 | 20 | 87 | 400 | 8000 | 1048576 | - | +| 50 | 1 | 6 | 50 | 283 | 2500 | 125000 | - | - | +| 100 | 1 | 7 | 100 | 665 | 10000 | 1000000 | - | - | +| 1000 | 1 | 10 | 1000 | 9966 | 1000000 | - | - | - | +| $10^4$ | 1 | 14 | 10000 | 132878 | - | - | - | - | +| $10^5$ | 1 | 17 | 100000 | 1660965 | - | - | - | - | +| $10^6$ | 1 | 20 | 1000000 | - | - | - | - | - | +| $10^7$ | 1 | 24 | 10000000 | - | - | - | - | - | +| $10^8$ | 1 | 27 | - | - | - | - | - | - | +| $10^9$ | 1 | 30 | - | - | - | - | - | - | +| $10^10$ | 1 | 34 | - | - | - | - | - | - | + +## 練習問題 1 + +次のプログラムの計算量を求めてください。 + + + + + +for 文の中が `n` 回繰り返されるので、$O(n)$ となります。 + + + +## 練習問題 2 + +次のプログラムの計算量を求めてください。 + + + + + +こちらも for 文の中がデータ数を $n$ とすると、 $n$ 回繰り返されるので、$O(n)$となります。 + + + +## 練習問題 2 + +次のプログラムの計算量を求めてください。 + + + + + +処理自体は一回しか行われないので、$O(1)$となります。 + + diff --git a/static/order/example1.ipynb b/static/order/example1.ipynb new file mode 100644 index 000000000..be96c3066 --- /dev/null +++ b/static/order/example1.ipynb @@ -0,0 +1,31 @@ +{ + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, + "cells": [ + { + "metadata": {}, + "source": [ + "def calc_sum(n):\n", + " s = 0\n", + " for i in range(1, n + 1):\n", + " s += i\n", + " return s\n", + "\n", + "\n", + "print(calc_sum(10))" + ], + "cell_type": "code", + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "55\n" + ] + } + ], + "execution_count": null + } + ] +} diff --git a/static/order/example2.ipynb b/static/order/example2.ipynb new file mode 100644 index 000000000..67e1cbd7f --- /dev/null +++ b/static/order/example2.ipynb @@ -0,0 +1,32 @@ +{ + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, + "cells": [ + { + "metadata": {}, + "source": [ + "def calc_sum_square(n):\n", + " s = 0\n", + " for i in range(1, n + 1):\n", + " for j in range(1, n + 1):\n", + " s += i * j\n", + " return s\n", + "\n", + "\n", + "print(calc_sum_square(10))" + ], + "cell_type": "code", + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "3025\n" + ] + } + ], + "execution_count": null + } + ] +} diff --git a/static/order/exercise1.ipynb b/static/order/exercise1.ipynb new file mode 100644 index 000000000..b4f543879 --- /dev/null +++ b/static/order/exercise1.ipynb @@ -0,0 +1,35 @@ +{ + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, + "cells": [ + { + "metadata": {}, + "source": [ + "n = 10\n", + "for i in range(n):\n", + " print(i)" + ], + "cell_type": "code", + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n" + ] + } + ], + "execution_count": null + } + ] +} diff --git a/static/order/exercise2.ipynb b/static/order/exercise2.ipynb new file mode 100644 index 000000000..dc5c56ce9 --- /dev/null +++ b/static/order/exercise2.ipynb @@ -0,0 +1,32 @@ +{ + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, + "cells": [ + { + "metadata": {}, + "source": [ + "def calc_max(data):\n", + " max_val = data[0]\n", + " for i in range(1, len(data)):\n", + " if max_val < data[i]:\n", + " max_val = data[i]\n", + " return max_val\n", + "\n", + "\n", + "print(calc_max([1, 4, 3, 5, 2]))" + ], + "cell_type": "code", + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "5\n" + ] + } + ], + "execution_count": null + } + ] +} diff --git a/static/order/exercise3.ipynb b/static/order/exercise3.ipynb new file mode 100644 index 000000000..32673e0f1 --- /dev/null +++ b/static/order/exercise3.ipynb @@ -0,0 +1,28 @@ +{ + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, + "cells": [ + { + "metadata": {}, + "source": [ + "def calc_square(n):\n", + " return n**2\n", + "\n", + "\n", + "print(calc_square(9))" + ], + "cell_type": "code", + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "81\n" + ] + } + ], + "execution_count": null + } + ] +}