【问题标题】:Racket: sliding window over a vector球拍:矢量上的滑动窗口
【发布时间】:2018-05-14 02:59:28
【问题描述】:

在 Racket 的有限序列上执行滑动窗口有哪些好方法,例如找到 4 个数字的任何子序列的最大和?

(define example #(3 1 4 5 10 23 1 50 0 12 40 12 43 20))

【问题讨论】:

    标签: scheme racket sliding-window subsequence


    【解决方案1】:

    首先找到前缀和:

    #lang racket
    (define example #(3 1 4 5 10 23 1 50 0 12 40 12 43 20))
    
    (define-values (sums sum)
      (for/fold ([sums '()] [sum 0]) ([x example])
        (values (cons sum sums) (+ sum x))))
    (list->vector (cons sum sums))
    

    结果:

    '#(224 204 161 149 109 97 97 47 46 23 13 8 4 3 0)
    

    然后……利润。

    利润可能是这样的:

    #lang racket
    (define example #(3 1 4 5 10 23 1 50 0 12 40 12 43 20))
    
    (define (prefix-sums xs)
      (define-values (sums sum)
        (for/fold ([sums '()] [sum 0]) ([x xs])
          (values (cons sum sums) (+ sum x))))
      (list->vector (reverse (cons sum sums))))
    
    (define (sum4 xs i)
      (- (vector-ref xs (+ i 4))
         (vector-ref xs    i)))
    
    (define (sum4s xs)
      (for/list ([i (- (vector-length xs) 4)])
        (sum4 (prefix-sums xs) i)))
    
    (apply max (sum4s example))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 2021-08-04
      • 2017-04-07
      • 2021-02-25
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多