国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法:分治思想處理快排遞歸以及快速選擇/最小K個(gè)數(shù)問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了算法:分治思想處理快排遞歸以及快速選擇/最小K個(gè)數(shù)問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

算法原理

分治的原理就是分而治之,從原理上講,就是把一個(gè)復(fù)雜的問(wèn)題劃分成子問(wèn)題,再將子問(wèn)題繼續(xù)劃分,直到可以解決

實(shí)現(xiàn)思路

基于分治的原理進(jìn)行快速排序,區(qū)別于傳統(tǒng)的快速排序,這里對(duì)快速排序進(jìn)行改良,成為更優(yōu)先的三路劃分算法,可以處理一些極端場(chǎng)景,使快速排序的適用性更加廣泛,同時(shí)引出快速選擇算法,用來(lái)搭配堆排序解決topk問(wèn)題

典型例題

顏色分類(lèi)

算法:分治思想處理快排遞歸以及快速選擇/最小K個(gè)數(shù)問(wèn)題,C++,# 算法,習(xí)題集,算法
本題和前面在雙指針?biāo)惴ㄖ凶龅?code>移動(dòng)0的解法類(lèi)似,這里其實(shí)算法原理和快速排序優(yōu)化的三路劃分很相似,將數(shù)組中的區(qū)域劃分為三個(gè)部分,分別為0,1,2,因此解決問(wèn)題的時(shí)候要先想清楚如何解決,把數(shù)據(jù)量弄清楚

對(duì)于此題來(lái)說(shuō),算法思路就是如果遇到2,就把數(shù)據(jù)扔到最后,如果遇到0,就放到最前,那么1就會(huì)被天然的隔離到最中間的部分,這是可行的

快速排序優(yōu)化

算法:分治思想處理快排遞歸以及快速選擇/最小K個(gè)數(shù)問(wèn)題,C++,# 算法,習(xí)題集,算法

根據(jù)上面的原理,可以改進(jìn)快速排序,快速排序的弊端在于,當(dāng)他要進(jìn)行處理很多相同數(shù)據(jù)的時(shí)候,就遇到十分低效的情況,基于這個(gè)原因,可以在實(shí)現(xiàn)它的過(guò)程中利用到一些上面的想法,這樣的算法思路其實(shí)也叫做三路劃分

因此可以使用這個(gè)方法來(lái)解題,否則會(huì)超時(shí)

class Solution 
{
public:
    vector<int> sortArray(vector<int>& nums) 
    {
        srand(time(0));
        quicksort(nums,0,nums.size()-1);
        return nums;
    }
    void quicksort(vector<int>& nums,int left,int right)
    {
        if(left>=right)
        {
            return;
        }
        int key=numsrandom(nums,left,right);
        int i=left,begin=left-1,end=right+1;
        while(i<end)
        {
            if(nums[i]<key)
            {
                swap(nums[++begin],nums[i++]);
            }
            else if(nums[i]==key)
            {
                i++;
            }
            else
            {
                swap(nums[--end],nums[i]);
            }
        }
        quicksort(nums,left,begin);
        quicksort(nums,end,right);
    }
    int numsrandom(vector<int>& nums,int left,int right)
    {
        int keyi=rand()%(right-left+1)+left;
        return nums[keyi];
    }
};

基于快速排序的三路劃分原理,可以引申出新的思想:快速選擇問(wèn)題

數(shù)組中最大的K個(gè)數(shù)

算法:分治思想處理快排遞歸以及快速選擇/最小K個(gè)數(shù)問(wèn)題,C++,# 算法,習(xí)題集,算法

看到這個(gè)題第一思想是使用堆排序,因?yàn)槎雅判蛱幚?code>TopK問(wèn)題是十分有效的,但是后面的限制條件,時(shí)間復(fù)雜度必須是O(N)的算法,因此這里并不能使用TopK算法

由于前面有快速排序的基礎(chǔ),因此這里可以引申出一個(gè)快速選擇解法

首先看思路:

在快速排序的三路劃分算法中,當(dāng)劃分結(jié)束后,整個(gè)數(shù)組會(huì)被天然的劃分為下面三個(gè)部分:

算法:分治思想處理快排遞歸以及快速選擇/最小K個(gè)數(shù)問(wèn)題,C++,# 算法,習(xí)題集,算法

假設(shè),我們這里讓藍(lán)色區(qū)域的記作C,紅色區(qū)域記作B,棕色區(qū)域記作A

那如果我們要求的這個(gè)第k個(gè)數(shù)據(jù)落在藍(lán)色區(qū)域,那么我們只需要在C這個(gè)單位長(zhǎng)度內(nèi)尋找一次即可,如果落在紅色區(qū)域,那么要找的這個(gè)數(shù)據(jù)就是key,如果落在棕色區(qū)域,則只需要在A這個(gè)單位長(zhǎng)度尋找一次即可

由此,就引申出了快速選擇算法:基于快速排序從而引申出的快速選擇

class Solution 
{
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        srand(time(NULL));
        return quicksort(nums,0,nums.size()-1,k);
    }

    int quicksort(vector<int>& nums,int l,int r,int k)
    {
        if(l==r)
        {
            return nums[l];
        }

        // 1. 選取中間元素
        int key=getrandom(nums,l,r);
        int left=l-1,right=r+1,i=l;
        
        // 2. 三路劃分
        while(i<right)
        {
            if(nums[i]<key)
            {
                swap(nums[++left],nums[i++]);
            }
            else if(nums[i]==key)
            {
                i++;
            }
            else
            {
                swap(nums[--right],nums[i]);
            }
        }

        // 3. 判斷
        int c=r-right+1;
        int b=(right-1)-(left+1)+1;
        if(c>=k)
        {
            return quicksort(nums,right,r,k);
        }
        else if(b+c>=k)
        {
            return key;
        }
        else
        {
            return quicksort(nums,l,left,k-b-c);
        }
    }

    int getrandom(vector<int>& nums,int l,int r)
    {
        return nums[rand()%(r-l+1)+l];
    }
};

時(shí)間復(fù)雜度分析較為復(fù)雜,但是是嚴(yán)格符合題目要求的,由此其實(shí)也看出了分治的思想核心,把一個(gè)大問(wèn)題轉(zhuǎn)換成小問(wèn)題,直到最后轉(zhuǎn)換成一個(gè)我們一下就能解決的問(wèn)題,不斷的縮小我們需要尋找的區(qū)間,這樣最終就能找到我們需要的答案

最小的K個(gè)數(shù)

算法:分治思想處理快排遞歸以及快速選擇/最小K個(gè)數(shù)問(wèn)題,C++,# 算法,習(xí)題集,算法

class Solution 
{
public:
    vector<int> getLeastNumbers(vector<int>& nums, int k) 
    {
        srand(time(NULL));
        quicksort(nums,0,nums.size()-1,k);
        return {nums.begin(),nums.begin()+k};
    }

    void quicksort(vector<int>& nums,int l,int r,int k)
    {
        if(l==r)
        {
            return;
        }

        // 1. 選基準(zhǔn)元素
        int key=getrandom(nums,l,r);
        int left=l-1,right=r+1,i=l;
        
        // 2. 三路劃分
        while(i<right)
        {
            if(nums[i]<key)
            {
                swap(nums[++left],nums[i++]);
            }
            else if(nums[i]==key)
            {
                i++;
            }
            else
            {
                swap(nums[--right],nums[i]);
            }
        }

        // 3. 快速選擇
        int a=left-l+1,b=(right-1)-(left+1)+1;
        if(a>k)
        {
            quicksort(nums,l,left,k);
        }
        else if(a+b>=k)
        {
            return;
        }
        else
        {
            quicksort(nums,right,r,k-a-b);
        }
    }

    int getrandom(vector<int>& nums,int l,int r)
    {
        return nums[rand()%(r-l+1)+l];
    }
};

對(duì)于這個(gè)題來(lái)說(shuō),解法多種多樣,可以采用很多方法,topk,直接排序,快速選擇,這里依舊選擇快速選擇來(lái)寫(xiě)

原理和前面類(lèi)似,由于返回的是前k個(gè)數(shù)不一定要有序,因此三路劃分后可以直接進(jìn)行條件判斷,滿足需求就可以跳出循環(huán)

總結(jié)

分治思想用以快速排序,可以引申出快速選擇這個(gè)算法,而這個(gè)算法在實(shí)際應(yīng)用中有很大的作用,對(duì)于解決前k個(gè)數(shù)或第k個(gè)數(shù)都有很大的算法意義,下篇會(huì)總結(jié)分治思想用以解決歸并問(wèn)題文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-690038.html

到了這里,關(guān)于算法:分治思想處理快排遞歸以及快速選擇/最小K個(gè)數(shù)問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 快排算法(分治法)

    快排算法(分治法)

    ????????相信很多人接觸到的第一個(gè)排序就是冒泡排序,冒泡排序是一種拿一個(gè)數(shù)依次和后面進(jìn)行比較,這樣也就確保了每一次排序之后不論降序還是升序這一個(gè)數(shù)都會(huì)在末尾或者最前端,那么今天我們要將的是快速排序,基于冒泡排序的改進(jìn)版本,為什么說(shuō)是改進(jìn)呢。要

    2024年02月16日
    瀏覽(16)
  • 【算法】分治-快排

    【算法】分治-快排

    個(gè)人主頁(yè) : zxctscl 如有轉(zhuǎn)載請(qǐng)先通知 分治就是分而治之 就是把數(shù)組中的元素分為三塊,0全部在左邊,1全部在中間,2全部在右邊。 這里要用到三個(gè)指針,一個(gè)i指針用來(lái)遍歷,一個(gè)left用來(lái)存放0區(qū)域的最后側(cè),一個(gè)用來(lái)存放2區(qū)域的最左側(cè)。 那么區(qū)間就分成了4個(gè) 只需要判斷

    2024年04月25日
    瀏覽(21)
  • 【基礎(chǔ)算法】八大排序算法:直接插入排序,希爾排序,選擇排序,堆排序,冒泡排序,快速排序(快排),歸并排序,計(jì)數(shù)排序

    【基礎(chǔ)算法】八大排序算法:直接插入排序,希爾排序,選擇排序,堆排序,冒泡排序,快速排序(快排),歸并排序,計(jì)數(shù)排序

    ??????? 個(gè)人主頁(yè):簡(jiǎn) 料 ???? 所屬專(zhuān)欄:C++ ???? 個(gè)人社區(qū):越努力越幸運(yùn)社區(qū) ???? 簡(jiǎn)? ? ?? 介: 簡(jiǎn)料簡(jiǎn)料,簡(jiǎn)單有料~在校大學(xué)生一枚,專(zhuān)注C/C++/GO的干貨分享,立志成為您的好幫手 ~ C/C++學(xué)習(xí)路線 (點(diǎn)擊解鎖) ?? C語(yǔ)言階段(已結(jié)束) ?? 數(shù)據(jù)結(jié)構(gòu)與算法(ing) ?

    2024年02月01日
    瀏覽(26)
  • 插入,選擇,堆,快速排序算法思想與復(fù)雜度

    目錄 插入排序 思想 算法步驟 代碼 復(fù)雜度 選擇排序 思想 算法步驟 代碼 復(fù)雜度 堆排序? 思想 算法步驟 代碼 復(fù)雜度 ?快速排序 ?思想 算法步驟 代碼 復(fù)雜度 穩(wěn)定性 插入排序是一種簡(jiǎn)單直觀的排序算法。它的工作原理是將數(shù)組分為 已排序 和 未排序 兩部分,然后依次將未

    2024年02月15日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言實(shí)現(xiàn))——常見(jiàn)排序算法的基本思想及實(shí)現(xiàn)(快速排序的三種方法和優(yōu)化及非遞歸實(shí)現(xiàn)快速排序)

    生活中幾乎處處都會(huì)用到排序,比如:網(wǎng)購(gòu)時(shí)的店鋪?lái)樞?,學(xué)生成績(jī)的排名等,今天我們就來(lái)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)中常見(jiàn)的幾種排序算法。 排序 :所謂排序,就是使一串記錄,按照其中的某個(gè)或某些的大小,遞增或遞減的排列起來(lái)的操作。 穩(wěn)定性 :假定在待排序的記錄序列

    2023年04月24日
    瀏覽(97)
  • 排序 | 冒泡 插入 希爾 選擇 堆 快排 歸并 非遞歸 計(jì)數(shù) 基數(shù) 排序

    排序 | 冒泡 插入 希爾 選擇 堆 快排 歸并 非遞歸 計(jì)數(shù) 基數(shù) 排序

    排序算法是一種將一組數(shù)據(jù)按照特定順序排列的算法。數(shù)據(jù)結(jié)構(gòu)排序算法的選擇取決于數(shù)據(jù)的特征、規(guī)模和性能需求。 接下來(lái)我們就要實(shí)現(xiàn)排序~~ 我們需要實(shí)現(xiàn)的一些功能: 冒泡排序是一種基本的排序算法,其核心思想是通過(guò)多次交換相鄰元素的位置,使得每一輪循環(huán)都將

    2024年02月04日
    瀏覽(22)
  • 【排序算法】 歸并排序詳解!分治思想!

    【排序算法】 歸并排序詳解!分治思想!

    ?? 嶼小夏 : 個(gè)人主頁(yè) ??個(gè)人專(zhuān)欄 : 算法—排序篇 ?? 莫道桑榆晚,為霞尚滿天! ? 什么是歸并?通過(guò)歸并排序就能讓數(shù)據(jù)有序?分治法是怎么在歸并排序上應(yīng)用的?本文將對(duì)歸并排序進(jìn)行細(xì)致入微的講解,庖丁解牛般讓你徹底明白歸并排序! 歸并排序(MERGE-SORT)是建

    2024年02月08日
    瀏覽(21)
  • 全網(wǎng)最全的快速排序方法--Hoare快排 挖坑法快排 二路快排 三路快排 非遞歸快排

    全網(wǎng)最全的快速排序方法--Hoare快排 挖坑法快排 二路快排 三路快排 非遞歸快排

    目錄 一.快速排序 1.基本介紹 2.基本思想 二.Hoare快排 0.前情知識(shí) 1.交換數(shù)組中的兩個(gè)元素 2.指定范圍的插入排序 1.基本思路 2.代碼實(shí)現(xiàn) 3.優(yōu)化思路 三.挖坑法快排(校招中適用) 1.基本思路 2.代碼實(shí)現(xiàn) 四.二路快排 1.基本思路 2.代碼實(shí)現(xiàn) 3.優(yōu)化思路 五.三路快排 1.基本思路 2.代碼

    2023年04月21日
    瀏覽(24)
  • 算法導(dǎo)論【分治思想】—大數(shù)乘法、矩陣相乘、殘缺棋盤(pán)

    算法導(dǎo)論【分治思想】—大數(shù)乘法、矩陣相乘、殘缺棋盤(pán)

    在分而治之的方法中,一個(gè)問(wèn)題被劃分為較小的問(wèn)題,然后較小的問(wèn)題被獨(dú)立地解決,最后較小問(wèn)題的解決方案被組合成一個(gè)大問(wèn)題的解決。 通常,分治算法有三個(gè)部分: 分解:將問(wèn)題劃分為若干子問(wèn)題,這些子問(wèn)題是同一問(wèn)題的較小實(shí)例。 解決:通過(guò)遞歸地解決子問(wèn)題來(lái)

    2024年02月03日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包