Multithreading Clojure中的多线程合并排序算法

Multithreading Clojure中的多线程合并排序算法,multithreading,algorithm,sorting,clojure,Multithreading,Algorithm,Sorting,Clojure,我需要在单线程中编写Clojure中合并排序算法的实现,并使用2、4、8、16和32个线程的并行选项。 程序将从文本文件中读取大量整数集合(100万),并将它们放入列表中进行排序。 我对Clojure和函数式编程非常熟悉。 我刚刚编写了读取文件的代码… (use 'clojure.java.io) (defn get-lines [fname] (with-open [r (reader fname)] (doall (map read-string (line-seq r)))))

我需要在单线程中编写Clojure中合并排序算法的实现,并使用2、4、8、16和32个线程的并行选项。
程序将从文本文件中读取大量整数集合(100万),并将它们放入列表中进行排序。
我对Clojure和函数式编程非常熟悉。
我刚刚编写了读取文件的代码…

(use 'clojure.java.io)
(defn get-lines [fname]
  (with-open [r (reader fname)]
    (doall (map read-string (line-seq r)))))
(def numbers (get-lines "numbers.dat"))

。。。并找到了单线程实现。
但是我不能实现并行算法。我似乎无法理解。

有人能帮我吗?

这听起来确实很像家庭作业(正如一位评论员所说),所以我不敢给出详细的答案。我可以告诉您,您需要研究Clojure中不同类型的并发。从最简单到最复杂,您可能需要考虑的一些方法是PMAP、期货和COR.AYYNC。我建议大家看看《勇敢与真实》中关于和的章节,如果有人在寻找

(use 'clojure.java.io)

(defn get-lines [fname]
  (with-open [r (reader fname)]
    (doall (map read-string (line-seq r)))))

(def numbers (get-lines "numbers.dat"))

(defn merge-lists [left right]
  (loop [head [] L left R right]
    (if (empty? L) (concat head R)
    (if (empty? R) (concat head L)
    (if (> (first L) (first R))
      (recur (conj head (first R)) L (rest R))
      (recur (conj head (first L)) (rest L) R))))))

(defn naive-merge-sort [list]
  (if (< (count list) 2) list
    (apply merge-lists
      (map naive-merge-sort
        (split-at (/ (count list) 2) list)))))

(defn parallel-merge-sort-2 [list]
  (if (< (count list) 2) list
    (apply merge-lists
      (pmap naive-merge-sort
        (split-at (/ (count list) 2) list)))))

(defn parallel-merge-sort-4 [list]
  (if (< (count list) 2) list
    (apply merge-lists
      (pmap parallel-merge-sort-2
        (split-at (/ (count list) 2) list)))))

(defn parallel-merge-sort-8 [list]
  (if (< (count list) 2) list
    (apply merge-lists
      (pmap parallel-merge-sort-4
        (split-at (/ (count list) 2) list)))))

(defn parallel-merge-sort-16 [list]
  (if (< (count list) 2) list
    (apply merge-lists
      (pmap parallel-merge-sort-8
        (split-at (/ (count list) 2) list)))))

(defn parallel-merge-sort-32 [list]
  (if (< (count list) 2) list
    (apply merge-lists
      (pmap parallel-merge-sort-16
        (split-at (/ (count list) 2) list)))))
(使用“clojure.java.io”)
(定义获取行[fname]
(打开[r(读卡器fname)]
(doall(映射读取字符串(行seq r‘‘)’))
(def编号(获取行“numbers.dat”))
(定义合并列表[左-右]
(循环[头部[]左左右]
(如果(空?L)(混凝土封头R)
(如果(空?R)(混凝土封头L)
(如果(>(第一个L)(第一个R))
(复发(联合头(第一个右))L(其余右))
(再发(连头(左一))(左一)(右一)("""""
(定义原始合并排序[列表]
(如果(<(计数列表)2)列表
(应用合并列表)
(映射原始合并排序)
(在(/(计数列表)2)列表()()))处拆分)
(defn parallel-merge-sort-2[列表]
(如果(<(计数列表)2)列表
(应用合并列表)
(pmap)原始合并排序
(在(/(计数列表)2)列表()()))处拆分)
(defn parallel-merge-sort-4[列表]
(如果(<(计数列表)2)列表
(应用合并列表)
(pmap parallel-merge-sort-2
(在(/(计数列表)2)列表()()))处拆分)
(defn parallel-merge-sort-8[列表]
(如果(<(计数列表)2)列表
(应用合并列表)
(pmap parallel-merge-sort-4
(在(/(计数列表)2)列表()()))处拆分)
(defn parallel-merge-sort-16[列表]
(如果(<(计数列表)2)列表
(应用合并列表)
(pmap parallel-merge-sort-8
(在(/(计数列表)2)列表()()))处拆分)
(defn parallel-merge-sort-32[列表]
(如果(<(计数列表)2)列表
(应用合并列表)
(pmap parallel-merge-sort-16
(在(/(计数列表)2)列表()()))处拆分)

朴素合并排序是单线程实现。并行实现将输入列表分为2-32个块,使用朴素合并排序进行排序。

这是家庭作业吗?