rabbit-slide-Piro-readable-code-workshop-2022-08-04-performance 2022.08.04

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6d9a00a9415e33fd59505e098d1ab42b91c5ac23db295c039a9c76fa0fc1b0ad
4
+ data.tar.gz: 1342bd0c700bdbfbeb10929092cd8349e78e52404adb701aba8004b77f66cded
5
+ SHA512:
6
+ metadata.gz: 03fb94c05950f1aea0002b3b830ab3f5effd19bbceb848927b19119c2295fc19eb84f03780fcdc83e4fcb9605fed46f466330a54fade4ff9fa1c3a2b16c0753d
7
+ data.tar.gz: 56aef32470adc0118b66274e2f332c881f404b3d88c5c9538abc9c25791c175b9ba9107a73b57941ce62bc7b5892d562504e8f64037388fe28d038a3e954b101
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ performance.rab
data/README.rd ADDED
@@ -0,0 +1,32 @@
1
+ = プログラムの計算量と実行性能について
2
+
3
+ 2022-08-04開催のリーダブルコード演習の予習としての、プログラムの実行性能の話。
4
+
5
+ == ライセンス
6
+
7
+ CC BY-SA 4.0
8
+
9
+ 原著作者名は以下の通りです。
10
+
11
+ * 株式会社クリアコード
12
+
13
+ == 作者向け
14
+
15
+ === 表示
16
+
17
+ rake
18
+
19
+ === 公開
20
+
21
+ rake publish
22
+
23
+ == 閲覧者向け
24
+
25
+ === インストール
26
+
27
+ gem install rabbit-slide-piroor-readable-code-workshop-2022-08-04-performance
28
+
29
+ === 表示
30
+
31
+ rabbit rabbit-slide-piroor-readable-code-workshop-2022-08-04-performance.gem
32
+
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ spec.files += Dir.glob("images/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ spec.add_runtime_dependency("rabbit-theme-clear-code")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
data/config.yaml ADDED
@@ -0,0 +1,22 @@
1
+ ---
2
+ id: readable-code-workshop-2022-08-04-performance
3
+ base_name: summary
4
+ tags:
5
+ - rabbit
6
+ - readable-code
7
+ presentation_date: 2022-08-04
8
+ version: 2022.08.04
9
+ licenses:
10
+ - CC BY-SA 4.0
11
+ slideshare_id: readable-code-workshop-2022-08-04-performance
12
+ speaker_deck_id:
13
+ ustream_id:
14
+ vimeo_id:
15
+ youtube_id:
16
+ author:
17
+ markup_language: :rd
18
+ name: YUKI Hiroshi
19
+ email: yuki@clear-code.com
20
+ rubygems_user: Piro
21
+ slideshare_user: pirooutsiderreflex
22
+ speaker_deck_user: piroor
Binary file
Binary file
Binary file
Binary file
Binary file
data/performance.rab ADDED
@@ -0,0 +1,692 @@
1
+ = プログラムの計算量と実行性能について
2
+
3
+ : author
4
+ 結城洋志
5
+ : institution
6
+ 株式会社クリアコード
7
+ : content-source
8
+ リーダブルコード演習
9
+ : date
10
+ 2022-08-04
11
+ : allotted-time
12
+ 90m
13
+ : theme
14
+ clear-code
15
+
16
+ == ノート
17
+
18
+ TODO:次回やるのであれば、サンプルコードはPythonで書くようにする。
19
+ (学生さんはPythonはカリキュラムの中で学ばれているため、JSより浸透している)
20
+
21
+ = 講師紹介
22
+
23
+ (('tag:center'))(('tag:margin-bottom * 2'))
24
+ 結城洋志(ゆうき ひろし)\n
25
+ aka Piro
26
+
27
+ * 株式会社クリアコード所属
28
+ * FirefoxやThunderbirdの\n
29
+ 法人サポートに従事
30
+ * トラブルの原因や対策を探るため\n
31
+ ソースコードを調査することが多い
32
+
33
+ == ノート
34
+
35
+ Mozilla FirefoxはWebブラウザー。
36
+ Mozilla Thunderbirdはメールクライアント。
37
+
38
+ 開発元のMozillaは、企業ユーザーからのトラブル問い合わせなどに回答するサービスは提供していない。
39
+ そのため、クリアコードのような事業者が、ある意味で勝手にサポートサービスを行っている。
40
+
41
+ Firefoxで特定のサービスの動作が遅い、といった問い合わせを受ける
42
+
43
+
44
+ = アジェンダ
45
+
46
+ * プログラムの実行性能に\n
47
+ 影響する要素について
48
+ * 計算量について
49
+ * 実際に確かめてみる
50
+
51
+
52
+ = プログラムは「軽い」「速い」方がいい
53
+
54
+ = 「軽い」「速い」とは?
55
+
56
+ * ((*目的が素早く達成される*))\n
57
+ 例:データ変換プログラム
58
+ * 同じ時間で多くの件数のデータを\n
59
+ 変換できる
60
+ * データを1件変換する所要時間が短い
61
+
62
+ = 性能の指標と測定方法
63
+
64
+ * 他の方の講義で詳しく\n
65
+ 扱われるそうなので\n
66
+ 割愛
67
+
68
+ = 性能に影響する要素
69
+
70
+ * 外部要因
71
+ * 通信待ち
72
+ * ディスクアクセス待ち\n
73
+ (('note:など'))
74
+ * 内部要因
75
+ * ((*計算量*))
76
+
77
+ = 計算量
78
+
79
+ 実行される処理の\n
80
+ ((*回数の大小*))
81
+
82
+ = 例
83
+
84
+ 「データを10件取得する」
85
+
86
+ = 1件ずつ取得する
87
+
88
+ SELECT * FROM table OFFSET 0 LIMIT 1;
89
+ SELECT * FROM table OFFSET 1 LIMIT 1;
90
+ ...
91
+ SELECT * FROM table OFFSET 8 LIMIT 1;
92
+ SELECT * FROM table OFFSET 9 LIMIT 1;
93
+
94
+ →処理の実行回数は((*10回*))
95
+
96
+ == ノート
97
+
98
+ これは「計算量が10」と言える。
99
+
100
+ = 10件まとめて取得する
101
+
102
+ SELECT * FROM table OFFSET 0 LIMIT 10;
103
+
104
+ →処理の実行回数は((*1回*))
105
+
106
+ == ノート
107
+
108
+ これは「計算量が1」と言える。
109
+
110
+ = 計算量は少ない方がいい!
111
+
112
+
113
+ = アルゴリズム(1/3)
114
+
115
+ * 計算量は((*計算方法*))で決まる
116
+ * 計算(処理)方法=((*アルゴリズム*))
117
+ * ((*より少ない計算量*))で同じ結果を\n
118
+ 得られる\n
119
+ =より優秀なアルゴリズム
120
+
121
+ = アルゴリズム(2/3)
122
+
123
+ * データ件数が増えれば\n
124
+ 計算量も増える(('note:(ことが多い)'))
125
+ * データの件数の増加度合いに対して\n
126
+ ((*計算量の増加度合いが小さい*))\n
127
+ =より優秀なアルゴリズム
128
+
129
+ = こういうのよりは
130
+
131
+ # image
132
+ # src = images/graph-ONfactorial.png
133
+ # relative_width = 90
134
+
135
+ == プロパティー
136
+
137
+ : enable-title-on-image
138
+ false
139
+
140
+ = こういうのの方が嬉しい
141
+
142
+ # image
143
+ # src = images/graph-ON2.png
144
+ # relative_width = 90
145
+
146
+ == プロパティー
147
+
148
+ : enable-title-on-image
149
+ false
150
+
151
+ = こうだとなお嬉しい
152
+
153
+ # image
154
+ # src = images/graph-O1.png
155
+ # relative_width = 90
156
+
157
+ == プロパティー
158
+
159
+ : enable-title-on-image
160
+ false
161
+
162
+ = アルゴリズム(3/3)
163
+
164
+ * 計算量は、((*実行しなくても*))\n
165
+ アルゴリズムから見積もれる
166
+
167
+ == ノート
168
+
169
+ これはとても大事な性質。
170
+ 遅いアルゴリズムは、コードを見ただけで「これは遅い」と分かる。
171
+ 1時間で終わると思ったら、実際動かしてみたら1日かかりました、といったことを避けられる。
172
+
173
+ = どうやって見積もる?
174
+
175
+ = 計算量の見積もり方・表し方
176
+
177
+ * Ο記法(オーダー)
178
+ * O(1)
179
+ * O(N)
180
+ * O(N^2)
181
+ * O(N!)
182
+ * O(logN)
183
+
184
+ = O(1):定数時間
185
+
186
+ // 色の名前とカラーコードのデータ(ハッシュ構造)
187
+ const COLOR_CODE_BY_NAME = {
188
+ blue: 0x0000FF,
189
+ green: 0x00FF00,
190
+ red: 0xFF0000,
191
+ yellow: 0xFFFF00,
192
+ };
193
+ // 色の名前でカラーコードを特定する
194
+ let color = COLOR_CODE_BY_NAME['red'];
195
+ console.log(color); // => 0xFF0000
196
+
197
+ == ノート
198
+
199
+ データ件数にかかわらず一定の速度で結果が出る。
200
+ 最速のアルゴリズム。
201
+
202
+ = O(1):定数時間
203
+
204
+ # image
205
+ # src = images/graph-O1.png
206
+ # relative_width = 90
207
+
208
+ == プロパティー
209
+
210
+ : enable-title-on-image
211
+ false
212
+
213
+ = O(N):線形関数
214
+
215
+ // 色の名前とカラーコードのデータ(配列構造)
216
+ const COLOR_CODES = [
217
+ { name: 'blue', code: 0x0000FF },
218
+ { name: 'green', code: 0x00FF00 },
219
+ { name: 'red', code: 0xFF0000 },
220
+ { name: 'yellow', code: 0xFFFF00 },
221
+ ];
222
+ // 色の名前でカラーコードを特定する
223
+ let color;
224
+ for (const item of COLOR_CODES) {
225
+ if (item.name == 'red') {
226
+ color = item.code;
227
+ break;
228
+ }
229
+ }
230
+ console.log(color); // => 0xFF0000
231
+
232
+ == ノート
233
+
234
+ 計算量がデータ件数に正比例する。
235
+ (最悪の場合は全データを1回ずつ処理するため。)
236
+
237
+ = O(N):線形関数
238
+
239
+ # image
240
+ # src = images/graph-ON.png
241
+ # relative_width = 90
242
+
243
+ == プロパティー
244
+
245
+ : enable-title-on-image
246
+ false
247
+
248
+ = ループを使ってなくても安心できない
249
+
250
+ [a,b,c,d,e].indexOf(c) // => 2
251
+
252
+ [a,b,c,d,e].includes(c) // => true
253
+
254
+ = メソッドの中身が線形関数な場合がある(1/2)
255
+
256
+ function indexOf() {
257
+ const items = [a,b,c,d,e];
258
+ for (let i = 0; i < items.length; i++) {
259
+ if (item == c) {
260
+ return i; // => 2
261
+ }
262
+ }
263
+ return -1;
264
+ }
265
+
266
+ = メソッドの中身が線形関数な場合がある(2/2)
267
+
268
+ function includes() {
269
+ const items = [a,b,c,d,e];
270
+ for (let i = 0; i < items.length; i++) {
271
+ if (item == c) {
272
+ return true; // => 2
273
+ }
274
+ }
275
+ return false;
276
+ }
277
+
278
+
279
+ = O(N^2):二乗時間
280
+
281
+ // 重複を含む配列
282
+ const duplicated = [
283
+ 0,1,2,3,2,1,4,3,4,5,6,7,5,6,4,8,9,5,3,2
284
+ ];
285
+ // 重複を取り除いた配列
286
+ const unique = [];
287
+ for (const duplicatedItem of duplicated) {
288
+ let included = false;
289
+ for (const uniqueItem of unique) {
290
+ if (uniqueItem == duplicatedItem) {
291
+ included = true;
292
+ break;
293
+ }
294
+ }
295
+ if (!included)
296
+ unique.push(duplicatedItem);
297
+ }
298
+ console.log(unique); // => [0,1,2,3,4,5,6,7,8,9]
299
+
300
+ == ノート
301
+
302
+ データ件数の増加に対し、計算量の増加がいわゆる指数関数的な増加を見せる。
303
+ パスワードの総当たりの場合、O(n^文字数)となる。
304
+
305
+ = O(N^2):二乗時間
306
+
307
+ # image
308
+ # src = images/graph-ON2.png
309
+ # relative_width = 90
310
+
311
+ == プロパティー
312
+
313
+ : enable-title-on-image
314
+ false
315
+
316
+ = ループを使ってなくても安心できない
317
+
318
+ * メソッドの中身が(以下略)
319
+
320
+ = O(logN):対数
321
+
322
+ // 検索対象の配列(ソート済み)
323
+ const values = [0, 3, 6, 9, 12, 70, 102];
324
+ // 特定の値が何番目にあるかを二分探索で調べる
325
+ const target = 12;
326
+ let index = -1;
327
+ let minIndex = 0;
328
+ let maxIndex = values.length - 1;
329
+ while (minIndex <= maxIndex) {
330
+ let middleIndex = Math.floor((minIndex + maxIndex) / 2);
331
+ if (values[middleIndex] == target) {
332
+ index = middleIndex;
333
+ break;
334
+ }
335
+ else if (values[middleIndex] < target)
336
+ minIndex = middleIndex + 1;
337
+ else
338
+ maxIndex = middleIndex - 1;
339
+ }
340
+ console.log(index); // => 4
341
+
342
+ == ノート
343
+
344
+ コードは https://tech-blog.s-yoshiki.com/entry/195 の物を加工して掲載した。
345
+ データ件数の増加割合に対して計算量の増加割合が少ない。
346
+ データ件数の増加に対して、計算量の増加が緩やか。
347
+
348
+ = O(logN):対数
349
+
350
+ # image
351
+ # src = images/graph-OlogN.png
352
+ # relative_width = 90
353
+
354
+ == プロパティー
355
+
356
+ : enable-title-on-image
357
+ false
358
+
359
+
360
+ = O(N!):階乗関数(1/3)
361
+
362
+ 巡回セールスマン問題
363
+
364
+ // ある都市から他の都市までの移動に要する時間のデータ
365
+ const cities = {
366
+ tokyo: { osaka: 2, hokkaido: 3, okinawa: 4, kagawa: 5 },
367
+ osaka: { tokyo: 2, hokkaido: 5, okinawa: 3, kagawa: 1 },
368
+ hokkaido: { tokyo: 3, osaka: 5, okinawa: 7, kagawa: 6 },
369
+ okinawa: { tokyo: 4, osaka: 3, hokkaido: 7, kagawa: 8 },
370
+ kagawa: { tokyo: 5, osaka: 1, okinawa: 8, hokkaido: 6 },
371
+ };
372
+
373
+ == ノート
374
+
375
+ 各都市と、各都市間の移動に要する時間。
376
+ ここから、移動時間が最短になる巡回ルートを求めたい。
377
+ こういう計算を「巡回セールスマン問題」と呼ぶ。
378
+
379
+ = O(N!):階乗関数(2/3)
380
+
381
+ // 配列から順列組み合わせを作る処理
382
+ function getPermutations(array) {
383
+ const permutations = [];
384
+ const nextPermutation = [];
385
+ function permutate(array) {
386
+ if (array.length === 0)
387
+ permutations.push(nextPermutation.slice());
388
+ for (let i = 0; i < array.length; i++) {
389
+ array.push(array.shift());
390
+ nextPermutation.push(array[0]);
391
+ permutate(array.slice(1));
392
+ nextPermutation.pop();
393
+ }
394
+ }
395
+ permutate(array);
396
+ return permutations;
397
+ }
398
+
399
+ == ノート
400
+
401
+ 組み合わせを列挙する関数。
402
+ Original version is: get-permutations npm module made by Jan Järfalk
403
+ Licensed: ISC
404
+ https://github.com/janjarfalk/get-permutations
405
+
406
+ = O(N!):階乗関数(3/3)
407
+
408
+ // 総当たりで移動時間を求めて、最短の移動パターンを見つける
409
+ const results = [];
410
+ for (const start of Object.keys(cities)) {
411
+ const patterns = getPermutations(
412
+ Object.keys(cities).filter(dest => dest != start)
413
+ );
414
+ for (const pattern of patterns) {
415
+ let last;
416
+ let total = 0;
417
+ const route = [start, ...pattern, start];
418
+ for (const current of route) {
419
+ if (last)
420
+ total += cities[last][current];
421
+ last = current;
422
+ }
423
+ results.push({ route: route.join('-'), total });
424
+ }
425
+ }
426
+ console.log(results.length);
427
+ // => 120
428
+ results.sort((a, b) => a.total - b.total);
429
+ console.log(results[0]);
430
+ // => { route: "tokyo-hokkaido-kagawa-osaka-okinawa-tokyo", total: 17 }
431
+
432
+ == ノート
433
+
434
+ 愚直にやると、データ件数の階乗回の計算が必要になる。
435
+ ここでは、件数5で120回ループが回る。
436
+
437
+ = O(N!):階乗関数
438
+
439
+ # image
440
+ # src = images/graph-ONfactorial.png
441
+ # relative_width = 90
442
+
443
+ 7件で5040回、8件で40320回
444
+
445
+ == プロパティー
446
+
447
+ : enable-title-on-image
448
+ false
449
+
450
+ == ノート
451
+
452
+ データ件数 計算量
453
+ 1 1
454
+ 2 2
455
+ 3 6
456
+ 4 24
457
+ 5 120
458
+ 6 720
459
+ 7 5,040
460
+ 8 40,320
461
+
462
+ =  
463
+
464
+ = 計算量を減らしたい!
465
+
466
+ == ノート
467
+
468
+ 同じ結果を得られるなら、計算量は小さいに越したことはない。
469
+
470
+
471
+ = 計算量
472
+
473
+ * どういう結果を
474
+ * どういうデータから
475
+ * どのように求めるか
476
+
477
+ によって、計算量は大きく変わる
478
+
479
+ = どうすれば計算量を減らせる?
480
+
481
+ = 計算量を減らすには(1/3)
482
+
483
+ * 計算方法を変える\n
484
+ =((*アルゴリズムを工夫する*))
485
+
486
+ = 元のアルゴリズム:O(N^2)
487
+
488
+ // 重複を含む配列
489
+ const duplicated = [
490
+ 0,1,2,3,2,1,4,3,4,5,6,7,5,6,4,8,9,5,3,2
491
+ ];
492
+ // 重複を取り除いた配列
493
+ const unique = [];
494
+ for (const duplicatedItem of duplicated) {
495
+ let included = false;
496
+ for (const uniqueItem of unique) {
497
+ if (uniqueItem == duplicatedItem) {
498
+ included = true;
499
+ break;
500
+ }
501
+ }
502
+ if (!included)
503
+ unique.push(duplicatedItem);
504
+ }
505
+ console.log(unique); // => [0,1,2,3,4,5,6,7,8,9]
506
+
507
+
508
+ = アルゴリズムを変えた:O(N)
509
+
510
+ // 重複を含む配列
511
+ const duplicated = [
512
+ 0,1,2,3,2,1,4,3,4,5,6,7,5,6,4,8,9,5,3,2
513
+ ];
514
+ // 既に見つかった項目の情報
515
+ const found = {};
516
+ // 重複を取り除いた配列
517
+ const unique = [];
518
+ for (const item of duplicated) {
519
+ if (found[item])
520
+ continue;
521
+ found[item] = true;
522
+ unique.push(item);
523
+ }
524
+ console.log(unique); // => [0,1,2,3,4,5,6,7,8,9]
525
+
526
+ = ループの実行回数を減らす!
527
+
528
+ * ループせず済ませるように\n
529
+ する(('note:(O(1)に寄せる)'))
530
+ * 直近の実行結果を使い回す\n
531
+ (キャッシュ)
532
+
533
+ = アルゴリズムは色々ある
534
+
535
+ = 例:並べ替え(ソート)
536
+
537
+ * クイックソート:O(NlogN)~O(N^2)
538
+ * 結果は不安定
539
+ * バブルソート:O(N^2)
540
+ * 結果は安定
541
+ * マージソート:O(NlogN)
542
+ * 結果は安定
543
+
544
+ = それぞれアルゴリズムには得手・不得手がある
545
+
546
+ 例:
547
+
548
+ * ある程度揃ったデータだと速い
549
+ * データ件数が少ないと速い\n
550
+ (('note:など'))
551
+
552
+ 先達の知見を活かそう
553
+
554
+ =  
555
+
556
+ = 計算量を減らすには(2/3)
557
+
558
+ * データの構造の方を変える\n
559
+ =((*前加工する*))
560
+
561
+ = データ構造による制約:O(N)
562
+
563
+ // 色の名前とカラーコードのデータ(配列構造)
564
+ const COLOR_CODES = [
565
+ { name: 'blue', code: 0x0000FF },
566
+ { name: 'green', code: 0x00FF00 },
567
+ { name: 'red', code: 0xFF0000 },
568
+ { name: 'yellow', code: 0xFFFF00 },
569
+ ];
570
+ // 色の名前でカラーコードを特定する
571
+ let color;
572
+ for (const item of COLOR_CODES) {
573
+ if (item.name == 'red') {
574
+ color = item.code;
575
+ break;
576
+ }
577
+ }
578
+ console.log(color); // => 0xFF0000
579
+
580
+ == ノート
581
+
582
+ 配列構造でデータが与えられている場合、どう頑張ってもこれ以上は計算量を減らせない。
583
+
584
+ = データ構造による制約:O(1)
585
+
586
+ // 色の名前とカラーコードのデータ(ハッシュ構造)
587
+ const COLOR_CODE_BY_NAME = {
588
+ blue: 0x0000FF,
589
+ green: 0x00FF00,
590
+ red: 0xFF0000,
591
+ yellow: 0xFFFF00,
592
+ };
593
+ // 色の名前でカラーコードを特定する
594
+ let color = COLOR_CODE_BY_NAME['red'];
595
+ console.log(color); // => 0xFF0000
596
+
597
+ == ノート
598
+
599
+ 同じ意味のデータでも、構造がハッシュテーブルになっていれば、O(1)でいける。
600
+
601
+ = データ構造を変える(1/2)
602
+
603
+ // 色の名前とカラーコードのデータ(配列構造)
604
+ const COLOR_CODES = [
605
+ { name: 'blue', code: 0x0000FF },
606
+ { name: 'green', code: 0x00FF00 },
607
+ { name: 'red', code: 0xFF0000 },
608
+ { name: 'yellow', code: 0xFFFF00 },
609
+ ];
610
+
611
+ // 色名をキーにしたハッシュ構造
612
+ const COLOR_CODE_BY_NAME = {
613
+ blue: 0x0000FF,
614
+ green: 0x00FF00,
615
+ red: 0xFF0000,
616
+ yellow: 0xFFFF00,
617
+ };
618
+
619
+ = データ構造を変える(2/2)
620
+
621
+ const COLOR_CODES = [
622
+ { name: 'blue', code: 0x0000FF },
623
+ { name: 'green', code: 0x00FF00 },
624
+ { name: 'red', code: 0xFF0000 },
625
+ { name: 'yellow', code: 0xFFFF00 },
626
+ ];
627
+
628
+ const COLOR_CODE_BY_NAME = {};
629
+ for (const item of COLOR_CODES) {
630
+ COLOR_CODE_BY_NAME[item.name] = item.code;
631
+ }
632
+
633
+ = 変換のコスト
634
+
635
+ * 何回も使うなら割に合う
636
+ * 1回しか使わなくても、\n
637
+ 応答性を挙げたいときにも\n
638
+ (('note:(初期化に時間をかけてよければ)'))
639
+
640
+ = 計算量を小さくしやすいデータ構造にしよう
641
+
642
+ * 配列の全走査は基本的に遅い
643
+ * 配列は((*よく検索するキー*))で\n
644
+ ハッシュテーブルにしておく\n
645
+ (インデックス)
646
+ * 読み込んだデータはとりあえず\n
647
+ ハッシュテーブルにしがち
648
+
649
+ = 
650
+
651
+ = 計算量を減らすには(3/3)
652
+
653
+ 「求めたい結果」を変えてしまう
654
+
655
+ * 厳密な結果でなく\n
656
+ ((*近似値*))でいいことにする
657
+ * ((*制約条件*))を設ける
658
+
659
+ = 巡回セールスマン問題
660
+
661
+ * 各町を1回ずつ訪問したい
662
+ * すべての町を訪問したい
663
+ * なるべく短い時間で済ませたい
664
+
665
+ 時間が最も短く済むのは\n
666
+ どのような巡回ルートか?
667
+
668
+
669
+ = 巡回セールスマン問題なら
670
+
671
+ * 最適解を求めることを諦めて、\n
672
+ ((*現実的な計算時間の範囲で*))\n
673
+ ((*ほどほどにいい結果*))を求める
674
+ * 巡回できる町の\n
675
+ ((*最大数を制限する*))
676
+
677
+
678
+ =  
679
+
680
+ = 練習してみよう
681
+
682
+ * https://github.com\n
683
+  /clear-code\n
684
+  /readable-code-workshop\n
685
+  /tree/master/20220804\n
686
+  /0performance\n
687
+  /try.docx または try.pdf
688
+
689
+ == ノート
690
+
691
+
692
+
data/samples.pdf ADDED
Binary file
data/try.pdf ADDED
Binary file
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-Piro-readable-code-workshop-2022-08-04-performance
3
+ version: !ruby/object:Gem::Version
4
+ version: 2022.08.04
5
+ platform: ruby
6
+ authors:
7
+ - YUKI Hiroshi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-08-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: rabbit-theme-clear-code
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: 2022-08-04開催のリーダブルコード演習の予習としての、プログラムの実行性能の話。
42
+ email:
43
+ - yuki@clear-code.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".rabbit"
49
+ - README.rd
50
+ - Rakefile
51
+ - config.yaml
52
+ - images/graph-O1.png
53
+ - images/graph-ON.png
54
+ - images/graph-ON2.png
55
+ - images/graph-ONfactorial.png
56
+ - images/graph-OlogN.png
57
+ - pdf/readable-code-workshop-2022-08-04-performance-summary.pdf
58
+ - performance.rab
59
+ - samples.pdf
60
+ - try.pdf
61
+ homepage: http://slide.rabbit-shocker.org/authors/Piro/readable-code-workshop-2022-08-04-performance/
62
+ licenses:
63
+ - CC BY-SA 4.0
64
+ metadata: {}
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ requirements: []
80
+ rubyforge_project:
81
+ rubygems_version: 2.7.6
82
+ signing_key:
83
+ specification_version: 4
84
+ summary: プログラムの計算量と実行性能について
85
+ test_files: []