2016-12-03 169 views
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元素的大列表索引?

你最好不要使用其他模塊,只是使用前奏。

+0

的問題不在於'elemIndex',但與'minimum',或者更確切地說,'最低。 reverse'。 – chepner

+0

您可以編寫'[10000000,9999999..1]'。 'reverse'是這裏的問題,因爲它將整個列表保存在內存中。你有使用'reverse'的理由嗎? – sapanoia

+0

@sapanoia被授予,雖然原則不應該是一個問題,保持在內存中的100 M條目列表。事實上,這隻會導致GHCi堆棧溢出;在編譯的程序中(即使沒有優化),它「僅僅」會使系統陷入19 GB的內存消耗... – leftaroundabout

回答