2016-12-03 12 views
0

Ich kenne einen Weg, um den Min-oder Max-Element-Index zu finden, aber wenn ich mit einer großen Liste beschäftigen. ghc sagte: "stack overflow"Finden Sie Min-Element-Index einer großen Liste in Haskell

Also gehe ich zum Stack-Überlauf.

Prelude> :m Data.List 
Prelude Data.List> let a = reverse [1..10000000] 
Prelude Data.List> elemIndex (minimum a) a 
*** Exception: stack overflow 

Auf diese Weise ist besser als elemIndex verwenden, aber es kann nicht lösen 'reverse [1..100000000]'.

subset [] = [[]] 
subset (x:xs) = s ++ map (x :) s 
where s = subset xs 

minIndex xs = snd . minimum $ zip xs [0..] 

Wie kann ich den Index des minimalen Elements einer großen Liste finden?

Sie sollten besser kein anderes Modul verwenden, nur Prelude verwenden.

+0

Das Problem ist nicht mit 'elemIndex', aber mit' Mindestgehalt, oder besser gesagt, 'Mindest . umgekehrt. – chepner

+0

Sie können '[10000000,9999999..1]' schreiben. 'reverse' ist hier das Problem, weil es die ganze Liste im Speicher hält. Gibt es einen Grund, warum Sie "reverse" verwenden möchten? – sapanoia

+0

@sapanoia gewährt, obwohl es prinzipiell kein Problem sein sollte, eine Liste mit 100 M Einträgen im Speicher zu behalten. Tatsächlich verursacht dies nur einen Stapelüberlauf in GHCi; in einem kompilierten Programm (auch ohne Optimierungen) "knackt" es das System mit 19 GB Speicherverbrauch ... – leftaroundabout

Antwort

Verwandte Themen