2016-12-03 9 views
0

私は大きな要素を扱うときに最小要素または最大要素のインデックスを見つける方法を知っています。 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..] 

大きなリストの最小要素のインデックスを見つけるにはどうすればよいですか?

プレリュードだけで他のモジュールを使用しない方がよいでしょう。

+0

問題がelemIndex' 'ではありませんが、minimum''と、いうか、 '最小。逆。 – chepner

+0

'[10000000,9999999.1.1]と書くことができます。リスト全体をメモリに保持するので、ここでは 'reverse'が問題になります。 'reverse'を使いたい理由はありますか? – sapanoia

+0

@サンパウロが許可されていますが、原則としてメモリ内の100 Mエントリのリストを保持することは問題ではありません。実際、これはGHCiでスタックオーバーフローを引き起こすだけです。コンパイルされたプログラム(最適化がなくても)は、単に19GBのメモリ消費量でシステムを駄目にするだけです... – leftaroundabout

答えて

関連する問題