使用排序从切片的间隔中获取最大值和最小值

我在操场上有这个代码。我使用排序从切片/数组中获取最大值和最小值。当我需要以x个周期的间隔获取值时,问题就开始了。如果你运行代码,你将在最后一次打印有一个值1.0407,但是x周期之前不再有这个值,这个值离x的周期很远。所以我的问题是,他为什么偷看这个值?而min没有。

package main


import (

    "fmt"

    "math"

    "sort"

)


func main() {

    var period = 5

    var highest float64

    var lowest float64

    for i, v := range x {

        if i < period {

            continue

        }

        var correctHighest, correctLowest = MaxMin(x[i-period : i])

        fmt.Println("Correct -", "Price:", v, "Highest:", correctHighest, "Lowest:", correctLowest)

    }

    for i, v := range x {

        if i < period {

            continue

        }

        var correctHighest, correctLowest = MaxMin(x[i-period : i])

        fmt.Println("Correct -", "Highest:", correctHighest, "Lowest:", correctLowest)

        highest = Max(x[i-period : i]...)

        lowest = Min(x[i-period : i]...)

        fmt.Println("Price:", v, "Highest:", highest, "Lowest:", lowest)

    }

}


// Both does not work

func Max(n ...float64) float64 {

    sort.Float64s(n)

    if len(n) == 0 {

        return 0.

    }

    return n[len(n)-1]

}

func Min(n ...float64) float64 {

    sort.Float64s(n)

    if len(n) == 0 {

        return 0.

    }

    return n[0]

}


// New code that works

func MaxMin(n []float64) (float64, float64) {

    if len(n) == 0 {

        return 0., 0.

    }

    var max float64

    var min = math.MaxFloat64

    for _, value := range n {

        if value > max {

            max = value

        }

        if value < min {

            min = value

        }

    }

    return max, min

}


红颜莎娜
浏览 80回答 1
1回答

一只萌萌小番薯

发生的情况是,切片是对后备数组的引用,排序会就地对切片进行排序。这意味着对排序的调用。Float64s实际上是在修改(排序)x切片的内容(更准确地说,是x的子切片,但支持数组是相同的)。正如我在上面的评论中提到的,仅仅使用排序来查找最小值/最大值不是一个好主意,因为它会比扫描最小值/最大值的简单循环慢。但是,如果您真的想使用它,则需要在将这些切片进行排序之前制作这些切片的深层副本。漂浮64s。关于上述代码的小注意事项:如果所有元素都是负数,或者如果它们都是NaN,则您的MaxMin函数并不是真正正确的。您可能希望执行类似操作:https://godbolt.org/z/E5e5q7ePa(未经过测试)。func MinMax(n []float64) (min float64, max float64) {&nbsp; &nbsp; min, max = math.NaN(), math.NaN()&nbsp; &nbsp; for _, e := range n {&nbsp; &nbsp; &nbsp; &nbsp; if e < min || (math.IsNaN(min) && !math.IsNaN(e)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; min = e&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if e > max || (math.IsNaN(max) && !math.IsNaN(e)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; max = e&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go