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.
Das Problem ist nicht mit 'elemIndex', aber mit' Mindestgehalt, oder besser gesagt, 'Mindest . umgekehrt. – chepner
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
@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