日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

你知道“二分”,那你知道“三路切分”嗎?

來(lái)源: 責(zé)編: 時(shí)間:2023-10-10 18:30:28 267觀看
導(dǎo)讀在這里核心就是算法思想叫做"三路切分"。 “三路切分” 曾是 EMC 面試中的常客,這個(gè)名詞聽(tīng)起來(lái)很高大上,但是簡(jiǎn)單來(lái)說(shuō)就是將數(shù)組切分成三部分。 我再回憶一下“快速排序”算法。// 交換數(shù)組中兩個(gè)元素的值 function swa

在這里核心就是算法思想叫做"三路切分"。 “三路切分” 曾是 EMC 面試中的常客,這個(gè)名詞聽(tīng)起來(lái)很高大上,但是簡(jiǎn)單來(lái)說(shuō)就是將數(shù)組切分成三部分。 我再回憶一下“快速排序”算法。tDA28資訊網(wǎng)——每日最新資訊28at.com

// 交換數(shù)組中兩個(gè)元素的值 function swap(a, i, j) {  const temp = a[i];  a[i] = a[j];  a[j] = temp;}function qsort(a, b, e) {  // 邊界處理  if (b >= e || b + 1 >= e) {    return;  }    // 第一步:劃分子結(jié)構(gòu)  const mid = b + ((e - b) >> 1);    // 第二步:找到根節(jié)點(diǎn),獲取信息  const x = a[mid];  let l = b;  let i = b;  let r = e - 1;    while(i <= r) {    if (a[i] < x) {      swap(a, l++, i++);    } else if (a[i] === x) {      i++;    } else {      swap(a, r--, i);    }  }    // 第三步:將根節(jié)點(diǎn)信息傳遞給左右子數(shù)組  qsort(a, b, l);  qsort(a, i, e);}// 主函數(shù),將數(shù)組nums排序 function  quickSort(nums) {  if (nums == null)    return;  qsort(nums, 0, nums.length);    return nums;}

那為什么需要“三路切分”,它的意義是什么?這里看一個(gè)例子:tDA28資訊網(wǎng)——每日最新資訊28at.com

輸入:[2, 1, 0]輸出:[0, 1, 2]如何只通過(guò) swap 操作,將這個(gè)數(shù)組進(jìn)行排序?要求:你的時(shí)間復(fù)雜度需要是 O(N),空間復(fù)雜度需要是 O(1)。

在快速排序的時(shí)候,我們通過(guò)一個(gè)整數(shù) x 將數(shù)組切分成小于、等于、大于三部分。問(wèn)題的關(guān)鍵就是如何在時(shí)間復(fù)雜度 O(N),空間復(fù)雜度 O(1) 條件下完成這個(gè)操作。tDA28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于快速排序而言,通過(guò)一個(gè)整數(shù) x 將數(shù)組切分成:tDA28資訊網(wǎng)——每日最新資訊28at.com

  • 小于 x 部分;
  • 等于 x 的部分;
  • 大于 x 的部分;

本質(zhì)上來(lái)說(shuō),其實(shí)包含四部分:tDA28資訊網(wǎng)——每日最新資訊28at.com

  • 小于 x 部分;
  • 等于 x 的部分;
  • 還未處理數(shù)的部分;
  • 大于 x 的部分;

圖片圖片tDA28資訊網(wǎng)——每日最新資訊28at.com

我們假設(shè)這四部分分別對(duì)于四個(gè)區(qū)間:tDA28資訊網(wǎng)——每日最新資訊28at.com

  • 小于 x 部分:[0, l);
  • 等于 x 的部分[l, i);
  • 還未處理數(shù)的部分[i, r];
  • 大于 x 的部分(r, length);

圖片圖片tDA28資訊網(wǎng)——每日最新資訊28at.com

在進(jìn)行排序是,我們劃分結(jié)構(gòu)讀取的是 [i, r) 區(qū)間的值。 在 [i, r) 區(qū)間中的值 x 取值只可能是下面 3 種情況:tDA28資訊網(wǎng)——每日最新資訊28at.com

  • x 屬于 [0, l) 區(qū)間;
  • x 屬于 [l, i) 區(qū)間;
  • x 屬于 (r, length) 區(qū)間;

快速排序的目的就是將[i, r]區(qū)間的取,全部插入到其他區(qū)間,完成排序操作。tDA28資訊網(wǎng)——每日最新資訊28at.com

1. x 屬于 [0, l) 區(qū)間

如果 x 屬于 [0, l) 區(qū)間,那么我們就需要將 x 插到 [0, l) 區(qū)間。tDA28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片tDA28資訊網(wǎng)——每日最新資訊28at.com

將 x 插入到 [0, l) 這個(gè)區(qū)間除了像插入排序一樣一個(gè)一個(gè)地移動(dòng),還有沒(méi)有更好的辦法呢?tDA28資訊網(wǎng)——每日最新資訊28at.com

答案是,有,我并不需要一個(gè)一個(gè)移動(dòng)!因?yàn)?[l, i) 區(qū)間里面全都是等于 x 的部分,只需要將的 nums[l] 與 nums[i] 進(jìn)行交換即可。這就回答了第一個(gè)問(wèn)題?為什么我們?cè)诠?jié)點(diǎn)排序處理是通過(guò) swap 操作?tDA28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片tDA28資訊網(wǎng)——每日最新資訊28at.com

這時(shí)候整個(gè)[l, i) 區(qū)間整體向右平移一步,整個(gè)[i, r) 區(qū)間也整體向右平移一步。所以需要執(zhí)行 l++, i++。tDA28資訊網(wǎng)——每日最新資訊28at.com

if (a[i] < x) {  swap(a, l++, i++);}

2. 如果 x 屬于 [l, i) 區(qū)間

如果 x 屬于 [l, i) 區(qū)間,也就是等于 x 的部分,那么我們就需要將 x 插到 [l, i) 區(qū)間,這里就比較簡(jiǎn)單了,只需要為  [l, i) 區(qū)間擴(kuò)展一下就好了。相當(dāng)于在  [l, i) 區(qū)間添加了一個(gè)元素,所以需要執(zhí)行  i++。tDA28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片tDA28資訊網(wǎng)——每日最新資訊28at.com

else if (a[i] === x) {  i++;}

3. 如果 x 屬于 (r, length) 區(qū)間

如果 x 屬于 (r, length) 區(qū)間,也就是大于 x 的部分,那么我們就需要將 x 插到  (r, length) 區(qū)間,相當(dāng)于 (r, length)區(qū)間向左平移了一步,這時(shí)候 r--。tDA28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片tDA28資訊網(wǎng)——每日最新資訊28at.com

else {  swap(a, r--, i);}

最終狀態(tài):所有的數(shù)都被處理之后,[i, r] 區(qū)間肯定為空集。由于兩邊都是取閉,那么必然當(dāng) i > r 的時(shí)候,[i, r] 才是空集。原本的四個(gè)區(qū)間,變成三個(gè)區(qū)間。tDA28資訊網(wǎng)——每日最新資訊28at.com

  • [0, l)  小于 x 的區(qū)間
  • [l, i)  等于 x 的區(qū)間
  • [i, length) 大于 x 的區(qū)間。

注意此時(shí)由于 i > r,實(shí)際上 i = r + 1,那么區(qū)間 (r, length) 就是 [i, length)。 由于最終狀態(tài)是將一個(gè)亂序的數(shù)組切分成三部分,所以這個(gè)方法又叫三路切分。tDA28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái)我們看一個(gè)例子:tDA28資訊網(wǎng)——每日最新資訊28at.com

列1:只出現(xiàn)一次的數(shù)字

給你一個(gè) 非空 整數(shù)數(shù)組 nums ,除了某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次。找出那個(gè)只出現(xiàn)了一次的元素。 你必須設(shè)計(jì)并實(shí)現(xiàn)線性時(shí)間復(fù)雜度的算法來(lái)解決此問(wèn)題,且該算法只使用常量額外空間。tDA28資訊網(wǎng)——每日最新資訊28at.com

示例 1 :輸入:nums = [2,2,1]輸出:1示例 2 :輸入:nums = [4,1,2,1,2]輸出:4示例 3 :輸入:nums = [1]輸出:1

這道題目想想用“三路切分”如何實(shí)現(xiàn)?tDA28資訊網(wǎng)——每日最新資訊28at.com

任意選中一個(gè)數(shù)字 x ,將數(shù)組分成三份,那么是不是會(huì)出現(xiàn)三種情況?tDA28資訊網(wǎng)——每日最新資訊28at.com

  • 第一種:只出現(xiàn)一次的數(shù)字在 x 左邊,那么左邊區(qū)域的長(zhǎng)度為奇數(shù),因?yàn)槠渌臄?shù)都是出現(xiàn)了兩次。
  • 第二種:選中的 x 就是只出現(xiàn)一次的數(shù)組,左右兩邊區(qū)間長(zhǎng)度都為偶數(shù)。
  • 第三種:只出現(xiàn)一次的數(shù)在右邊,那么右區(qū)間的長(zhǎng)度為奇數(shù)。

通過(guò)分析可知 3 種情況中,只有第二種情況得到了結(jié)果。而第一種情況只出現(xiàn) 1 次的數(shù)在左區(qū)間時(shí),只需要遞歸地處理左區(qū)間;第三種情況只出現(xiàn) 1 次的數(shù)在右區(qū)間時(shí),只需要遞歸地處理右區(qū)間。tDA28資訊網(wǎng)——每日最新資訊28at.com

function swap(A, i, j) {  const t = A[i];  A[i] = A[j];  A[j] = t;}function threeSplit(a, b, e) {  // 邊界情況  if (b >= e) {      return 0;    }  /*********************核心代碼****************************/  // 第一步:劃分子結(jié)構(gòu)  const mid = b + ((e - b) >> 1);  // 第二步:獲取根節(jié)點(diǎn)信息 x  const x = a[mid];  // 根據(jù) x 將數(shù)組一分為三 【三路切分】  let l = b;  let i = b;  let r = e - 1;  while(i <= r) {      if (a[i] < x) {          // 小于 x 的部分          swap(a, l++, i++);      } else if (a[i] === x) {          // 等于 x 的部分          i++;      } else {          // 大于 x 的部分          swap(a, r--, i);      }  }  // 第三步:將根節(jié)點(diǎn)的信息傳遞左右子子樹(shù)  // 切分完畢之后,只有三個(gè)區(qū)間  // [b, l) [l, i) [i, N)  // 中間區(qū)間  if ((i - l) === 1) {    return a[l]  }  // 左區(qū)間  if (((l - b) % 2) == 1) {    return threeSplit(a, b, l);  }  // 右區(qū)間  return threeSplit(a, i, e);  /*********************核心代碼****************************/}// 主函數(shù)function main(nums) {  if (nums == null || nums.length <= 0) {    return 0;  }  return threeSplit(nums, 0, nums.length);}

總結(jié)

盡管與位運(yùn)算相比,這種解法算不上最優(yōu),不過(guò)也不失一種有趣的解法。數(shù)組其實(shí)是另外一種形式的二叉樹(shù),只不過(guò)有時(shí)候需要我們動(dòng)態(tài)地把左/右子樹(shù)給切分出來(lái),不同的切分方式,可以解決不同的問(wèn)題。tDA28資訊網(wǎng)——每日最新資訊28at.com

參考

  • https://kaiwu.lagou.com/course/courseInfo.htm?courseId=685#/detail/pc?id=6697
  • https://leetcode.cn/problems/single-number/description/
  • https://juejin.cn/post/7287473826060304445
  • https://juejin.cn/post/7286307632193273915

本文鏈接:http://www.www897cc.com/showinfo-26-12682-0.html你知道“二分”,那你知道“三路切分”嗎?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 推薦兩款 IntelliJ Idea 插件神器,非常好用!

下一篇: Node.js 做 Web 后端的優(yōu)勢(shì)在哪?為什么是明智的選擇?

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場(chǎng)的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號(hào)為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號(hào)的橫向折疊屏,而是跟別的廠商一樣采用了較為常見(jiàn)的
  • 官方承諾:K60至尊版將會(huì)首批升級(jí)MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會(huì)搭載天璣9200+處理器和獨(dú)顯芯片X7的同時(shí),Redmi給出了官方承諾,K60至尊重大更新首批升級(jí),會(huì)首批推送MIUI 15。也就是說(shuō)雖然
  • Redmi Buds 4開(kāi)箱簡(jiǎn)評(píng):才199還有降噪 可以無(wú)腦入

    在上個(gè)月舉辦的Redmi Note11T Pro系列新機(jī)發(fā)布會(huì)上,除了兩款手機(jī)新品之外,Redmi還帶來(lái)了兩款TWS真無(wú)線藍(lán)牙耳機(jī)產(chǎn)品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們?cè)赗edmi Note11T
  • 6月安卓手機(jī)性價(jià)比榜:Note 12 Turbo斷層式碾壓

    6月份有一個(gè)618,雖然這是京東周年慶的日子,但別的電商也都不約而同的跟進(jìn)了,反正促銷沒(méi)壞處,廠商和用戶都能滿意。618期間一些產(chǎn)品也出現(xiàn)了歷史低價(jià),那么各個(gè)價(jià)位段的產(chǎn)品性價(jià)比
  • Java NIO內(nèi)存映射文件:提高文件讀寫(xiě)效率的優(yōu)秀實(shí)踐!

    Java的NIO庫(kù)提供了內(nèi)存映射文件的支持,它可以將文件映射到內(nèi)存中,從而可以更快地讀取和寫(xiě)入文件數(shù)據(jù)。本文將對(duì)Java內(nèi)存映射文件進(jìn)行詳細(xì)的介紹和演示。內(nèi)存映射文件概述內(nèi)存
  • Flowable工作流引擎的科普與實(shí)踐

    一.引言當(dāng)我們?cè)谌粘9ぷ骱蜆I(yè)務(wù)中需要進(jìn)行各種審批流程時(shí),可能會(huì)面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動(dòng)處理這些審批流程可能會(huì)導(dǎo)致開(kāi)發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時(shí)候了!學(xué)弟,最近學(xué)習(xí)的怎么樣啊 了不起學(xué)弟:最近學(xué)習(xí)的還不錯(cuò),每天都在學(xué)習(xí),每天都在進(jìn)步! 了不起:那你最近學(xué)習(xí)的什么呢? 了不起學(xué)弟:最近在學(xué)習(xí)C
  • 華為HarmonyOS 4升級(jí)計(jì)劃公布:首批34款機(jī)型今日開(kāi)啟公測(cè)

    8月4日消息,今天下午華為正式發(fā)布了HarmonyOS 4系統(tǒng),在更流暢的前提下,還帶來(lái)了不少新功能,UI設(shè)計(jì)也有變化,會(huì)讓手機(jī)煥然一新。華為宣布,首批機(jī)型將會(huì)在
  • 機(jī)構(gòu)稱Q2國(guó)內(nèi)智能手機(jī)銷量同比下滑4% vivo份額重回第1

    7月29日消息,根據(jù)市場(chǎng)調(diào)查機(jī)構(gòu)Counterpoint Research公布的最新報(bào)告,2023年第2季度中國(guó)智能手機(jī)銷量同比下降4%,創(chuàng)新自2014年以來(lái)第2季度銷量新低。報(bào)
Top 主站蜘蛛池模板: 噶尔县| 永新县| 嘉祥县| 会宁县| 沙洋县| 丽江市| 玛曲县| 新沂市| 宁远县| 石城县| 确山县| 叶城县| 正安县| 广元市| 澳门| 鄂托克前旗| 乳山市| 德化县| 法库县| 九龙坡区| 光泽县| 湛江市| 南皮县| 上饶市| 吴旗县| 抚顺县| 镇宁| 鄂托克前旗| 揭东县| 林西县| 葫芦岛市| 德庆县| 东至县| 荣成市| 出国| 奇台县| 普定县| 进贤县| 麦盖提县| 青川县| 榆树市|