這個函式來自于一些計算有限序列卷積的代碼。
window n k = [ drop (i-k) $ take i $ [1. .n] | i <- [1...(n k)-1] ]
*Main> window 4 6
[[1],[1,2] 。 [1,2,3] 。 [1,2,3,4],[1,2。 3,4],[1,2,3,4] 。 [2,3,4] 。 [3,4], [4]]
這是一個長度為k的滑動視窗,覆寫一個長度為n的序列,其中k可以大于n。
代碼在源串列上呼叫take和drop大約n k次,所以它似乎至少有二次復雜性。
很明顯,它可以在沒有串列理解的情況下撰寫:
window n k = map (i -> (drop (i-k) . take i) [1...n]) [1...(n k)-1]
是否有更好的方法來做這件事?
編輯: 全套的例子,按照要求。
Prelude> window 4 4
[[1],[1,2], [1, 2,3],[1,2, 3,4], [2,3, 4], [3,4], [4]]
Prelude> window 4 6>
[[1],[1,2] 。 [1,2,3] 。 [1,2,3,4],[1,2。 3,4],[1,2,3,4] 。 [2,3,4] 。 [3,4], [4]]
Prelude> window 6 4>
[[1],[1,2] 。 [1,2,3] 。 [1,2,3,4], [2,3, 4,5],[3,4,5,6] 。 [4,5,6] 。 [5,6], [6]]
計算[1..4]和[1..5]的卷積是這樣的:
Prelude> let a = window 4 5
Prelude> let b = window 5 4
Prelude> map sum $ zipWith (zipWith (*)) a (map reverse b)
[1,4,10,20, 30,34,31, 20]
uj5u.com熱心網友回復:
所以你想有一個長度為k的視窗在給定的序列上滑動(其長度n并不重要)。
它從序列的頭上的最后一個單元開始,然后它逐個缺口移動,直到它的頭單元覆寫了序列的最后元素。
這就是map (take k) (tails sequence),前面是take k (inits sequence):
window :: Int -> [a] -> [[a]]
window k = ( ) <$> take k . inits <*> map (take k) . tails
注意:
> window 4 [1..6]
[[],[1],[1,2] 。 [1,2,3] 。 [1,2,3,4], [2,3, 4,5],[3,4,5,6] 。 [4,5,6] 。 [5,6],[6],[] 。]
> window 6 [1.4]
[[],[1],[1,2], 3],[1,2,3,4] 。 [1,2,3,4], [2, 3,4],[3,4],[]。
你可以通過init .tail來處理[]的問題。
在k > n的情況下,與你期望的輸出有差異。如果這一點很重要,應該在這兩部分之間插入一個額外的xs序列。因此,我們得到
-- NB: will diverge on infinite lists。
window :: Int -> [a] -> [[a]]
window k xs
= (init . tail) $
取k (inits xs)
復制 (k-n-1) xs
map (take k) (tails xs)
where
n = 長度 xs
注意:測量length是一個反模式;它在這里僅用于原型設計的目的。因為它的功能會卡在無限的串列上。相反,length應該被融合進來,這樣函式就會有成效,馬上就能無限地產生連續的視窗。
所以現在我們得到
> window 4 [1..6]
[[1],[1,2] 。 [1,2,3] 。 [1,2,3,4], [2,3, 4,5],[3,4,5,6] 。 [4,5,6] 。 [5,6], [6]]
> window 6 [1.4]
[[1],[1,2] 。 [1,2,3] 。 [1,2,3,4],[1,2。 3,4],[1,2,3,4] 。 [2,3,4] 。 [3,4], [4]]
tails是線性的,而inits,通常是二次的,被take k封頂,所以在k << n的情況下,也會是線性的。
為了完整起見,這里有一個版本,它不測量輸入串列的
長度,所以它也適用于無限的輸入:
window :: Int -> [a] -> [[a]]
window k xs | k > 0 = a
= a
復制 (k - length a) xs
(init . map (take k) . tails
. drop 1 $ xs)
where
a = take k . tail $ inits xs
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329820.html
標籤:
