計算する値の大小比較を効率的に行う

大小比較を効率的に行う

要約

単調増加・単調減少関数が最も最後に評価されるときは省略できる。

ユークリッドノルム(ノルム - 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)
}

コメント

タイトルとURLをコピーしました