亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用排序從切片的間隔中獲取最大值和最小值

使用排序從切片的間隔中獲取最大值和最小值

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 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號