2016-12-03 1 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를 사용하는 것보다 더 나은이지만 해결 '[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'는 전체 목록을 메모리에 유지하기 때문에 여기에서 문제가됩니다. '역방향'을 사용하려는 이유가 있습니까? – sapanoia

+0

@ sapanoia가 주어졌지만 원칙적으로 메모리에 100 M 개의 항목이있는 목록을 유지하는 것은 문제가되지 않습니다. 실제로 이는 GHCi에서 스택 오버플로가 발생합니다. 컴파일 된 프로그램에서 (심지어 최적화가 없다하더라도) 19GB의 메모리 소비로 시스템을 "그냥"습격합니다. – leftaroundabout

답변