2017-10-15 4 views
1

그래서 문자열 목록을 가지며 작업은 각 문자열이 해당 목록에서 몇 번이나 만날 수 있는지 계산하는 것입니다.문자열 목록의 하스켈 배열

freqMap = M.fromListWith (+) [(c, 1) | c <- subs] 

그냥 정렬 : 나는지도를 사용

frequency list = map (\l -> (length l, head l)) $ group (sort list) 

을하지만, 내 모든 작업에 대해 너무 느린 - 원래 목록이 매우 큽니다. 박스가없는 배열을 사용하는 것이 매우 빠르다는 이야기를 들었습니다. 정수의 목록처럼 : 문자열로

histogram bounds xs = accumArray (+) 0 bounds [(x, 1) | x <- xs] 

는 질문은, 1 × 클래스의 멤버가 아닌 : 그것은 문자열의 목록에서 배열을 만들 수 있습니까?

+0

응답 해 주셔서 감사합니다. 각 문자열의 인스턴스를 세어 보았습니다 (길이가 없음). freqMap = M.fromListWith (+) [(c, 1) | c <- subs> 성능은 여전히 ​​group.sort 버전과 같습니다. 프로파일 링은 또한 대부분의 시간이 정렬 또는 freqMap 평가에 소비되었음을 보여 줬다. – Triostrong

+3

대신 ['Data.HashMap'] (https://hackage.haskell.org/package/unordered-containers-0.2.8.0/docs/Data-HashMap-Lazy.html#t:HashMap)을 사용해 보셨나요? 일을 빠르게 할 수 있습니다. – hnefatl

+0

감사합니다. HashMap은 다른 변종보다 훨씬 뛰어났습니다. 아직 박스형 배열이 아니지만 나무 일지 모르지만 가능한 해시 값을 색인으로 만들기에는 너무 많은 메모리가 필요합니다. – Triostrong

답변

1

Data.HashMap (lazy/strict)은 바닐라 haskell지도의 더 빠른 버전입니다. 병목 현상이 주로 업데이트/검색 속도 인 경우 작업 속도가 빨라질 수 있습니다.

가장 중요한 부분은 이미 작성한 멋진 접근 방식을 유지할 수 있으며 배열과 상호 작용하는 (일반적으로 더 못된) 코드를 작성하지 않아도된다는 것입니다.

+0

조언을 주셔서 감사합니다, 지금 정렬은 병목 현상이 아닙니다. 저는 카운팅 단계에서 약 50 % 향상되었습니다. – Triostrong