我知道某种方法可以找到min或max元素的索引,但是当我处理大型列表时。 ghc说:“堆栈溢出”
所以我去堆栈溢出。
Prelude> :m Data.List
Prelude Data.List> let a = reverse [1..10000000]
Prelude Data.List> elemIndex (minimum a) a
*** Exception: stack overflow
这种方法比使用elemIndex更好但是无法解决'reverse [1..100000000]'。
subset [] = [[]]
subset (x:xs) = s ++ map ( x : ) s
where s = subset xs
minIndex xs = snd . minimum $ zip xs [0..]
如何找到大型列表的min元素索引?
你最好不要使用其他模块,只使用前奏。
答案 0 :(得分:1)
elemIndex (foldl1' min a) a
关键部分是使用foldl1' min
代替minimum
。 minimum
的评估构建并返回一个巨大的redex,其评估会导致堆栈溢出。
所有血腥细节:https://wiki.haskell.org/Foldr_Foldl_Foldl%27
关于Haskell中性能严格性的一般性讨论:https://wiki.haskell.org/Performance/Strictness