线性时间选择算法-《数据结构》(结合例题讲解)
題目:給定一個包含n個元素的一維線性序列a[p:r],從這n個元素中找出第k小的元素,1<=k<=n。設a[0:14]={2,9,11,3,14,7,10,8,15,4,13,1,6,5,12},k = 8,采用線性時間選擇算法解決該問題。
各位朋友,晚上好!我是小玥,”玥“代表著美好,愿各位好運連連!!!一個人的路很孤獨,一群人的路不會孤單,咱們來玥方長!
線性時間選擇算法(完整的代碼,本題詳細解析,附贈隨機化劃分算法)https://download.csdn.net/download/weixin_51620201/85045879
文章比較詳細,文字有點多啦!!!請耐心看完,文末有驚喜!!!!
先思考片刻!1s ,2s,3s,.....1min................
好,時間到!!!上思路
目錄
一、題目分析????????
二、小玥解題
三、優化解題
四、線性時間選擇算法
一、題目分析
????????
????????題目給定了一個包含n個元素的一維線性序列a[0:14]={2,9,11,3,14,7,10,8,15,4,13,1,6,5,12},想要我們求第k小的元素。
注意看,a[0:14]是一個未排序好的數組!那么想要求第k小的元素,我們第一步要干啥?然后呢?接著呢?
第一步:先排序,排成遞增數組
第二步:求出結果:a[k]。
嘿,是不是很簡單???
問題來了,題目要求我們使用線性時間選擇來求解!!!什么是線性時間選擇???為什么要用線性時間選擇???
別慌,小玥會一一講解!!!
二、小玥解題
1、假如k=1,或者k=n,需要我們求的第k小元素,對應就是最小值和最大值。
這時只需要順序查找比較便可直接求解,這很簡單!!
public class exam1 {public static void main(String[] args) //當k=1,k=n時,求數組的最小值和最大值{int a[]={2,9,11,3,14,7,10,8,15,4,13,1,6,5,12};int min=a[0]; //初始化min,maxint max=a[0];for(int i=0;i<a.length-1;i++) //數組遍歷{if(min>a[i+1]){min=a[i+1];a[i]=min;}if(max<a[i+1]){max=a[i+1];a[i]=max;}}System.out.println("最小的元素為:"+min);System.out.println("最大的元素為:"+max);} }運行結果:
?2、現在咱們的k=8,數組a[0:14]一共有15個元素,要求第8小元素,就是求數組的中位數!!!
這就要比上面的1難度增大了!!
活學現用,我們可以用我發表過的文章里的方法:快速排序中的partition劃分算法。
基本思路:
來人!!!上代碼:
public static int partition(int[] a,int p,int r){int x=a[p]; //默認首元素為基準int i=p,j=r; //i,j為游標while(true){while(a[i]<x && i<j) //在左邊找一個比基準大的元素a[i]i++;while(a[j]>x && j>=i) //在右邊找一個比基準小的元素a[j]j--;if(i>=j) //如果i>=j,則不符合交換的條件break;Math.swap(a,i,j); //調用交換算法}return j; //返回基準的下標}上面為partiton劃分算法,怎么樣!!!
完整的代碼:
public class exam2 {public static int partition(int[] a,int p,int r){int x=a[p]; //默認首元素為基準int i=p,j=r; //i,j為游標while(true){while(a[i]<x && i<j) //在左邊找一個比基準大的元素a[i]i++;while(a[j]>x && j>=i) //在右邊找一個比基準小的元素a[j]j--;if(i>=j) //如果i>=j,則不符合交換的條件break;Math.swap(a,i,j); //調用交換算法}return j; //返回基準的下標}public static int search(int[] a,int p,int r,int k){if(p==r) return a[p];int i=Partition.partition(a,p,r); //i為基準元素的下標int j=i-p+1; //j為基準元素在原數組的排位 if(k<=j) return search(a,p,i,k);else return search(a,i+1,r,k-j);}public static void main(String[] args){int a[]={2,9,11,3,14,7,10,8,15,4,13,1,6,5,12};int result=search(a,0,a.length-1,8);System.out.println("第8小的元素為:"+result);}}運行結果:
?經檢驗,運行結果正確!!!
三、優化解題
partition劃分算法分析:
????????在最好的情況下,默認的首元素為基準剛好就是數組的中位數,那么數組被劃分為平衡的兩部分,問題規模減少一半,時間復雜度為O(n)。
????????在最壞的情況下,假如基準剛好是最小值或者最大值,會出現劃分不平衡的情況,數組劃分后,會出現一個空的數組,問題規模每次只減少了1,時間復雜度為O(n2).
????????那么,有沒有更優化的算法啊?當然有啦!!!partition算法,每次都默認首元素為基準,如果我們設置隨機化的基準,那么問題是不是可以解決?
? ? ? ? 隨機化劃分算法:randompartition算法,即把基準的設置隨機化,在平均情況下,時間復雜度可以達到O(n),這比partition算法跟優化啦!!!
? ? ? ? 回歸題目,讓我們使用線性時間選擇算法,這算法也是比patition算法更優的,在最壞的情況下,時間復雜度可以達到O(n),也就是題目的題意所在!!!
四、線性時間選擇算法
基本思路:
各位耐心看到這的朋友,是不是覺得這算法難度加大了???別慌,這很正常,越優化的算法,底層的理論都有點深奧,但是細心理解了,那么你就是王者!!!
你看下面,線性時間選擇算法,小玥笨笨的弄出來啦!!!
部分代碼:
public static void main(String[] args) //線性時間選擇算法{int[] a=new int[]{2,9,11,3,14,7,10,8,15,4,13,1,6,5,12};int k=8;int m=select(a,0,a.length-1,8);System.out.println("第"+k+"小的元素是"+m);}?運行結果:
線性時間選擇算法(完整的代碼,全套資源,附隨機化劃分算法)https://download.csdn.net/download/weixin_51620201/85045768
完整的線性時間選擇算法代碼,劃分平衡分析以及時間效率公式計算,想要的朋友可以點擊上方卡片鏈接下載哦,有問題隨時聯系小玥,附贈隨機化劃分算法randompartition?!!!
創作不易,請多多指教!!!
?
?
總結
以上是生活随笔為你收集整理的线性时间选择算法-《数据结构》(结合例题讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2968):完善登录页面
- 下一篇: matlab绘制路线图_绘制国际水域路线