日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性时间选择算法-《数据结构》(结合例题讲解)

發布時間:2023/12/9 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性时间选择算法-《数据结构》(结合例题讲解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:給定一個包含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劃分算法。

    基本思路:

  • 數組a[p:r],選擇一個基準元素,默認首元素為基準,base=a[p].
  • 開始劃分,把比基準base小的元素放在基準的左邊,把比基準base大的元素放在基準的右邊。
  • 返回基準元素的下標j,也就是說,基準元素在原數組中的排位是j+1。
  • 把k跟j+1比較,如果k==j+1,那么第k小元素就找到了,即為基準base.
  • 如果k<j+1,那么說明要求的元素在數組的左邊,返回第1步驟,劃分a[p:j-1];如果是k>j+1,那么說明要求的元素在數組的右邊,返回第1步驟,劃分a[j+1,r].
  • 直到找到第k小的元素,運行結束!
  • 來人!!!上代碼:

    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),也就是題目的題意所在!!!

    四、線性時間選擇算法

    基本思路:

  • ?數組a[p:r],設置一個閾值,問題規模為n(即為數組的元素個數),當n<5時,問題規模很小,可以直接使用冒泡排序求解問題,否則轉到步驟2.(其實,n<5設置還不是最優的,正常設置n<75,當考慮到本問題規模為15,比較小,為了應用上本算法,故設置為n<5)。
  • 把原數組劃分為n/5組,一般除了最后一組元素不足5個外,其他都滿足5個。
  • 把每組元素進行冒泡排序,找出中位數,那么一共有n/5個中位數。
  • 把n/5個中位數提取出來,再進行冒泡排序,得到“中位數中的中位數”x,作為基準。
  • 利用partition劃分算法,返回基準x的下標j,并對應計算出x在原數組中的排位i。
  • 把k與i比較,如果k<=i,那么我們要求的第k小元素肯定在a[p:j]中,否則在a[j+1:r]中.
  • 返回步驟1,以相同的策略遞歸找到第k小元素!!!
  • 各位耐心看到這的朋友,是不是覺得這算法難度加大了???別慌,這很正常,越優化的算法,底層的理論都有點深奧,但是細心理解了,那么你就是王者!!!

    你看下面,線性時間選擇算法,小玥笨笨的弄出來啦!!!

    部分代碼:

    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?!!!

    創作不易,請多多指教!!!

    ?

    ?

    總結

    以上是生活随笔為你收集整理的线性时间选择算法-《数据结构》(结合例题讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。