Dies ist ein Clojure-Programm zum Lesen von ganzen Zahlen aus einer Datei und Zählen der Anzahl von Inversionen, d. H. Wie oft eine größere Zahl vor einer kleineren Zahl in einer Sequenz auftritt. Es implementiert einen O (n^2) -Algorithmus und dauert ungefähr 30 Minuten, um auf einer Eingabe der Größe 100.000 zu laufen.Ausführungszeit des Clojure-Programms
(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))))))))
Dieser Algorithmus benötigt bei Implementierung in Java nur wenige Sekunden. Warum so ein großer Unterschied?
Versuchen 'Time' auf Aufruf verschiedene p Kunst, um zu sehen, wo die Zeit verbracht wird. Die Verwendung eines 'langen Arrays' und Indizes könnte die Dinge beschleunigen, aber ich kann nicht sehen, dass es 4 Größenordnungen unterschiedlich ist. –