为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
红颜莎娜 2022-09-19 10:36:01
我在操场上有这个代码。我使用排序从切片/数组中获取最大值和最小值。当我需要以x个周期的间隔获取值时,问题就开始了。如果你运行代码,你将在最后一次打印有一个值1.0407,但是x周期之前不再有这个值,这个值离x的周期很远。所以我的问题是,他为什么偷看这个值?而min没有。package mainimport (    "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 workfunc 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 worksfunc 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}去
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

发生的情况是,切片是对后备数组的引用,排序会就地对切片进行排序。这意味着对排序的调用。Float64s实际上是在修改(排序)x切片的内容(更准确地说,是x的子切片,但支持数组是相同的)。


正如我在上面的评论中提到的,仅仅使用排序来查找最小值/最大值不是一个好主意,因为它会比扫描最小值/最大值的简单循环慢。但是,如果您真的想使用它,则需要在将这些切片进行排序之前制作这些切片的深层副本。漂浮64s。


关于上述代码的小注意事项:如果所有元素都是负数,或者如果它们都是NaN,则您的MaxMin函数并不是真正正确的。您可能希望执行类似操作:https://godbolt.org/z/E5e5q7ePa(未经过测试)。


func MinMax(n []float64) (min float64, max float64) {

    min, max = math.NaN(), math.NaN()

    for _, e := range n {

        if e < min || (math.IsNaN(min) && !math.IsNaN(e)) {

            min = e

        }

        if e > max || (math.IsNaN(max) && !math.IsNaN(e)) {

            max = e

        }

    }

    return

}


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信