📖 アルゴリズムイントロダクション 第3版 総合版:世界標準MIT教科書 Kindle版
「 プログラムを 1命令 実行するのにかかる時間を 1μs(マイクロ秒) としようぜ?」
「 1秒は 1000ミリ秒。
1ミリ秒は 1000マイクロ秒だぜ」
「 じゃあ 1秒は 1,000,000(百万)マイクロ秒 だな」
「 コンピューターって 1秒間に 100万命令も 計算できるもんなの?」
「 1 MIPS (Million Instructions Per Second) というやつだな」
「 じゃあ、時間を t で与えるから、 何 n まで処理できるか計算しろだぜ」
「 lg 1,000,000
かなあ。 Wolfram alpha で計算すると 6
」
「 1秒ってことは、1マイクロ秒の 100万倍の命令を実行できるってことじゃないの?」
「 じゃあ n は 100万固定でいいんじゃないか? 定数な」
「 100万命令と、 処理速度の違うマシンスペックと、 処理時間が 問題として与えられたわけかだぜ」
「 うーん、こう? あれっ、 100万命令って どこから来たんだぜ?」
「 👆 1秒あって マシンスペックが nマイクロ秒なら、 処理件数は 1,000,000 だろ。ここは埋まる」
「 👆 数学チャンネルによると、上式の n を求めろって ことらしいわよ」
「 じゃあ お父んは 何もせず 数学チャンネルに問題を解いてもらおうぜ?」
「 ↑ いや、 434294.4……だぜ。 お父んは 黙ってろだぜ」
import math
# log2 は 終わらない(^~^)
# ("log2 n", lambda n:math.log2(n)),
# sqrt も終わらない(^~^)
# ("√n", lambda n:math.sqrt(n)),
test_cases = [
("n", lambda n: n),
("n log2 n", lambda n:n*math.log2(n)),
("n^2", lambda n:n**2),
("n^3", lambda n:n**3),
("2^n", lambda n:2**n),
("n!", lambda n:math.factorial(n))]
# 制限時間(単位:秒)
time_required_list = [1.0]
for test_case in test_cases:
for t in time_required_list:
# 処理件数
n = 1 # 0 開始は無理(^~^)
while True:
if t < (test_case[1](n))/1_000_000:
break
n += 1
print(
f"{t} 秒で 1,000,000個処理できるマシンの性能が {test_case[0]:>8} になると、{t} 秒では {n-1:>7}個 処理するので精一杯だぜ(^q^)")
1.0 秒で 1,000,000個処理できるマシンの性能が n になると、1.0 秒では 1000000個 処理するので精一杯だぜ(^q^)
1.0 秒で 1,000,000個処理できるマシンの性能が n log2 n になると、1.0 秒では 62746個 処理するので精一杯だぜ(^q^)
1.0 秒で 1,000,000個処理できるマシンの性能が n^2 になると、1.0 秒では 1000個 処理するので精一杯だぜ(^q^)
1.0 秒で 1,000,000個処理できるマシンの性能が n^3 になると、1.0 秒では 100個 処理するので精一杯だぜ(^q^)
1.0 秒で 1,000,000個処理できるマシンの性能が 2^n になると、1.0 秒では 19個 処理するので精一杯だぜ(^q^)
1.0 秒で 1,000,000個処理できるマシンの性能が n! になると、1.0 秒では 9個 処理するので精一杯だぜ(^q^)
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!