108 convert sorted array to binary search tree#24
108 convert sorted array to binary search tree#24kitano-kazuki wants to merge 5 commits intomainfrom
Conversation
| * rootを返す | ||
| * 計算量を考える | ||
| * 計算量をT(N)とする | ||
| * T(N) = T(N/2) + T(N/2) = T(N / 2^2) + ... + T(N / 2^2) |
There was a problem hiding this comment.
[fyi] 細かい話ですが、rootノードの作成や部分配列の中央値へのアクセスなど定数時間の処理が含まれるため、漸化式は以下のようになります。
最終的なオーダー
となり(
There was a problem hiding this comment.
Oだからざっくりでいいだろうとしていましたが, 厳密に考えると引っかかる点が多そうでしたね。
今後気をつけて使用するようにします。ありがとうございます。
There was a problem hiding this comment.
細かい話は必要な時に引き出しから出せればよいと思います。
見積もりなので、意識的にどこを捨ててるかを分かれば良いのではないでしょうか。
| right_nums = nums[mid_idx + 1:] | ||
| root_node.left = self.sortedArrayToBST(left_nums) | ||
| root_node.right = self.sortedArrayToBST(right_nums) | ||
| return root_node |
There was a problem hiding this comment.
「ルートノードの左右の子を一旦仮り置き(None)で作ります。部下に仕事を渡します。結果からルートノードの左右の子を上書きして返します。」
よりかは、
「部下に作成をお願いした木の根を左右の子に、中央値を値にしたノードを根として作成して返します。」
の方が個人的にはわかりやすいと思います
return TreeNode(
val=nums[mid_index],
left=self.sortedArrayToBST(nums[:mid_index],
right=self.sortedArrayToBST(nums[mid_index + 1:],
)一つの関心に関係するものがあつまっているほうが、理解するのに必要なワーキングメモリが少なくなるからなんでしょうね。
もちろん集めて肥大化したら理解しにくくなるので、トレードオフを見ることも必要ではあると思います。
There was a problem hiding this comment.
left_nums, right_nums を使ってもいいと思います。上はスマホで打ったので横着しました
There was a problem hiding this comment.
自分もそちらの方がわかりやすいと思いました。
| class Solution: | ||
| def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: | ||
| root = TreeNode() | ||
| frontier = [(0, len(nums) - 1, root)] |
There was a problem hiding this comment.
frontier は幅優先探索で未探索の最前線のノードの集合を表す際に使うように思います。深さ優先探索ではあまり使わない印象があります。
There was a problem hiding this comment.
横から失礼します。深さ優先探索でもfrontierを使用している例はあるようで、個人的にはこのままで良いのではないかと思います。
https://github.com/aimacode/aima-python/blob/master/search.py#L206
| # self.right = right | ||
| class Solution: | ||
| def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: | ||
| def sortedArrayToBST_with_range(nums, left, right): |
There was a problem hiding this comment.
loweCamel と lower_snake が混ざっている点に違和感を感じました。自分なら build 等、シンプルな関数名を付けると思います。
| mid_idx = len(nums) // 2 | ||
| root_node = TreeNode(nums[mid_idx]) | ||
| left_nums = nums[:mid_idx] | ||
| right_nums = nums[mid_idx + 1:] |
There was a problem hiding this comment.
PEP8 によると、スライスを作るとき、 + 演算子の両側にはスペースを空けないことになっているようです。
https://peps.python.org/pep-0008/#pet-peeves
なお、このスタイルガイドは“唯一の正解”というわけではなく、数あるガイドラインの一つに過ぎません。チームによって重視される書き方や慣習も異なります。そのため、ご自身の中に基準を持ちつつも、最終的にはチームの一般的な書き方に合わせることをお勧めします。
https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/description/