Java:使用Fork / Join框架的Mergesort

此项的目的是显示一个Fork / Join RecursiveAction的简单示例,而不是过多地研究合并合并的可能优化方法,或者比使用Exkutor / Join Pool优于现有的基于Java 6的现有实现(例如ExecutorService)的相对优势。

以下是使用Java的自上而下合并排序算法的典型实现:

import java.lang.reflect.Array;public class MergeSort {public static <T extends Comparable<? super T>> void sort(T[] a) {@SuppressWarnings('unchecked')T[] helper = (T[])Array.newInstance(a[0].getClass() , a.length);mergesort(a, helper, 0, a.length-1);}private static <T extends Comparable<? super T>> void mergesort(T[] a, T[] helper, int lo, int hi){if (lo>=hi) return;int mid = lo + (hi-lo)/2;mergesort(a, helper, lo, mid);mergesort(a, helper, mid+1, hi);merge(a, helper, lo, mid, hi);  }private static <T extends Comparable<? super T>> void merge(T[] a, T[] helper, int lo, int mid, int hi){for (int i=lo;i<=hi;i++){helper[i]=a[i];}int i=lo,j=mid+1;for(int k=lo;k<=hi;k++){if (i>mid){a[k]=helper[j++];}else if (j>hi){a[k]=helper[i++];}else if(isLess(helper[i], helper[j])){a[k]=helper[i++];}else{a[k]=helper[j++];}}}private static <T extends Comparable<? super T>> boolean isLess(T a, T b) {return a.compareTo(b) < 0;}
}

为了快速描述算法-
递归执行以下步骤:

  1. 输入数据分为两半
  2. 每一半都被排序
  3. 然后将排序的数据合并

合并排序是使用Java Fork / Join池实现的一个典型示例 ,以下是使用Fork / Join框架的合并排序的盲目实现:

合并排序中的递归任务可以简单地表示为RecursiveAction的实现–

private static class MergeSortTask<T extends Comparable<? super T>> extends RecursiveAction{private static final long serialVersionUID = -749935388568367268L;private final T[] a;private final T[] helper;private final int lo;private final int hi;public MergeSortTask(T[] a, T[] helper, int lo, int hi){this.a = a;this.helper = helper;this.lo = lo;this.hi = hi;}@Overrideprotected void compute() {if (lo>=hi) return;int mid = lo + (hi-lo)/2;MergeSortTask<T> left = new MergeSortTask<>(a, helper, lo, mid);MergeSortTask<T> right = new MergeSortTask<>(a, helper, mid+1, hi);invokeAll(left, right);merge(this.a, this.helper, this.lo, mid, this.hi);}private void merge(T[] a, T[] helper, int lo, int mid, int hi){for (int i=lo;i<=hi;i++){helper[i]=a[i];}int i=lo,j=mid+1;for(int k=lo;k<=hi;k++){if (i>mid){a[k]=helper[j++];}else if (j>hi){a[k]=helper[i++];}else if(isLess(helper[i], helper[j])){a[k]=helper[i++];}else{a[k]=helper[j++];}}}private boolean isLess(T a, T b) {return a.compareTo(b) < 0;}}

上面的MergeSortTask实现了一个计算方法,该方法接受一个值数组,将其拆分为两个部分,从每个部分中创建一个MergeSortTask并分叉另外两个任务(因此称为RecursiveAction!)。 此处用于生成任务的特定API是invokeAll ,仅当已提交的子任务标记为已完成时才返回。 因此,左右子任务返回后,结果将合并到合并例程中。

鉴于此,剩下的唯一工作就是使用ForkJoinPool提交此任务。 ForkJoinPool与用于在线程池中分发任务的ExecutorService类似,不同之处在于引用了ForkJoinPool的API文档:

ForkJoinPool与其他类型的ExecutorService的不同之处主要在于采用了工作窃取:池中的所有线程都试图查找并执行由其他活动任务创建的子任务(如果不存在,则最终阻塞等待工作)

这是将任务提交到Fork / Join Pool的任务的样子:

public static <T extends Comparable<? super T>> void sort(T[] a) {@SuppressWarnings('unchecked')T[] helper = (T[])Array.newInstance(a[0].getClass() , a.length);ForkJoinPool forkJoinPool = new ForkJoinPool(10);forkJoinPool.invoke(new MergeSortTask<T>(a, helper, 0, a.length-1));}

完整的示例也可以在这里找到: https : //github.com/bijukunjummen/algos/blob/master/src/main/java/org/bk/algo/sort/algo04/merge/MergeSortForkJoin.java

参考: all和其他博客中的Mergesort 使用我们JCG合作伙伴 Biju Kunjummen的Fork / Join Framework 。


翻译自: https://www.javacodegeeks.com/2012/08/java-mergesort-using-forkjoin-framework.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php的异常处理方式,php异常处理基本方法

当一个php脚本运行时&#xff0c;为了防止脚本运行崩溃&#xff0c;亦或是当php作为webserver&#xff0c;为了防止php程序出错&#xff0c;抛出httpcode500错误&#xff0c;我们常常需要对php程序做异常处理。今天介绍的是最基本的异常处理方法&#xff1a;一般而言&#xff0…

关系型数据库的三范式

第一范式:确保每列的原子性. 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等。第二范式:在第一范式的基础上更进一层,目标是确保表…

vray学习笔记(3)-多维子材质是个什么东西

多维子材质是个什么东西&#xff1f;为什么出现这个概念&#xff1f; 在3dsmax官方网站&#xff0c;我们可以看到它的定义&#xff1a; The Multi/Sub-Object material lets you assign different materials at the sub-object level of your geometry. 意思是多维子材质这个概…

Hello JavaFX 2.0:命令行介绍

我从博客文章Hello JavaFX 2.0&#xff1a;NetBeans 7.1 beta的介绍中&#xff0c;从NetBeans 7.1 beta的角度看了一个无处不在的Hello World示例的简单JavaFX版本。 在本文中&#xff0c;我将介绍仅使用命令行工具通过JavaFX实现的Hello World版本。 JavaFX 2.0 API文档包括ja…

matlab空格会消失了,如何在Matlab中自动删除保存的尾随空格?

我有同样的需求,并写了一个小脚本来做一些接近的事情.将以下内容放在MATLAB desktop shortcut中.每当您单击快捷方式按钮时,它将从编辑器中的活动文件中删除尾随空格.不如在保存时自动执行它 – 你需要记住在保存之前按下按钮 – 但差不多.测试在11b,12a和13b,但在12b也应该没问…

object to 字符串json

1 package com.beijxing.TestMain;2 3 import com.beijxing.entity.Student;4 import com.google.gson.Gson;5 import com.google.gson.annotations.SerializedName;6 7 /** 8 * 9 * author 作者 : ywp 10 * version 创建时间&#xff1a;2016年10月30日 下午9:21:33 11 */ 12…

JS 对象(Object)和字符串(String)互转

var jsObj {}; jsObj.testArray [1,2,3,4,5]; jsObj.name CSS3; jsObj.date 8 May, 2011; var str JSON.stringify(jsObj); var str1 JSON.parse(str); var str2 JSON.stringify(str1);alert(str);alert(str1); alert(str2);对象拷贝&#xff1a;var newObj JSON…

php 后退按钮事件,php – 后退按钮的会话问题

我在php文件中有这个代码,它包含在我要共享的所有页面中并保护我的页面.session_name("login");session_start();if (!isset($_SESSION[UserId])) {if(!header("Location: https://subdomain.mywebsite.com/")){ die("Unauthorized access"); }}…

异常:java lang AbstractMethodError

通常在尝试调用抽象方法时抛出此java.lang.AbstractMethodError。通常&#xff0c;此错误是在编译时本身识别的&#xff0c;如果在运行时抛出此错误&#xff0c;则该类必须不兼容&#xff08;与先前存在的类不兼容&#xff09; &#xff09;更改。因此&#xff0c;它是Incompat…

05.while循环的练习

练习1:namespace _05.while循环练习01{ class Program { static void Main(string[] args) { //打印100次"努力学习.net技术" int i 0; while (i < 100) //当i小于100就执行循环体的内容 { Console.WriteLine("{0}.努力学习.net技术",i); i; } Console…

oracle列分区,Oracle数据库分区--实例

分区表通过对分区列进行判断&#xff0c;把满足不同条件的分区列对应的记录保存在不同的分区中。一、何为分区表什么情况下会使用分区表&#xff1f;表中已有大量数据&#xff0c;或预计到表中将会保存大量的数据可以按照预期(月份、区域、dml)对表中的数据执行查询和更新什么是…

ZK实际应用:MVVM –与ZK客户端API一起使用

在之前的文章中&#xff0c;我们使用ZK的MVVM实现了以下功能&#xff1a; 将数据加载到表中 使用表单绑定保存数据 删除条目并以编程方式更新视图 ZK MVVM和ZK MVC实现方式之间的主要区别是&#xff0c;我们不直接在controller&#xff08;ViewModel&#xff09;类中访问和操…

RPC框架Dubbo分析

1&#xff0c;背景随着互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的垂直应用架构已无法应对&#xff0c;分布式服务架构以及流动计算架构势在必行&#xff0c;亟需一个治理系统确保架构有条不紊的演进单一应用架构当网站流量很小时&#xff0c;只需一个应…

定时器、计时器。

//第一种 每一秒执行一次&#xff08;重复性&#xff09;double delayInSeconds 1.0;timer dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));dispatch_source_set_timer(timer, DISPATCH_TIME_NO…

mybatis oracle trim,Mybatis trim标签

trim代替where/set标签trim是更灵活用来去处多余关键字的标签&#xff0c;它可以用来实现where和set的效果。SELECT *FROM user uu.username LIKE CONCAT(CONCAT(%, #{username, jdbcTypeVARCHAR}),%)AND u.sex #{sex, jdbcTypeINTEGER}AND u.birthday #{birthday, jdbcTypeD…

自己初学时的随笔记录

如果富文本编辑器 jsp....文件可以找到但是就是显示不出来&#xff0c;可能是Controller控制器中RequestMapping后边没有写路径 ---------------------------------------------------------------------------------------------------------------------------- iframe框架内…

终极JPA查询和技巧列表–第1部分

我们可以在Internet上找到一些JPA“如何做”&#xff0c;在本博客的此处&#xff0c;教您如何使用JPA执行多项任务。 通常&#xff0c;我看到有人问有关使用JPA进行查询的问题。 通常&#xff0c;为了回答此类问题&#xff0c;提供了几个链接&#xff0c;以尝试找到该问题的解决…

请求重定向(网上抄录)

抄录地址 http://www.sosuo8.com/article/show.asp?id1158 (1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页面转向到m2.aspx, 并将转向前数据加上m2.aspx页结果返回给浏览器. (…

oracle走当前时间分区,Oracle分区使用波斯日历的时间间隔

与数据库级NLS_CALENDAR相比&#xff0c;没有其他方法可以在不同的日历中定义间隔。通过使用虚拟列划分每个日期落入的(波斯)月份的数字表示&#xff0c;可以得到相同的效果&#xff1a;create table test_temp_times (id number(18) not null,xdate date not null,str varchar…

Spring集成–第2节–更多世界

这是Spring Integration Session 1的后续活动 第一部分是使用Spring Integration的简单Hello World应用程序。 我想通过考虑其他一些方案来进一步介绍它。 因此&#xff0c;对Hello World应用程序的第一个更改是添加网关组件。 要快速重新访问较早的测试程序&#xff0c;请执行…