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

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-10-10 18:30:28 295觀看
導讀在這里核心就是算法思想叫做"三路切分"。 “三路切分” 曾是 EMC 面試中的???,這個名詞聽起來很高大上,但是簡單來說就是將數組切分成三部分。 我再回憶一下“快速排序”算法。// 交換數組中兩個元素的值 function swa

在這里核心就是算法思想叫做"三路切分"。 “三路切分” 曾是 EMC 面試中的???,這個名詞聽起來很高大上,但是簡單來說就是將數組切分成三部分。 我再回憶一下“快速排序”算法。FKu28資訊網——每日最新資訊28at.com

// 交換數組中兩個元素的值 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;  }    // 第一步:劃分子結構  const mid = b + ((e - b) >> 1);    // 第二步:找到根節點,獲取信息  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);    }  }    // 第三步:將根節點信息傳遞給左右子數組  qsort(a, b, l);  qsort(a, i, e);}// 主函數,將數組nums排序 function  quickSort(nums) {  if (nums == null)    return;  qsort(nums, 0, nums.length);    return nums;}

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

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

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

對于快速排序而言,通過一個整數 x 將數組切分成:FKu28資訊網——每日最新資訊28at.com

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

本質上來說,其實包含四部分:FKu28資訊網——每日最新資訊28at.com

  • 小于 x 部分;
  • 等于 x 的部分;
  • 還未處理數的部分;
  • 大于 x 的部分;

圖片圖片FKu28資訊網——每日最新資訊28at.com

我們假設這四部分分別對于四個區間:FKu28資訊網——每日最新資訊28at.com

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

圖片圖片FKu28資訊網——每日最新資訊28at.com

在進行排序是,我們劃分結構讀取的是 [i, r) 區間的值。 在 [i, r) 區間中的值 x 取值只可能是下面 3 種情況:FKu28資訊網——每日最新資訊28at.com

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

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

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

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

圖片圖片FKu28資訊網——每日最新資訊28at.com

將 x 插入到 [0, l) 這個區間除了像插入排序一樣一個一個地移動,還有沒有更好的辦法呢?FKu28資訊網——每日最新資訊28at.com

答案是,有,我并不需要一個一個移動!因為 [l, i) 區間里面全都是等于 x 的部分,只需要將的 nums[l] 與 nums[i] 進行交換即可。這就回答了第一個問題?為什么我們在節點排序處理是通過 swap 操作?FKu28資訊網——每日最新資訊28at.com

圖片圖片FKu28資訊網——每日最新資訊28at.com

這時候整個[l, i) 區間整體向右平移一步,整個[i, r) 區間也整體向右平移一步。所以需要執行 l++, i++。FKu28資訊網——每日最新資訊28at.com

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

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

如果 x 屬于 [l, i) 區間,也就是等于 x 的部分,那么我們就需要將 x 插到 [l, i) 區間,這里就比較簡單了,只需要為  [l, i) 區間擴展一下就好了。相當于在  [l, i) 區間添加了一個元素,所以需要執行  i++。FKu28資訊網——每日最新資訊28at.com

圖片圖片FKu28資訊網——每日最新資訊28at.com

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

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

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

圖片圖片FKu28資訊網——每日最新資訊28at.com

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

最終狀態:所有的數都被處理之后,[i, r] 區間肯定為空集。由于兩邊都是取閉,那么必然當 i > r 的時候,[i, r] 才是空集。原本的四個區間,變成三個區間。FKu28資訊網——每日最新資訊28at.com

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

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

接下來我們看一個例子:FKu28資訊網——每日最新資訊28at.com

列1:只出現一次的數字

給你一個 非空 整數數組 nums ,除了某個元素只出現一次以外,其余每個元素均出現兩次。找出那個只出現了一次的元素。 你必須設計并實現線性時間復雜度的算法來解決此問題,且該算法只使用常量額外空間。FKu28資訊網——每日最新資訊28at.com

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

這道題目想想用“三路切分”如何實現?FKu28資訊網——每日最新資訊28at.com

任意選中一個數字 x ,將數組分成三份,那么是不是會出現三種情況?FKu28資訊網——每日最新資訊28at.com

  • 第一種:只出現一次的數字在 x 左邊,那么左邊區域的長度為奇數,因為其他的數都是出現了兩次。
  • 第二種:選中的 x 就是只出現一次的數組,左右兩邊區間長度都為偶數。
  • 第三種:只出現一次的數在右邊,那么右區間的長度為奇數。

通過分析可知 3 種情況中,只有第二種情況得到了結果。而第一種情況只出現 1 次的數在左區間時,只需要遞歸地處理左區間;第三種情況只出現 1 次的數在右區間時,只需要遞歸地處理右區間。FKu28資訊網——每日最新資訊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;    }  /*********************核心代碼****************************/  // 第一步:劃分子結構  const mid = b + ((e - b) >> 1);  // 第二步:獲取根節點信息 x  const x = a[mid];  // 根據 x 將數組一分為三 【三路切分】  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);      }  }  // 第三步:將根節點的信息傳遞左右子子樹  // 切分完畢之后,只有三個區間  // [b, l) [l, i) [i, N)  // 中間區間  if ((i - l) === 1) {    return a[l]  }  // 左區間  if (((l - b) % 2) == 1) {    return threeSplit(a, b, l);  }  // 右區間  return threeSplit(a, i, e);  /*********************核心代碼****************************/}// 主函數function main(nums) {  if (nums == null || nums.length <= 0) {    return 0;  }  return threeSplit(nums, 0, nums.length);}

總結

盡管與位運算相比,這種解法算不上最優,不過也不失一種有趣的解法。數組其實是另外一種形式的二叉樹,只不過有時候需要我們動態地把左/右子樹給切分出來,不同的切分方式,可以解決不同的問題。FKu28資訊網——每日最新資訊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你知道“二分”,那你知道“三路切分”嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

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

下一篇: Node.js 做 Web 后端的優勢在哪?為什么是明智的選擇?

標簽:
  • 熱門焦點
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • 印度登月最關鍵一步!月船三號今晚進入環月軌道

    8月5日消息,據印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(niudaocaijing)7月5日,企鵝FM發布官方公告稱由于業務調整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業務走向消亡。騰訊在長音頻領域還在摸索。為
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續發布了最新的折疊屏旗艦,尤其號榮耀Magi
  • iQOO Neo8 Pro搶先上架:首發天璣9200+ 安卓性能之王

    經過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調校的作品。隨著發布時
  • 外交部:美方應停止在網絡安全問題上不負責任地指責他國

      中國外交部今天(16日)舉行例行記者會。會上,有記者問,美國情報官員稱,他們正在阻攔來自中國以及其他國家的黑客獲取相關科研成果。 中方對此有何評論?對此
  • 利用職權私自解除被封帳號 Meta開除20多名員工

    11月18日消息,據外媒援引知情人士表示,過去一年時間內,Facebook母公司Meta解雇或處罰了20多名員工以及合同工,指控這些人通過內部系統以不當方式重置用戶帳號,其
Top 主站蜘蛛池模板: SHOW| 镇原县| 鄂伦春自治旗| 秭归县| 苗栗县| 厦门市| 留坝县| 江北区| 斗六市| 双鸭山市| 常德市| 青冈县| 桦南县| 亳州市| 阿拉尔市| 镇安县| 花莲市| 西平县| 葫芦岛市| 慈利县| 吴江市| 莲花县| 平顶山市| 隆林| 中卫市| 兴仁县| 环江| 安平县| 托里县| 河曲县| 澄江县| 西丰县| 双城市| 子洲县| 宁波市| 兰溪市| 曲沃县| 鄂尔多斯市| 宜良县| 德庆县| 安宁市|