大小比較を効率的に行う
要約
単調増加・単調減少関数が最も最後に評価されるときは省略できる。
例
ユークリッドノルム(ノルム - Wikipedia)の比較などは、math.Sqrtはしてもしなくても結果は変わらない。 以下に座標の列から、ターゲットの座標に最も近い座標を探し表示する例を示す:
// 座標
type Point struct {
x, y int
}
func main() {
...
points := readPoints()
targetPoint := readTargetPoint()
var nearestPoint Point
nearestValue := 1e5
for _, p := range points {
// ちょっと遅い
// diff := math.Sqrt(
// math.Pow(targetPoint.x-p.x, 2) +
// math.Pow(targetPoint.y-p.y, 2))
// これで十分。
diff := math.Pow(targetPoint.x-p.x, 2) +
math.Pow(targetPoint.y-p.y, 2)
if diff < nearestValue {
// より近い値を見つけたら更新。
nearestPoint = p
nearestValue = diff
}
}
// 最も近い座標を表示
fmt.Println(nearestPoint)
}
コメント