【问题标题】:Concurrent sorting in JavaJava中的并发排序
【发布时间】:2013-05-06 12:02:21
【问题描述】:

我目前正在开发一个同时对字符串进行排序的程序。我的程序接收一个文件,将文件的每一行读入一个数组,然后将字符串数组拆分为更小的字符串数组。然后程序为每个较小的数组启动一个线程,并对它们进行快速排序。一旦每个线程完成对其数组的排序,主线程就会从线程对象中收集所有结果。然后应该将较小的、现已排序的数组合并为一个大的、已排序的数组。

我知道我的快速排序实现是有效的——程序使用一个线程对单词进行排序。我需要的是一种将线程返回的数组嵌套在一起的算法。

任何帮助表示赞赏 - 在此先感谢。

【问题讨论】:

  • 如何在不考虑并行性的情况下合并 X 个已排序的数组
  • 你的意思是你在子数组上运行一个标准的快速排序然后你需要一种方法来最终合并它们?
  • @esseks:这正是我的意思,谢谢。有什么想法吗?
  • 只需查看所有 X 数组,选择最小的项,然后将其从找到的数组中删除。重复。
  • 谢谢Thorbjørn,我会努力做到的。不过,我仍然不太确定如何编写代码。

标签: java sorting concurrency


【解决方案1】:

mergesort 的最后一个merge 过程开始。您读取每个 m 数组的第一个值(单个子数组的最小值),然后选择 m 个读取值中的最小值(全局最小值),将其推送到结果中,然后将其从包含数组中删除或递增相应的索引加一。然后,迭代直到所有子数组都为空,或者所有索引都到达了各自数组的末尾。

注意:如果您有一个非常大的数据集(它实际上用于处理这种情况),这可能会减少内存使用量,但由于拆分成本(如果您复制子数组,它会变为线性,这可能会比原始快速排序更差) ) 和多线程开销。考虑到当应用于大型数组时,就地合并排序更节省空间。还要考虑一下谁编写了您正在使用的快速排序,可能花时间优化调用和分支执行。

这是基本的理论 CS,但请注意,您不能简单地通过使用并行来降低计算复杂度等级,您只能获得线性加速。最后,Quicksort 碰巧达到了比较排序算法的平均复杂度的下限:如果你想超越 Quicksort O(nlog(n)) 我有个坏消息要告诉你。

【讨论】:

  • 谢谢,我会努力的:)
【解决方案2】:

我认为使用归并排序是相当标准的。

我建议使用尽可能多的线程作为开始的 CPU。

您可能会发现读取文件的时间比例很高,因此可以在您读取字符串时对字符串进行排序的方法可能会更快。

例如使用 TreeSets 进行基数排序可能会更快,因为它将按您读取文件的时间进行排序。

【讨论】:

    【解决方案3】:

    您可以在此处使用合并程序。该算法非常简单,请参阅维基百科上的Merge sort。使用可以在两个数组合并时使用简单的双向合并,或者在多个数组同时合并时使用多路合并。

    另外,检查这项工作:Parallelized QuickSort and RadixSort with Optimal Speedup

    最后还有3-way string quicksort可以并行。

    【讨论】:

      【解决方案4】:

      就像其他帖子中提到的,算法的最后一步是合并排序。

      但是,快速排序本身是一种递归算法,允许自然地引入并发,这样您的“合并步骤”就已过时,例如,请参阅 http://ricardozuasti.com/2012/java-concurrency-examples-forkjoin-framework/

      在枢轴元素处于其最终位置后,您可以在两个分区上调用快速排序。这可以同时进行。由于这是递归的,它将跨越其他线程。

      【讨论】:

      • 不错!这适用于 m > 2 个分区吗?因为我认为 OP 想将原始列表分成两部分以上。
      • 合并排序在排序列表上更有效。
      • @esseks:第一个线程将分成 2。然后 2 in 2 = 4。然后 4 in 2 = 8... 很快就会有比 m 更多的线程。
      • @Jack:但是他可以使用并发版本的合并排序来执行相同的线程递归生成。
      • 现在我明白了:您正在向 OP 提出一种不同的并行化方法!明白了。
      猜你喜欢
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 2011-03-23
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多