From 68402a601f93e4ba1c3fdd9cac60e7be2d52ff37 Mon Sep 17 00:00:00 2001 From: shintaroyoshida20 Date: Thu, 24 Apr 2025 22:28:08 +0900 Subject: [PATCH 1/7] feat : #16 add the empty markdown file for creating a PR --- tree/random-pick-with-weight/answer.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tree/random-pick-with-weight/answer.md diff --git a/tree/random-pick-with-weight/answer.md b/tree/random-pick-with-weight/answer.md new file mode 100644 index 0000000..418b4f8 --- /dev/null +++ b/tree/random-pick-with-weight/answer.md @@ -0,0 +1,22 @@ +# 528. Random Pick with Weight + +## STEP1 + +```javascript +``` + +## STEP2 + +```javascript +``` + +## STEP3 + +```javascript +``` + +## 感想 + +### コメント集を読んで + +## その他の解法 From c6bc14969ad462b0f08573d71175148aedee7b27 Mon Sep 17 00:00:00 2001 From: shintaroyoshida20 Date: Wed, 30 Apr 2025 22:40:17 +0900 Subject: [PATCH 2/7] feat : #16 add the STEP1 --- tree/random-pick-with-weight/answer.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tree/random-pick-with-weight/answer.md b/tree/random-pick-with-weight/answer.md index 418b4f8..ba7f23f 100644 --- a/tree/random-pick-with-weight/answer.md +++ b/tree/random-pick-with-weight/answer.md @@ -3,6 +3,27 @@ ## STEP1 ```javascript +const Solution = function(w) { + this.cum_sum_weights = [0] + let sum = 0 + for (const weight_i of w) { + sum += weight_i + } + for (let i=0; i Date: Thu, 1 May 2025 23:15:08 +0900 Subject: [PATCH 3/7] feat : add the step 2 --- tree/random-pick-with-weight/answer.md | 42 +++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/tree/random-pick-with-weight/answer.md b/tree/random-pick-with-weight/answer.md index ba7f23f..0edfa9a 100644 --- a/tree/random-pick-with-weight/answer.md +++ b/tree/random-pick-with-weight/answer.md @@ -2,6 +2,16 @@ ## STEP1 +* 発想 + * 重み付きの確率を行う方法。 + * 0から1までに、 + +* 詰まったところ + * `for (const i in w)` というfor in 文を使った際に、iにstringが帰ってくることを忘れており、 + numberを返すべきところをstringで返してしまっていた。 + +### 線形探索を用いた方法 + ```javascript const Solution = function(w) { this.cum_sum_weights = [0] @@ -10,7 +20,7 @@ const Solution = function(w) { sum += weight_i } for (let i=0; i Date: Fri, 2 May 2025 22:50:05 +0900 Subject: [PATCH 4/7] feat : #16 add the STEP3 --- tree/random-pick-with-weight/answer.md | 105 ++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 4 deletions(-) diff --git a/tree/random-pick-with-weight/answer.md b/tree/random-pick-with-weight/answer.md index 0edfa9a..0581236 100644 --- a/tree/random-pick-with-weight/answer.md +++ b/tree/random-pick-with-weight/answer.md @@ -1,10 +1,13 @@ # 528. Random Pick with Weight +* 703. Kth Larget Element in a Streamの関連問題がDiscordにあったので、 + Arai60の途中で解いてみました。 + ## STEP1 * 発想 * 重み付きの確率を行う方法。 - * 0から1までに、 + * `w_0`, `w_1`, `w_2`, ...を`w_0`/sum, `w_1`/sum, `w_2`/sum, ...に割り算をして累積和をとり、0から1のランダムな値がどの重みに属するかを調べることで、重みを考慮したサンプリングできそう。 * 詰まったところ * `for (const i in w)` というfor in 文を使った際に、iにstringが帰ってくることを忘れており、 @@ -39,19 +42,54 @@ Solution.prototype.pickIndex = function() { ### 二分探索を用いた方法 ```javascript +const Solution = function(w) { + let sum = 0 + for (const weight_i of w) { + sum += weight_i + } + this.cum_sum_weights = [] + this.cum_sum_weights.push(0) + for (let i=0; i Date: Fri, 2 May 2025 22:51:17 +0900 Subject: [PATCH 5/7] feat : #16 add the STEP3 --- tree/random-pick-with-weight/answer.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tree/random-pick-with-weight/answer.md b/tree/random-pick-with-weight/answer.md index 0581236..d0f6d1b 100644 --- a/tree/random-pick-with-weight/answer.md +++ b/tree/random-pick-with-weight/answer.md @@ -159,10 +159,23 @@ Solution.prototype.pickIndex = function() { ## その他の解法 * 二分探索のターゲットを変更する。 - * 見つけたいターゲット: i-1番目の累積和 <= `random_value` < i番目の累積和となるiの値 + * 見つけたいターゲット: i-1番目の累積和 <= `random_value` < i番目の累積和となるiの値 (先ほどは、 i-1 < `random_value` <= iで等号の場所を変更した) * while文の引き継ぎの条件: ターゲットはleft以上で、right以下であること。 ```javascript +const Solution = function(w) { + let sum = 0 + for (const weight_i of w) { + sum += weight_i + } + + this.cum_sum_weights = [] + this.cum_sum_weights.push(0) + for (let i=0; i Date: Fri, 2 May 2025 22:55:05 +0900 Subject: [PATCH 6/7] feat : #16 add the STEP3 --- tree/random-pick-with-weight/answer.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tree/random-pick-with-weight/answer.md b/tree/random-pick-with-weight/answer.md index d0f6d1b..8c81017 100644 --- a/tree/random-pick-with-weight/answer.md +++ b/tree/random-pick-with-weight/answer.md @@ -7,7 +7,8 @@ * 発想 * 重み付きの確率を行う方法。 - * `w_0`, `w_1`, `w_2`, ...を`w_0`/sum, `w_1`/sum, `w_2`/sum, ...に割り算をして累積和をとり、0から1のランダムな値がどの重みに属するかを調べることで、重みを考慮したサンプリングできそう。 + * `w_0`, `w_1`, `w_2`, ...をsumで割り算し`w_0`/sum, `w_1`/sum, `w_2`/sum, ...とした後に、累積和をとる。 + 0から1のランダムな値がどの重みに属するかを調べることで、重みを考慮したサンプリングできそう。 * 詰まったところ * `for (const i in w)` というfor in 文を使った際に、iにstringが帰ってくることを忘れており、 From 66436575947ecf22a18d44c9b3e4886989283bea Mon Sep 17 00:00:00 2001 From: shintaroyoshida20 Date: Tue, 6 May 2025 09:00:30 +0900 Subject: [PATCH 7/7] feat : #16 address the review comments and add the new solution --- tree/random-pick-with-weight/answer.md | 70 ++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/tree/random-pick-with-weight/answer.md b/tree/random-pick-with-weight/answer.md index 8c81017..b28b967 100644 --- a/tree/random-pick-with-weight/answer.md +++ b/tree/random-pick-with-weight/answer.md @@ -192,3 +192,73 @@ Solution.prototype.pickIndex = function() { return left - 1 }; ``` + +## レビューを受けて + +### レビュー (1) 浮動小数点と整数の違い + +```javascript +const Solution = function(w) { + let sum = 0 + for (const weight_i of w) { + sum += weight_i + } + + this.cum_sum_weights = [] + this.cum_sum_weights.push(0) + for (let i=0; i