2012-03-25 6 views
2

이것은 파일에서 정수를 읽고 역순 수, 즉 큰 숫자가 순서의 작은 숫자 앞에 나타나는 횟수를 계산하는 clojure 프로그램입니다. 그것은 O (n^2) 알고리즘을 구현하며, 크기가 100,000 인 입력을 실행하는 데 약 30 분이 걸립니다.Clojure 프로그램의 실행 시간

(defn count-inversions 
    [file] 
    (let [int-list (vec (map #(Integer/parseInt %) 
          (clojure.string/split (slurp file) #"\r\n")))] 
    (loop [c 0 
      t-list int-list] 
     (let [size (count t-list)] 
     (if (empty? t-list) 
     c 
     (recur (reduce #(if (< %2 (first t-list)) (inc %1) %1) c (subvec t-list 1 (dec size))) 
       (subvec t-list 1 (dec size)))))))) 

이 알고리즘은 Java에서 구현 될 때 완료하는 데 단지 몇 초가 걸립니다. 왜 그렇게 큰 차이가 있습니까? 나에게 잠재적으로 느린 볼

+0

time'에'호출 시도 다양한 p 예술은 시간이 소비되는 곳을 볼 수 있습니다. 'long-array'와 인덱스를 사용하면 속도가 빨라지 겠지만, 나는 그것이 4 등급 차이라는 것을 알 수 없다. –

답변

5

것들 (당신이 확실하게 벤치 마크해야하지만 ...)

  • 귀하의 모든 번호가 박스된다. 이렇게하면 기본 요소를 사용하는 것보다 훨씬 느린 작업을 수행 할 수 있습니다. 그것은 매우 관용적이지는 않지만이 속도 향상을 원한다면 Clojure에서 원시 배열을 사용할 수 있습니다.
  • subvec를 줄이면 현재 임시 개체가 많이 생성됩니다. 이 문제를 해결하기위한 패치가 있지만 (http://dev.clojure.org/jira/browse/CLJ-894) Clojure 1.4 또는 1.5를 기다려야 할 수도 있습니다.
  • 은 정수 연산의 성능을 향상시키기 위해 (set! *unchecked-math* true)을하는 데 도움이 나는이 Clojure에 I에 정말 빨리 실행에 도착하고 싶다면 '

(분명히, 당신은 오버 플로우가 발생할 수있는 경우 좀 더 신중해야합니다) 아마 원시적 배열에 의존하고 원시적 인덱스 루핑 D : (Clojure의 1.3)이 코드 즉

(set! *unchecked-math* true) 

(defn count-inversions [coll] 
    (let [^ints integers (int-array coll) 
      size (long (count integers))] 
     (loop [c (long 0) 
       i (long 0)] 
     (if (>= i size) 
      c 
      (recur 
      (loop [c (long c) 
        v (aget integers i) 
        j (inc i)] 
       (if (>= j size) 
       c 
       (recur (long (if (> v (aget integers j)) (inc c) c)) v (inc j)))) 
      (inc i)))))) 

(time (count-inversions (for [i (range 100000)] (rand-int 100)))) 
"Elapsed time: 16036.651863 msecs" 

내 컴퓨터에 약 16 초 만에 10 만 개 정수의 모든 반전을 중요한 것은

+0

박스 넘버의 정의에 대한 링크를 게시 하시겠습니까? 나는이 용어에 대해 궁금해. 고맙습니다. – octopusgrabbus

+0

기본적으로 숫자가 객체로 패키지됨을 의미합니다. Google에 많은 링크가 있습니다. http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html – mikera

+0

도움이되는 답변에 감사드립니다. – octopusgrabbus