Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Balanced Binary Tree #30

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

Balanced Binary Tree #30

wants to merge 1 commit into from

Conversation

rihib
Copy link
Owner

@rihib rihib commented Sep 3, 2024

Balanced Binary Treeを解きました。レビューをお願い致します。

問題:https://leetcode.com/problems/balanced-binary-tree/
言語:Go

すでに解いている方々:
Kitaken0107/GrindEasy#16
colorbox/leetcode#13
NobukiFukui/Grind75-ProgrammingTraining#19
Mike0121/LeetCode#4

値渡しについて

Go Decisionsに下記のように書かれている通り、大きなサイズの構造体や、小さいサイズの構造体だがサイズが大きくなるものでない限り、単に数バイト節約するためにポインタを渡すのは良くない。

参照渡しでは、複数のスコープから参照されることからヒープ上にデータが確保されるため、その結果、GCがそのメモリを追跡し、不要になったタイミングで解放する必要が出てくる。GCはそれなりに重いので、パフォーマンスが悪くなる。

一方、値渡しの場合、特に小さなデータ構造やプリミティブ型では、スタック上で処理されることが多い。スタックのメモリ管理はスコープから外れたときに自動的に解放されるため、GCの介入が必要なく、処理が軽くなる。

もちろん、大きなデータ構造や頻繁なコピーが発生する場合は、参照渡しの方が適しているケースもあるため、常に値渡しが優れているわけではない。

Do not pass pointers as function arguments just to save a few bytes. If a function reads its argument x only as *x throughout, then the argument shouldn’t be a pointer. Common instances of this include passing a pointer to a string (*string) or a pointer to an interface value (*io.Reader). In both cases, the value itself is a fixed size and can be passed directly.

This advice does not apply to large structs, or even small structs that may increase in size. In particular, protocol buffer messages should generally be handled by pointer rather than by value. The pointer type satisfies the proto.Message interface (accepted by proto.Marshal, protocmp.Transform, etc.), and protocol buffer messages can be quite large and often grow larger over time.
https://google.github.io/styleguide/go/decisions#pass-values

@oda
Copy link

oda commented Sep 6, 2024

大きなサイズの構造体や、小さいサイズの構造体だがサイズが大きくなるものでない限り、単に数バイト節約するためにポインタを渡すのは良くないらしい。

GC がそれなりに重いからだろうと思いますね。

if root == nil {
return treeBalance{true, 0}
}
left, right := checkBalanceStep3(root.Left), checkBalanceStep3(root.Right)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

私は、この , 代入は好まないですねー。

}
left, right := checkBalanceStep3(root.Left), checkBalanceStep3(root.Right)
isBalanced := left.isBalanced && right.isBalanced &&
math.Abs(float64(left.height-right.height)) <= 1.0
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

math.Abs(float64()) <= 1 も整数のまま処理したいですね。一回変数を別にいれておいて、-1と1と比較するだけですから。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants