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.pswp.cn/news/372139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372139.shtml
英文地址,請注明出處:http://en.pswp.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;請執行…