中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

貴陽做網(wǎng)站的熱門推廣軟件

貴陽做網(wǎng)站的,熱門推廣軟件,html教程資料,山西手機(jī)版建站系統(tǒng)哪家好快樂的流暢:個人主頁 個人專欄:《算法神殿》《數(shù)據(jù)結(jié)構(gòu)世界》《進(jìn)擊的C》 遠(yuǎn)方有一堆篝火,在為久候之人燃燒! 文章目錄 引言一、顏色分類二、排序數(shù)組三、數(shù)組中的第k個數(shù)四、最小的k個數(shù)總結(jié) 引言 本節(jié)主要介紹快速排序&#xf…



快樂的流暢:個人主頁


個人專欄:《算法神殿》《數(shù)據(jù)結(jié)構(gòu)世界》《進(jìn)擊的C++》

遠(yuǎn)方有一堆篝火,在為久候之人燃燒!

文章目錄

  • 引言
  • 一、顏色分類
  • 二、排序數(shù)組
  • 三、數(shù)組中的第k個數(shù)
  • 四、最小的k個數(shù)
  • 總結(jié)

引言

本節(jié)主要介紹快速排序(三路劃分,隨機(jī)取key),以及它的變形算法——快速選擇算法

一、顏色分類


細(xì)節(jié):快速排序中標(biāo)準(zhǔn)的partition(三路劃分)

  • 設(shè)置三個指針 left,cur,right
  • 劃分為三個區(qū)域[0, left - 1],[left, right],[right + 1, n-1]
  • [0, left - 1]:元素小于key
  • [left, right]:元素等于key
  • [right + 1, n-1]:元素大于key
  • left和right用來維護(hù)(等于key的)中路元素區(qū)域的左右兩端,cur用來掃描數(shù)組
class Solution
{
public:void sortColors(vector<int>& nums){int left = 0, cur = 0, right = nums.size() - 1;while(cur <= right){if(nums[cur] == 0) swap(nums[left++], nums[cur++]);else if(nums[cur] == 2) swap(nums[right--], nums[cur]);else ++cur;}}
};

二、排序數(shù)組


思路:

  • 遞歸出口:區(qū)間只有一個元素或者不存在
  • 隨機(jī)選key:利用rand函數(shù),記得提前srand種下隨機(jī)數(shù)種子
  • 三路劃分:三指針維護(hù)區(qū)間
  • 分治:繼續(xù)遞歸[begin, left - 1],[right + 1, end]兩個區(qū)間
class Solution
{
public:int getKey(vector<int>& nums, int left, int right){int keyi = rand() % (right - left + 1) + left;return nums[keyi];}void quickSort(vector<int>& nums, int begin, int end){if(begin >= end) return;int key = getKey(nums, begin, end);//隨機(jī)選keyint cur = begin, left = begin, right = end;while(cur <= right){if(nums[cur] < key) swap(nums[left++], nums[cur++]);else if(nums[cur] > key) swap(nums[right--], nums[cur]);else cur++;}quickSort(nums, begin, left - 1);quickSort(nums, right + 1, end);}vector<int> sortArray(vector<int>& nums){srand(0);//種下隨機(jī)數(shù)種子quickSort(nums, 0, nums.size() - 1);return nums;}
};

三、數(shù)組中的第k個數(shù)


思路:TopK問題有三種解法

  1. 排序——O(NlogN)
  2. 堆——O(NlogK)
  3. 快速選擇——O(N)

堆版本

細(xì)節(jié):建大堆 + k-1次刪除

class Solution
{
public:void AdjustDown(vector<int>& nums, int parent){int n = nums.size(), child = 2 * parent + 1;while(child < n){if(child + 1 < n && nums[child] < nums[child + 1]) ++child;if(nums[parent] < nums[child])//建大堆{swap(nums[parent], nums[child]);parent = child;child = 2 * parent + 1;}else break;}}int findKthLargest(vector<int>& nums, int k){int n = nums.size();for(int i=(n-1-1)/2; i>=0; --i){AdjustDown(nums, i);}while(--k)//執(zhí)行k-1次{swap(nums[0], nums[nums.size() - 1]);nums.pop_back();AdjustDown(nums, 0);}return nums[0];}
};

快速選擇版本

細(xì)節(jié):

  • 從最右邊開始數(shù),k落在右區(qū)域,則繼續(xù)遞歸找第k大
  • k落在中區(qū)域,則直接更新結(jié)果
  • k落在左區(qū)域,則繼續(xù)遞歸找第k-b-c大
class Solution
{int ret;
public:int GetKey(vector<int>& nums, int begin, int end){int keyi = rand() % (end - begin + 1) + begin;return nums[keyi];}void qucikSelect(vector<int>& nums, int begin, int end, int k){if(begin > end) return;int key = GetKey(nums, begin, end);int left = begin, cur = begin, right = end;while(cur <= right){if(nums[cur] < key) swap(nums[left++], nums[cur++]);else if(nums[cur] > key) swap(nums[right--], nums[cur]);else cur++;}if(k <= end - right) qucikSelect(nums, right + 1, end, k);else if(k <= end - left + 1) ret = key;else qucikSelect(nums, begin, left - 1, k - (end - left + 1));}int findKthLargest(vector<int>& nums, int k){srand(0);qucikSelect(nums, 0, nums.size() - 1, k);return ret;}
};

四、最小的k個數(shù)



細(xì)節(jié):

  • 從最左邊開始數(shù),k落在左區(qū)域,則繼續(xù)遞歸找最小的k個元素
  • k落在中區(qū)域,則直接返回前k個元素
  • k落在右區(qū)域,則繼續(xù)遞歸找最小的k-a-b個元素
class Solution
{
public:int getKey(vector<int>& nums, int begin, int end){int keyi = rand() % (end - begin + 1) + begin;return nums[keyi];}void quickSelect(vector<int>& nums, int begin, int end, int k){if(begin >= end) return;int key = getKey(nums, begin, end);int left = begin, cur = begin, right = end;while(cur <= right){if(nums[cur] < key) swap(nums[left++], nums[cur++]);else if(nums[cur] > key) swap(nums[right--], nums[cur]);else cur++;}if(k <= left - begin) quickSelect(nums, begin, left - 1, k);else if(k <= right + 1 - begin) return;else quickSelect(nums, right + 1, end, k - (right + 1 - begin));}vector<int> inventoryManagement(vector<int>& nums, int k){srand(0);quickSelect(nums, 0, nums.size() - 1, k);return {nums.begin(), nums.begin() + k};}
};

總結(jié)

快速排序,隨機(jī)選key,保證了時間復(fù)雜度逼近O(NlogN),三路劃分,是為了處理重復(fù)大量元素。

快速選擇,是基于快速排序的變形算法,在解決TopK問題有著O(N)的時間復(fù)雜度,極其高效!


真誠點贊,手有余香

http://www.risenshineclean.com/news/7304.html

相關(guān)文章:

  • 做網(wǎng)站工作內(nèi)容互聯(lián)網(wǎng)推廣員是做什么
  • 網(wǎng)站菜單代碼廊坊網(wǎng)站
  • 東莞網(wǎng)站制作seo排名優(yōu)化哪家好
  • 做外貿(mào)出口衣服的網(wǎng)站如何設(shè)計網(wǎng)站
  • 網(wǎng)站主頁排版大眾點評seo關(guān)鍵詞優(yōu)化
  • 答建設(shè)網(wǎng)站上海牛巨仁seo
  • 小縣城 交友網(wǎng)站 很難做百度搜索熱度查詢
  • 北京網(wǎng)站建設(shè)邁程網(wǎng)絡(luò)seo搜索引擎優(yōu)化業(yè)務(wù)
  • 網(wǎng)站后臺代碼常用的網(wǎng)絡(luò)營銷推廣方法有哪些
  • 南通六建網(wǎng)站在線推廣
  • 網(wǎng)站域名注冊費(fèi)用軟件開發(fā)工資一般多少
  • python可以做網(wǎng)站開發(fā)嗎無錫百度正規(guī)公司
  • 黑龍江新聞法治頻道節(jié)目回放東莞seo建站哪家好
  • 溫州專業(yè)手機(jī)網(wǎng)站制作哪家好天津網(wǎng)站seo設(shè)計
  • 網(wǎng)站代碼模板免費(fèi)十大網(wǎng)絡(luò)推廣公司排名
  • 南皮縣做網(wǎng)站整站關(guān)鍵詞排名優(yōu)化
  • 美麗寮步網(wǎng)站建設(shè)高性能免費(fèi)大數(shù)據(jù)平臺
  • 代理公司注冊上海工具seo
  • 義烏網(wǎng)站建設(shè)現(xiàn)狀html期末大作業(yè)個人網(wǎng)站制作
  • 傳媒公司做網(wǎng)站編輯 如何西安做網(wǎng)站的公司
  • 南京專業(yè)做網(wǎng)站的公司有哪些鄭州seo優(yōu)化外包顧問
  • 網(wǎng)站制作怎么學(xué)去哪學(xué)電商運(yùn)營培訓(xùn)哪個機(jī)構(gòu)好
  • 網(wǎng)站開發(fā)賺錢嗎my63777免費(fèi)域名查詢2023年
  • 怎么樣推廣網(wǎng)站專業(yè)網(wǎng)站制作
  • 有哪些網(wǎng)站做的比較好看的青島官網(wǎng)優(yōu)化
  • 遵義網(wǎng)站建設(shè)網(wǎng)站寧波seo教學(xué)
  • wordpress調(diào)用具體文章做搜索引擎優(yōu)化的企業(yè)
  • 做自己的網(wǎng)站花多錢自己開發(fā)網(wǎng)站
  • 網(wǎng)站組網(wǎng)圖眾志seo
  • 域名備案和網(wǎng)站備案是一回事嗎互聯(lián)網(wǎng)培訓(xùn)班學(xué)費(fèi)多少