Java基于分治算法實(shí)現(xiàn)的線性時(shí)間選擇操作示例
本文實(shí)例講述了Java基于分治算法實(shí)現(xiàn)的線性時(shí)間選擇操作。分享給大家供大家參考,具體如下:
線性時(shí)間選擇問(wèn)題:給定線性序集中n個(gè)元素和一個(gè)整數(shù)k,1≤k≤n,要求找出這n個(gè)元素中第k小的元素,(這里給定的線性集是無(wú)序的)。
隨機(jī)劃分線性選擇
線性時(shí)間選擇隨機(jī)劃分法可以模仿隨機(jī)化快速排序算法設(shè)計(jì)?;舅枷胧?span style="color: #ff0000">對(duì)輸入數(shù)組進(jìn)行遞歸劃分,與快速排序不同的是,它只對(duì)劃分出的子數(shù)組之一進(jìn)行遞歸處理。
程序解釋:利用隨機(jī)函數(shù)產(chǎn)生劃分基準(zhǔn),將數(shù)組a[p:r]劃分成兩個(gè)子數(shù)組a[p:i]和a[i+1:r],使a[p:i]中的每個(gè)元素都不大于a[i+1:r]中的每個(gè)元素。接著"j=i-p+1"計(jì)算a[p:i]中元素個(gè)數(shù)j.如果k<=j,則a[p:r]中第k小元素在子數(shù)組a[p:i]中,如果k>j,則第k小元素在子數(shù)組a[i+1:r]中。注意:由于已知道子數(shù)組a[p:i]中的元素均小于要找的第k小元素,因此,要找的a[p:r]中第k小元素是a[i+1:r]中第k-j小元素。
在最壞的情況下,例如:總是找到最小元素時(shí),總是在最大元素處劃分,這是時(shí)間復(fù)雜度為O(n^2)。但平均時(shí)間復(fù)雜度與n呈線性關(guān)系,為O(n)
package math;
import java.util.Scanner;
import java.util.Random;
public class RandomSelect {
public static void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
public int Random (int x, int y) {
Random random = new Random();
int num = random.nextInt(y)%(y - x + 1) + x;
return num;
}
public int partition(int[] list, int low, int high) {
int tmp = list[low]; //數(shù)組的第一個(gè)作為中軸
while (low < high) {
while (low < high && list[high] > tmp) {
high--;
}
list[low] = list[high]; //比中軸小的記錄移到低端
while (low < high && list[low] < tmp) {
low++;
}
list[high] = list[low]; //比中軸大的記錄移到高端
}
list[low] = tmp; //中軸記錄到尾
return low; //返回中軸的位置
}
public int RandomizedPartition (int[] arrays, int left, int right) {
int i = Random(left, right);
swap(arrays[i], arrays[left]);
return partition(arrays, left, right);
}
public int RandomizedSelect(int[] arrays, int left, int right, int k) {
if(left == right ) {
return arrays[left];
}
int i = RandomizedPartition(arrays, left, right);
int j = i - left + 1;
if(k <= j) {
return RandomizedSelect(arrays,left, i,k) ;
}
else {
return RandomizedSelect(arrays,i+1,right,k-j);
}
}
public static void main(String args[]) {
System.out.println("腳本之家測(cè)試結(jié)果:");
int[] a = {7,5,3,4,8,6,9,1,2};
for (int i = 0; i < 9; i ++) {
System.out.print(a[i]+ " ");
}
System.out.println();
RandomSelect r = new RandomSelect();
System.out.println("你要查詢的元素是數(shù)組中第幾小的?");
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = r.RandomizedSelect(a,0,8,m);
System.out.println("這個(gè)數(shù)組中第" + m + "小的元素是:"+ n);
}
}
運(yùn)行結(jié)果:

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Java語(yǔ)言實(shí)現(xiàn)掃雷游戲(1)
這篇文章主要為大家詳細(xì)介紹了Java語(yǔ)言實(shí)現(xiàn)的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
mybatis水平分表實(shí)現(xiàn)動(dòng)態(tài)表名的項(xiàng)目實(shí)例
本文主要介紹了mybatis水平分表實(shí)現(xiàn)動(dòng)態(tài)表名的項(xiàng)目實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
SpringBoot使用不同環(huán)境動(dòng)態(tài)加載不同配置文件
通過(guò)在resource目錄下創(chuàng)建不同環(huán)境的配置文件,并在Spring?Boot啟動(dòng)類中使用環(huán)境變量來(lái)加載相應(yīng)的配置文件,從而實(shí)現(xiàn)不同環(huán)境下的配置自動(dòng)加載2024-11-11
關(guān)于idea引入spring boot <parent></parent>父依賴標(biāo)紅問(wèn)題
這篇文章主要介紹了idea引入spring boot <parent></parent>父依賴標(biāo)紅問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
springboot動(dòng)態(tài)調(diào)用實(shí)現(xiàn)類方式
這篇文章主要介紹了springboot動(dòng)態(tài)調(diào)用實(shí)現(xiàn)類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringBoot 創(chuàng)建容器的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot 創(chuàng)建容器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
JDK8 new ReentrantLock((true)加鎖流程
這篇文章主要介紹了java面試中常遇到的問(wèn)題JDK8 new ReentrantLock((true)加鎖流程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式
本文主要介紹了mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
SpringMVC @RequestMapping注解應(yīng)用方法示例講解
通過(guò)@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09

