0
我知道一些方法来查找最小或最大元素的索引,但是当我处理一个大列表时。 ghc说:“堆栈溢出”在Haskell中查找大元素的最小元素索引
所以我去堆栈溢出。
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元素的大列表索引?
你最好不要使用其他模块,只是使用前奏。
的问题不在于'elemIndex',但与'minimum',或者更确切地说,'最低。 reverse'。 – chepner
您可以编写'[10000000,9999999..1]'。 'reverse'是这里的问题,因为它将整个列表保存在内存中。你有使用'reverse'的理由吗? – sapanoia
@sapanoia被授予,虽然原则不应该是一个问题,保持在内存中的100 M条目列表。事实上,这只会导致GHCi堆栈溢出;在编译的程序中(即使没有优化),它“仅仅”会使系统陷入19 GB的内存消耗... – leftaroundabout