11{
2- "cells" : [
3- {
4- "cell_type" : " markdown" ,
5- "id" : " 2aa72022" ,
6- "metadata" : {},
7- "source" : [
8- " # TypeScript Sleep関数実装\n " ,
9- " \n " ,
10- " ## 1. 問題の分析\n " ,
11- " \n " ,
12- " ### 競技プログラミング視点での分析\n " ,
13- " - **実行速度**: 非同期処理の仕組み上、実行速度は`setTimeout`のブラウザ/Node.jsエンジンの実装に依存\n " ,
14- " - **メモリ使用量**: Promise1つとタイマーIDのみで、O(1)の極小メモリ\n " ,
15- " - **最適化ポイント**: シンプルな実装が最速(余計な処理を追加しない)\n " ,
16- " \n " ,
17- " ### 業務開発視点での分析\n " ,
18- " - **型安全性**: `millis`が正の整数であることの保証、Promise型の明示\n " ,
19- " - **エラーハンドリング**: 不正な入力値(負の数、0、非数値)への対応\n " ,
20- " - **保守性**: 明確な関数シグネチャとドキュメント\n " ,
21- " - **可読性**: 非同期処理の意図が明確\n " ,
22- " \n " ,
23- " ### TypeScript特有の考慮点\n " ,
24- " - **型推論**: `Promise<void>`の明示的な型定義\n " ,
25- " - **strict mode**: nullチェック、型安全性の確保\n " ,
26- " - **async/await**: Promiseラッパーの簡潔な記述\n " ,
27- " - **型ガード**: 実行時の入力検証\n " ,
28- " \n " ,
29- " ## 2. アルゴリズムアプローチ比較\n " ,
30- " \n " ,
31- " | アプローチ | 時間計算量 | 空間計算量 | TS実装コスト | 型安全性 | 可読性 | 備考 |\n " ,
32- " |---------|---------|--------|----------|--------|-------|------|\n " ,
33- " | setTimeout + Promise | O(1) | O(1) | 低 | 高 | 高 | 標準的で最適 |\n " ,
34- " | setInterval + clearInterval | O(1) | O(1) | 中 | 中 | 低 | 不要な複雑性 |\n " ,
35- " | busy wait (while loop) | O(n) | O(1) | 低 | 高 | 低 | CPU使用率100%で非推奨 |\n " ,
36- " | Promise.race + setTimeout | O(1) | O(1) | 中 | 中 | 中 | 過剰設計 |\n " ,
37- " \n " ,
38- " ## 3. 選択したアルゴリズムと理由\n " ,
39- " \n " ,
40- " ### 選択したアプローチ\n " ,
41- " **setTimeout + Promise wrapper**\n " ,
42- " \n " ,
43- " ### 理由\n " ,
44- " - **計算量的な優位性**: O(1)の時間・空間計算量で最適\n " ,
45- " - **TypeScript環境での型安全性**: Promise型の明確な定義が可能\n " ,
46- " - **保守性・可読性**: 非同期処理の標準パターンで理解しやすい\n " ,
47- " - **実装の単純性**: コード行数が最小で、バグの混入リスクが低い\n " ,
48- " \n " ,
49- " ### TypeScript特有の最適化ポイント\n " ,
50- " - **型推論の活用**: `Promise<void>`で戻り値の型を明示\n " ,
51- " - **readonly修飾子**: 入力値の不変性を保証(必要に応じて)\n " ,
52- " - **strict nullチェック**: 実行時エラーの防止\n " ,
53- " - **エラー型の明示**: TypeErrorによる型レベルでのエラー情報\n " ,
54- " \n " ,
55- " ## 4. 実装コード\n " ,
56- " \n " ,
57- " ```typescript\n " ,
58- " // Analyze Complexity\n " ,
59- " // Runtime 45 ms\n " ,
60- " // Beats 55.94%\n " ,
61- " // Memory 53.75 MB\n " ,
62- " // Beats 88.64%\n " ,
63- " /**\n " ,
64- " * 指定されたミリ秒数だけ非同期に待機する関数\n " ,
65- " * \n " ,
66- " * @param millis - 待機するミリ秒数(正の整数)\n " ,
67- " * @returns void を解決するPromise\n " ,
68- " * @throws {TypeError} millis が数値でない場合\n " ,
69- " * @throws {RangeError} millis が範囲外(1-1000)の場合\n " ,
70- " * @complexity Time: O(1), Space: O(1)\n " ,
71- " * \n " ,
72- " * @example\n " ,
73- " * const start = Date.now();\n " ,
74- " * await sleep(100);\n " ,
75- " * console.log(Date.now() - start); // ~100\n " ,
76- " */\n " ,
77- " async function sleep(millis: number): Promise<void> {\n " ,
78- " // 型ガード: 数値チェック\n " ,
79- " if (typeof millis !== 'number' || Number.isNaN(millis)) {\n " ,
80- " throw new TypeError('millis must be a valid number');\n " ,
81- " }\n " ,
82- " \n " ,
83- " // 範囲チェック(制約条件: 1 <= millis <= 1000 )\n " ,
84- " if (millis < 1 || millis > 1000 ) {\n " ,
85- " throw new RangeError('millis must be between 1 and 1000 ');\n " ,
86- " }\n " ,
87- " \n " ,
88- " // 整数チェック(正の整数要件 )\n " ,
89- " if (!Number.isInteger( millis) ) {\n " ,
90- " throw new RangeError('millis must be an integer ');\n " ,
91- " }\n " ,
92- " \n " ,
93- " // Promise でラップした setTimeout による非同期待機\n " ,
94- " return new Promise<void>((resolve) => {\n " ,
95- " setTimeout(resolve, millis);\n " ,
96- " });\n " ,
97- " }\n " ,
98- " ```\n " ,
99- " \n " ,
100- " ### LeetCode提出用の最小実装\n " ,
101- " \n " ,
102- " 問題の制約条件が保証されている場合、エラーハンドリングを省略した最小実装:\n " ,
103- " \n " ,
104- " ```typescript\n " ,
105- " // Analyze Complexity\n " ,
106- " // Runtime 47 ms\n " ,
107- " // Beats 42.89%\n " ,
108- " // Memory 55.27 MB\n " ,
109- " // Beats 37.58%\n " ,
110- " async function sleep(millis: number): Promise<void> {\n " ,
111- " return new Promise<void>((resolve) => {\n " ,
112- " setTimeout(resolve, millis);\n " ,
113- " });\n " ,
114- " }\n " ,
115- " ```\n " ,
116- " \n " ,
117- " ## TypeScript固有の最適化観点\n " ,
118- " \n " ,
119- " ### 型安全性の活用\n " ,
120- " \n " ,
121- " 1. **コンパイル時エラー防止**\n " ,
122- " - `Promise<void>`の明示的な型定義により、戻り値の誤用を防止\n " ,
123- " - `millis: number`により、文字列などの不正な型の渡し込みを防止\n " ,
124- " \n " ,
125- " 2. **実行時型チェック**\n " ,
126- " - `typeof`および`Number.isNaN`による実行時検証\n " ,
127- " - `Number.isInteger`による整数チェック\n " ,
128- " \n " ,
129- " 3. **エラー型の明示**\n " ,
130- " - `TypeError`: 型の不一致\n " ,
131- " - `RangeError`: 値の範囲外\n " ,
132- " \n " ,
133- " ### パフォーマンス特性\n " ,
134- " \n " ,
135- " - **時間計算量**: O(1) - 定数時間での処理完了\n " ,
136- " - **空間計算量**: O(1) - Promise1つとタイマーIDのみ\n " ,
137- " - **実行時オーバーヘッド**: 最小限(Promiseラッパーのみ)\n " ,
138- " \n " ,
139- " ### 開発効率と保守性\n " ,
140- " \n " ,
141- " - **IntelliSense**: 型定義により引数と戻り値が自動補完\n " ,
142- " - **リファクタリング安全性**: 型チェックにより変更時のエラーを検出\n " ,
143- " - **ドキュメント**: JSDocコメントによる使用方法の明示\n " ,
144- " - **テスタビリティ**: async/awaitにより同期的なテストコードが記述可能"
145- ]
146- }
147- ],
148- "metadata" : {
149- "language_info" : {
150- "name" : " python "
151- }
152- },
153- "nbformat" : 4 ,
154- "nbformat_minor" : 5
155- }
2+ "cells" : [
3+ {
4+ "cell_type" : " markdown" ,
5+ "id" : " 2aa72022" ,
6+ "metadata" : {},
7+ "source" : [
8+ " # TypeScript Sleep関数実装\n " ,
9+ " \n " ,
10+ " ## 1. 問題の分析\n " ,
11+ " \n " ,
12+ " ### 競技プログラミング視点での分析\n " ,
13+ " - **実行速度**: 非同期処理の仕組み上、実行速度は`setTimeout`のブラウザ/Node.jsエンジンの実装に依存\n " ,
14+ " - **メモリ使用量**: Promise1つとタイマーIDのみで、O(1)の極小メモリ\n " ,
15+ " - **最適化ポイント**: シンプルな実装が最速(余計な処理を追加しない)\n " ,
16+ " \n " ,
17+ " ### 業務開発視点での分析\n " ,
18+ " - **型安全性**: `millis`が正の整数であることの保証、Promise型の明示\n " ,
19+ " - **エラーハンドリング**: 不正な入力値(負の数、0、非数値)への対応\n " ,
20+ " - **保守性**: 明確な関数シグネチャとドキュメント\n " ,
21+ " - **可読性**: 非同期処理の意図が明確\n " ,
22+ " \n " ,
23+ " ### TypeScript特有の考慮点\n " ,
24+ " - **型推論**: `Promise<void>`の明示的な型定義\n " ,
25+ " - **strict mode**: nullチェック、型安全性の確保\n " ,
26+ " - **async/await**: Promiseラッパーの簡潔な記述\n " ,
27+ " - **型ガード**: 実行時の入力検証\n " ,
28+ " \n " ,
29+ " ## 2. アルゴリズムアプローチ比較\n " ,
30+ " \n " ,
31+ " | アプローチ | 時間計算量 | 空間計算量 | TS実装コスト | 型安全性 | 可読性 | 備考 |\n " ,
32+ " |---------|---------|--------|----------|--------|-------|------|\n " ,
33+ " | setTimeout + Promise | O(1) | O(1) | 低 | 高 | 高 | 標準的で最適 |\n " ,
34+ " | setInterval + clearInterval | O(1) | O(1) | 中 | 中 | 低 | 不要な複雑性 |\n " ,
35+ " | busy wait (while loop) | O(n) | O(1) | 低 | 高 | 低 | CPU使用率100%で非推奨 |\n " ,
36+ " | Promise.race + setTimeout | O(1) | O(1) | 中 | 中 | 中 | 過剰設計 |\n " ,
37+ " \n " ,
38+ " ## 3. 選択したアルゴリズムと理由\n " ,
39+ " \n " ,
40+ " ### 選択したアプローチ\n " ,
41+ " **setTimeout + Promise wrapper**\n " ,
42+ " \n " ,
43+ " ### 理由\n " ,
44+ " - **計算量的な優位性**: O(1)の時間・空間計算量で最適\n " ,
45+ " - **TypeScript環境での型安全性**: Promise型の明確な定義が可能\n " ,
46+ " - **保守性・可読性**: 非同期処理の標準パターンで理解しやすい\n " ,
47+ " - **実装の単純性**: コード行数が最小で、バグの混入リスクが低い\n " ,
48+ " \n " ,
49+ " ### TypeScript特有の最適化ポイント\n " ,
50+ " - **型推論の活用**: `Promise<void>`で戻り値の型を明示\n " ,
51+ " - **readonly修飾子**: 入力値の不変性を保証(必要に応じて)\n " ,
52+ " - **strict nullチェック**: 実行時エラーの防止\n " ,
53+ " - **エラー型の明示**: TypeErrorによる型レベルでのエラー情報\n " ,
54+ " \n " ,
55+ " ## 4. 実装コード\n " ,
56+ " \n " ,
57+ " ```typescript\n " ,
58+ " // Analyze Complexity\n " ,
59+ " // Runtime 45 ms\n " ,
60+ " // Beats 55.94%\n " ,
61+ " // Memory 53.75 MB\n " ,
62+ " // Beats 88.64%\n " ,
63+ " /**\n " ,
64+ " * 指定されたミリ秒数だけ非同期に待機する関数\n " ,
65+ " * \n " ,
66+ " * @param millis - 待機するミリ秒数(正の整数)\n " ,
67+ " * @returns void を解決するPromise\n " ,
68+ " * @throws {TypeError} millis が数値でない場合\n " ,
69+ " * @throws {RangeError} millis が範囲外(1-1000)の場合\n " ,
70+ " * @complexity Time: O(1), Space: O(1)\n " ,
71+ " * \n " ,
72+ " * @example\n " ,
73+ " * const start = Date.now();\n " ,
74+ " * await sleep(100);\n " ,
75+ " * console.log(Date.now() - start); // ~100\n " ,
76+ " */\n " ,
77+ " async function sleep(millis: number): Promise<void> {\n " ,
78+ " // 型ガード: 数値チェック\n " ,
79+ " if (typeof millis !== 'number' || Number.isNaN(millis)) {\n " ,
80+ " throw new TypeError('millis must be a valid number');\n " ,
81+ " }\n " ,
82+ " \n " ,
83+ " // 整数チェック(正の整数要件 )\n " ,
84+ " if (!Number.isInteger( millis) ) {\n " ,
85+ " throw new RangeError('millis must be an integer ');\n " ,
86+ " }\n " ,
87+ " \n " ,
88+ " // 範囲チェック(制約条件: 1 <= millis <= 1000 )\n " ,
89+ " if (millis < 1 || millis > 1000 ) {\n " ,
90+ " throw new RangeError('millis must be between 1 and 1000 ');\n " ,
91+ " }\n " ,
92+ " \n " ,
93+ " // Promise でラップした setTimeout による非同期待機\n " ,
94+ " return new Promise<void>((resolve) => {\n " ,
95+ " setTimeout(resolve, millis);\n " ,
96+ " });\n " ,
97+ " }\n " ,
98+ " ```\n " ,
99+ " \n " ,
100+ " ### LeetCode提出用の最小実装\n " ,
101+ " \n " ,
102+ " 問題の制約条件が保証されている場合、エラーハンドリングを省略した最小実装:\n " ,
103+ " \n " ,
104+ " ```typescript\n " ,
105+ " // Analyze Complexity\n " ,
106+ " // Runtime 47 ms\n " ,
107+ " // Beats 42.89%\n " ,
108+ " // Memory 55.27 MB\n " ,
109+ " // Beats 37.58%\n " ,
110+ " async function sleep(millis: number): Promise<void> {\n " ,
111+ " return new Promise<void>((resolve) => {\n " ,
112+ " setTimeout(resolve, millis);\n " ,
113+ " });\n " ,
114+ " }\n " ,
115+ " ```\n " ,
116+ " \n " ,
117+ " ## TypeScript固有の最適化観点\n " ,
118+ " \n " ,
119+ " ### 型安全性の活用\n " ,
120+ " \n " ,
121+ " 1. **コンパイル時エラー防止**\n " ,
122+ " - `Promise<void>`の明示的な型定義により、戻り値の誤用を防止\n " ,
123+ " - `millis: number`により、文字列などの不正な型の渡し込みを防止\n " ,
124+ " \n " ,
125+ " 2. **実行時型チェック**\n " ,
126+ " - `typeof`および`Number.isNaN`による実行時検証\n " ,
127+ " - `Number.isInteger`による整数チェック\n " ,
128+ " \n " ,
129+ " 3. **エラー型の明示**\n " ,
130+ " - `TypeError`: 型の不一致\n " ,
131+ " - `RangeError`: 値の範囲外\n " ,
132+ " \n " ,
133+ " ### パフォーマンス特性\n " ,
134+ " \n " ,
135+ " - **時間計算量**: O(1) - 定数時間での処理完了\n " ,
136+ " - **空間計算量**: O(1) - Promise1つとタイマーIDのみ\n " ,
137+ " - **実行時オーバーヘッド**: 最小限(Promiseラッパーのみ)\n " ,
138+ " \n " ,
139+ " ### 開発効率と保守性\n " ,
140+ " \n " ,
141+ " - **IntelliSense**: 型定義により引数と戻り値が自動補完\n " ,
142+ " - **リファクタリング安全性**: 型チェックにより変更時のエラーを検出\n " ,
143+ " - **ドキュメント**: JSDocコメントによる使用方法の明示\n " ,
144+ " - **テスタビリティ**: async/awaitにより同期的なテストコードが記述可能"
145+ ]
146+ }
147+ ],
148+ "metadata" : {
149+ "language_info" : {
150+ "name" : " typescript "
151+ }
152+ },
153+ "nbformat" : 4 ,
154+ "nbformat_minor" : 5
155+ }
0 commit comments