From fe9d51456b27f40c91c731f71e1c3b21e185ad54 Mon Sep 17 00:00:00 2001 From: e2hang <2099307493@qq.com> Date: Tue, 26 Aug 2025 19:13:51 +0800 Subject: [PATCH] B-Tree --- BinaryTree/BalanceTree/B-Tree/BTree.h | 135 ++++++ BinaryTree/BalanceTree/B-Tree/Node.h | 11 + BinaryTree/BalanceTree/B-Tree/README.MD | 574 ++++++++++++++++++++++++ BinaryTree/BalanceTree/B-Tree/main.cpp | 73 +++ 4 files changed, 793 insertions(+) create mode 100644 BinaryTree/BalanceTree/B-Tree/BTree.h create mode 100644 BinaryTree/BalanceTree/B-Tree/Node.h create mode 100644 BinaryTree/BalanceTree/B-Tree/README.MD create mode 100644 BinaryTree/BalanceTree/B-Tree/main.cpp diff --git a/BinaryTree/BalanceTree/B-Tree/BTree.h b/BinaryTree/BalanceTree/B-Tree/BTree.h new file mode 100644 index 0000000..c3444f4 --- /dev/null +++ b/BinaryTree/BalanceTree/B-Tree/BTree.h @@ -0,0 +1,135 @@ +#pragma once +#include +#include "Node.h" +#include +template +class BTree { +private: + Node* root; + int t; //*B-树的阶数(节点最大元素数的一半) + //这里的t最后体现在每个节点上都是t - 1 到 2t - 1 + + void splitChild(Node* _node, int _n); + void insertNonFull(Node* _node, const T& _key); + void inorder(Node* _n) { + if (!_n) return; + + int i = 0; + //关注中序的时候:inorder(children[0]) -> inorder(key[0]) -> inorder(children[1])... 这样保证升序 + for (i = 0; i < _n->keys.size(); i++) { + if (i < _n->children.size()) inorder(_n->children[i]); + std::cout << _n->keys[i] << " "; + } + //已经i++ + if (i < _n->children.size()) inorder(_n->children[i]); + std::cout << std::endl; + } +public: + BTree() = delete; + BTree(int _t) : t(_t), root(nullptr) {} + + void display() { inorder(root); } + void insert(const T& _key); + bool search(Node* _node, const T& _key); + void erase(const T& _key); +}; + +template +inline void BTree::splitChild(Node* _pt, int _i) +{ + //_pt-父节点//_i-第几个子节点//t-中间元素 + Node* p = _pt->children[_i]; + Node* tmp = new Node(p->isLeaf); + int mid = t - 1; + //复制mid右侧 + for (int i = 0; i < mid; i++) { + tmp->keys.push_back(p->keys[t + i]); + } + //不是叶子节点-复制孩子 + if (!p->isLeaf) { + for (int i = 0; i < t; i++) { + tmp->children.push_back(p->children[i + t]); + } + } + T middlekey = p->keys[mid]; + //保留左侧 + p->keys.resize(mid); + if (!p->isLeaf) p->children.resize(t);//t = mid + 1 + + //增加孩子 + _pt->children.insert(_pt->children.begin() + _i + 1, tmp); + //提取中间元素插入上面 + _pt->keys.insert(_pt->keys.begin() + _i, middlekey); +} + +template +inline void BTree::insertNonFull(Node* _node, const T& _key) +{ + int i = _node->keys.size() - 1; + //是叶子节点-先插入后排序O(n) + if (_node->isLeaf) { + _node->keys.push_back(_key); + //向后移位 + while (i >= 0 && _node->keys[i] > _key) { + _node->keys[i + 1] = _node->keys[i]; + i--; + } + _node->keys[i + 1] = _key; + } + //不是叶子节点,递归向下寻找叶子节点 + else { + while (i >= 0 && _node->keys[i] > _key) { + i--; + } + i++;//找到children位置 + //节点满了先分裂 + if (_node->children[i]->keys.size() == 2 * t - 1) { + splitChild(_node, i); + //分裂提升后可能改变关键字位置 + if (_key > _node->keys[i]) i++; + } + insertNonFull(_node->children[i], _key); + } +} + +template +inline void BTree::insert(const T& _key) +{ + //1-树空无root + if (!root) { + root = new Node(true); + root->keys.push_back(_key); + } + //2-有root正常插入 + else { + //root满,分裂根节点 + //重点关注:插入的时候,不管关键字是否上升到根节点,如果根节点满了,都要分裂以防万一 + if (root->keys.size() == 2*t - 1) { + Node* _root = new Node(false); + _root->children.push_back(root); + splitChild(_root, 0); + root = _root; + } + //继续执行 + insertNonFull(root, _key); + } + //当 t = 2,root 目前有 2 个元素,插入一个新元素后,root 会变成 3 个元素(满节点)。此时还不会分裂,分裂逻辑只在下一次插入超过 3 个元素时触发。 +} + +template +inline bool BTree::search(Node* _node, const T& _key) +{ + //可以递归做 + Node* tmp = _node; + int i = 0; + while (tmp->keys[i] < _key && i < tmp->keys.size()) i++; + if (tmp->keys[i] == _key) return true; + if(tmp->isLeaf) return false; + return search(_node->children[i], _key); +} + +template +inline void BTree::erase(const T& _key) +{ + //1-删除叶子 +} diff --git a/BinaryTree/BalanceTree/B-Tree/Node.h b/BinaryTree/BalanceTree/B-Tree/Node.h new file mode 100644 index 0000000..8d30874 --- /dev/null +++ b/BinaryTree/BalanceTree/B-Tree/Node.h @@ -0,0 +1,11 @@ +#pragma once +#include +template +class Node { +public: + std::vector keys; + std::vector*> children; //大小keys.size() + 1 + bool isLeaf; + + Node(bool l) : isLeaf(l) {} +}; \ No newline at end of file diff --git a/BinaryTree/BalanceTree/B-Tree/README.MD b/BinaryTree/BalanceTree/B-Tree/README.MD new file mode 100644 index 0000000..7be146c --- /dev/null +++ b/BinaryTree/BalanceTree/B-Tree/README.MD @@ -0,0 +1,574 @@ + +

B鏍戙丅+鏍戣瑙 - Assassin銇 - 鍗氬鍥 (cnblogs.com)

+

B鏍

+

鍓嶈█銆銆

+

銆銆棣栧厛锛屼负浠涔堣鎬荤粨B鏍戙丅+鏍戠殑鐭ヨ瘑鍛紵鏈杩戝湪瀛︿範鏁版嵁搴撶储寮曡皟浼樼浉鍏崇煡璇嗭紝鏁版嵁搴撶郴缁熸櫘閬嶉噰鐢˙-/+Tree浣滀负绱㈠紩缁撴瀯锛堜緥濡俶ysql鐨処nnoDB寮曟搸浣跨敤鐨凚+鏍戯級锛岀悊瑙d笉閫忓交B鏍戯紝鍒欐棤娉曠悊瑙f暟鎹簱鐨勭储寮曟満鍒讹紱鎺ヤ笅鏉ュ皢鐢ㄦ渶绠娲佺洿鐧界殑鍐呭鏉ヤ簡瑙鏍戙丅+鏍戠殑鏁版嵁缁撴瀯

+

銆銆鍙﹀锛孊-鏍戯紝鍗充负B鏍戙傚洜涓築鏍戠殑鍘熻嫳鏂囧悕绉颁负B-tree锛岃屽浗鍐呭緢澶氫汉鍠滄鎶夿-tree璇戜綔B-鏍戯紝鍏跺疄锛岃繖鏄釜闈炲父涓嶅ソ鐨勭洿璇戯紝寰堝鏄撹浜轰骇鐢熻瑙c傚浜轰滑鍙兘浼氫互涓築-鏍戞槸涓绉嶆爲锛岃孊鏍戝張鏄竴绉嶆爲銆傝屼簨瀹炰笂鏄紝B-tree灏辨槸鎸囩殑B鏍戯紝鐩墠鐞嗚ВB鐨勬剰鎬濅负骞宠 

+

銆銆B鏍戠殑鍑虹幇鏄负浜嗗讥鍚堜笉鍚岀殑瀛樺偍绾у埆涔嬮棿鐨勮闂熷害涓婄殑宸ㄥぇ宸紓锛屽疄鐜伴珮鏁堢殑 I/O銆傚钩琛′簩鍙夋爲鐨勬煡鎵炬晥鐜囨槸闈炲父楂樼殑锛屽苟鍙互閫氳繃闄嶄綆鏍戠殑娣卞害鏉ユ彁楂樻煡鎵剧殑鏁堢巼銆浣嗘槸褰撴暟鎹噺闈炲父澶э紝鏍戠殑瀛樺偍鐨勫厓绱犳暟閲忔槸鏈夐檺鐨勶紝杩欐牱浼氬鑷翠簩鍙夋煡鎵炬爲缁撴瀯鐢变簬鏍戠殑娣卞害杩囧ぇ鑰岄犳垚纾佺洏I/O璇诲啓杩囦簬棰戠箒锛岃繘鑰屽鑷存煡璇㈡晥鐜囦綆涓嬨傚彟澶栨暟鎹噺杩囧ぇ浼氬鑷村唴瀛樼┖闂翠笉澶熷绾冲钩琛′簩鍙夋爲鎵鏈夌粨鐐圭殑鎯呭喌銆侭鏍戞槸瑙e喅杩欎釜闂鐨勫緢濂界殑缁撴瀯

+

 

+

姒傚康

+

銆銆棣栧厛锛孊鏍戜笉瑕佸拰浜屽弶鏍戞贩娣嗭紝鍦璁$畻鏈虹瀛︿腑B鏍鏄竴绉嶈嚜骞宠 鏍戞暟鎹粨鏋锛屽畠缁存姢鏈夊簭鏁版嵁骞跺厑璁镐互瀵规暟鏃堕棿杩涜鎼滅储锛岄『搴忚闂紝鎻掑叆鍜屽垹闄ゃ侭鏍戞槸浜屽弶鎼滅储鏍鐨勪竴鑸寲锛屽洜涓鸿妭鐐瑰彲浠ユ湁涓や釜浠ヤ笂鐨勫瓙鑺傜偣銆[1]涓庡叾浠鑷钩琛′簩杩涘埗鎼滅储鏍戜笉鍚锛孊鏍戦潪甯搁傚悎璇诲彇鍜屽啓鍏ョ浉瀵硅緝澶х殑鏁版嵁鍧楋紙濡傚厜鐩橈級鐨勫瓨鍌ㄧ郴缁熴傚畠閫氬父鐢ㄤ簬鏁版嵁搴鏂囦欢绯荤粺

+

 

+

瀹氫箟

+

B鏍戞槸涓绉嶅钩琛$殑澶氬垎鏍戯紝閫氬父鎴戜滑璇磎闃剁殑B鏍戯紝瀹冨繀椤绘弧瓒冲涓嬫潯浠讹細 

+
    +
  • 姣忎釜鑺傜偣鏈澶氬彧鏈塵涓瓙鑺傜偣銆
  • +
  • 姣忎釜闈炲彾瀛愯妭鐐癸紙闄や簡鏍癸級鍏锋湁鑷冲皯鈱 m/2鈱夊瓙鑺傜偣锛屽惈鏈塩eil(m/2)-1鍒癿-1涓厓绱犮
  • +
  • 濡傛灉鏍逛笉鏄彾鑺傜偣锛屽垯鏍硅嚦灏戞湁涓や釜瀛愯妭鐐广
  • +
  • 鍏锋湁k涓瓙鑺傜偣鐨勯潪鍙惰妭鐐瑰寘鍚k -1涓敭銆
  • +
  • 鎵鏈夊彾瀛愰兘鍑虹幇鍦ㄥ悓涓姘村钩锛屾病鏈変换浣曚俊鎭紙楂樺害涓鑷达級銆
  • +
+

绗竴娆$湅鍒拌繖涓畾涔夌殑鏃跺欙紝鍦ㄦ兂浠涔堥锛熴傘傘傘備粈涔堟槸闃讹紵瀛愯妭鐐广侀鍙跺瓙鐐广佹牴锛燂紵锛熷暐鎰忔濓紒灏戝勾鍒厡銆傘傘

+

浠涔堟槸B鏍戠殑闃 锛

+

B鏍戜腑涓涓妭鐐圭殑瀛愯妭鐐规暟鐩殑鏈澶у硷紝鐢╩琛ㄧず锛屽亣濡傛渶澶у间负10锛屽垯涓10闃讹紝濡傚浘

+

+

鎵鏈夎妭鐐逛腑锛岃妭鐐广13,16,19銆戞嫢鏈夌殑瀛愯妭鐐规暟鐩渶澶氾紝鍥涗釜瀛愯妭鐐癸紙鐏拌壊鑺傜偣锛夛紝鎵浠ュ彲浠ュ畾涔変笂闈㈢殑鍥剧墖涓4闃禕鏍戯紝鐜板湪鎳備粈涔堟槸闃朵簡鍚

+

浠涔堟槸鏍硅妭鐐 锛

+

鑺傜偣銆10銆戝嵆涓烘牴鑺傜偣锛岀壒寰侊細鏍硅妭鐐规嫢鏈夌殑瀛愯妭鐐规暟閲忕殑涓婇檺鍜屽唴閮ㄨ妭鐐圭浉鍚岋紝濡傛灉鏍硅妭鐐逛笉鏄爲涓敮涓鑺傜偣鐨勮瘽锛岃嚦灏戞湁淇╀釜瀛愯妭鐐癸紙涓嶇劧灏卞彉鎴愬崟鏀簡锛夈鍦╩闃禕鏍戜腑锛堟牴鑺傜偣闈炴爲涓敮涓鑺傜偣锛夛紝閭d箞鏍圭粨鐐规湁鍏崇郴寮2<= M <=m锛孧涓哄瓙鑺傜偣鏁伴噺锛涘寘鍚殑鍏冪礌鏁伴噺 1<= K <=m-1,K涓哄厓绱犳暟閲忋

+

浠涔堟槸鍐呴儴鑺傜偣 锛

+

鑺傜偣銆13,16,19銆戙佽妭鐐广3,6銆戦兘涓哄唴閮ㄨ妭鐐癸紝鐗瑰緛锛鍐呴儴鑺傜偣鏄櫎鍙跺瓙鑺傜偣鍜屾牴鑺傜偣涔嬪鐨勬墍鏈夎妭鐐癸紝鎷ユ湁鐖惰妭鐐瑰拰瀛愯妭鐐銆傚亣瀹歮闃禕鏍戠殑鍐呴儴鑺傜偣鐨勫瓙鑺傜偣鏁伴噺涓篗锛屽垯涓瀹氳绗﹀悎锛坢/2锛<=  M <=m鍏崇郴寮忥紝鍖呭惈鍏冪礌鏁伴噺M-1锛涘寘鍚殑鍏冪礌鏁伴噺 锛坢/2锛-1<= K <=m-1,K涓哄厓绱犳暟閲忋俶/2鍚戜笂鍙栨暣

+

浠涔堟槸鍙跺瓙鑺傜偣锛

+

鑺傜偣銆1,2銆戙佽妭鐐广11,12銆戠瓑鏈鍚庝竴灞傞兘涓哄彾瀛愯妭鐐癸紝鍙跺瓙鑺傜偣瀵瑰厓绱犵殑鏁伴噺鏈夌浉鍚岀殑闄愬埗锛屼絾鏄病鏈夊瓙鑺傜偣锛屼篃娌℃湁鎸囧悜瀛愯妭鐐圭殑鎸囬拡銆傜壒寰侊細鍦╩闃禕鏍戜腑鍙跺瓙鑺傜偣鐨勫厓绱犵鍚堬紙m/2锛-1<= K <=m-1銆

+

濂戒簡锛屾蹇靛凡缁忔竻妤氾紝涓嶇敤鐫鎬ヨ儗鍏紡锛 鎺ョ潃寰涓嬬湅

+

 

+

鎻掑叆

+

閽堝m闃堕珮搴鐨凚鏍戯紝鎻掑叆涓涓厓绱犳椂锛岄鍏堝湪B鏍戜腑鏄惁瀛樺湪锛屽鏋滀笉瀛樺湪锛屽嵆鍦ㄥ彾瀛愮粨鐐瑰缁撴潫锛岀劧鍚庡湪鍙跺瓙缁撶偣涓彃鍏ヨ鏂扮殑鍏冪礌銆

+
    +
  • 鑻ヨ鑺傜偣鍏冪礌涓暟灏忎簬m-1锛岀洿鎺ユ彃鍏ワ紱
  • +
  • 鑻ヨ鑺傜偣鍏冪礌涓暟绛変簬m-1锛屽紩璧疯妭鐐瑰垎瑁傦紱浠ヨ鑺傜偣涓棿鍏冪礌涓哄垎鐣岋紝鍙栦腑闂村厓绱狅紙鍋舵暟涓暟锛屼腑闂翠袱涓殢鏈洪夊彇锛夋彃鍏ュ埌鐖惰妭鐐逛腑锛
  • +
  • 閲嶅涓婇潰鍔ㄤ綔锛岀洿鍒版墍鏈夎妭鐐圭鍚圔鏍戠殑瑙勫垯锛涙渶鍧忕殑鎯呭喌涓鐩村垎瑁傚埌鏍硅妭鐐癸紝鐢熸垚鏂扮殑鏍硅妭鐐癸紝楂樺害澧炲姞1锛
  • + + +
+

涓婇潰涓夋璇濅负鎻掑叆鍔ㄤ綔鐨勬牳蹇冿紝鎺ヤ笅鏉ヤ互5闃禕鏍戜负渚嬶紝璇︾粏璁茶В鎻掑叆鐨勫姩浣滐紱

+

5闃禕鏍戝叧閿偣:

+
    +
  • 2<=鏍硅妭鐐瑰瓙鑺傜偣涓暟<=5
  • +
  • 3<=鍐呰妭鐐瑰瓙鑺傜偣涓暟<=5
  • +
  • 1<=鏍硅妭鐐瑰厓绱犱釜鏁<=4
  • +
  • 2<=闈炴牴鑺傜偣鍏冪礌涓暟<=4
  • + + +
+

     鎻掑叆8          

+

鍥撅紙1锛夋彃鍏ュ厓绱犮8銆戝悗鍙樹负鍥撅紙2锛夛紝姝ゆ椂鏍硅妭鐐瑰厓绱犱釜鏁颁负5锛屼笉绗﹀悎 1<=鏍硅妭鐐瑰厓绱犱釜鏁<=4锛岃繘琛屽垎瑁傦紙鐪熷疄鎯呭喌鏄厛鍒嗚锛岀劧鍚庢彃鍏ュ厓绱狅紝杩欓噷鏄负浜嗙洿瑙傝屽厛鎻掑叆鍏冪礌锛屼笅闈㈢殑鎿嶄綔閮戒竴鏍凤紝涓嶅啀璧樿堪锛夛紝鍙栬妭鐐逛腑闂村厓绱犮7銆戯紝鍔犲叆鍒扮埗鑺傜偣锛屽乏鍙冲垎瑁備负2涓妭鐐癸紝濡傚浘锛3锛

+

+

鎺ョ潃鎻掑叆鍏冪礌銆5銆戯紝銆11銆戯紝銆17銆戞椂锛屼笉闇瑕佷换浣曞垎瑁傛搷浣滐紝濡傚浘锛4锛

+

   

+

鎻掑叆鍏冪礌銆13銆

+

+

鑺傜偣鍏冪礌瓒呭嚭鏈澶ф暟閲忥紝杩涜鍒嗚锛屾彁鍙栦腑闂村厓绱犮13銆戯紝鎻掑叆鍒扮埗鑺傜偣褰撲腑锛屽鍥撅紙6锛

+

    

+

 

+

 鎺ョ潃鎻掑叆鍏冪礌銆6銆戯紝銆12銆戯紝銆20銆戯紝銆23銆戞椂锛屼笉闇瑕佷换浣曞垎瑁傛搷浣滐紝濡傚浘锛7锛

+

+

鎻掑叆銆26銆戞椂锛屾渶鍙崇殑鍙跺瓙缁撶偣绌洪棿婊′簡锛岄渶瑕佽繘琛屽垎瑁傛搷浣滐紝涓棿鍏冪礌銆20銆戜笂绉诲埌鐖惰妭鐐逛腑锛屾敞鎰忛氳繃涓婄Щ涓棿鍏冪礌锛屾爲鏈缁堣繕鏄繚鎸佸钩琛★紝鍒嗚缁撴灉鐨勭粨鐐瑰瓨鍦2涓叧閿瓧鍏冪礌銆

+

+

 

+

鎻掑叆銆4銆戞椂锛屽鑷存渶宸﹁竟鐨勫彾瀛愮粨鐐硅鍒嗚锛屻4銆戞伆濂戒篃鏄腑闂村厓绱狅紝涓婄Щ鍒扮埗鑺傜偣涓紝鐒跺悗鍏冪礌銆16銆,銆18銆,銆24銆,銆25銆戦檰缁彃鍏ヤ笉闇瑕佷换浣曞垎瑁傛搷浣

+

 

+

鏈鍚庯紝褰撴彃鍏ャ19銆戞椂锛屽惈鏈夈14銆,銆16銆,銆17銆,銆18銆戠殑缁撶偣闇瑕佸垎瑁傦紝鎶婁腑闂村厓绱犮17銆戜笂绉诲埌鐖惰妭鐐逛腑锛屼絾鏄儏鍐垫潵浜嗭紝鐖惰妭鐐逛腑绌洪棿宸茬粡婊′簡锛屾墍浠ヤ篃瑕佽繘琛屽垎瑁傦紝灏嗙埗鑺傜偣涓殑涓棿鍏冪礌銆13銆戜笂绉诲埌鏂板舰鎴愮殑鏍圭粨鐐逛腑锛岃繖鏍峰叿浣撴彃鍏ユ搷浣滅殑瀹屾垚銆

+

+

 

+

鍒犻櫎

+

棣栧厛鏌ユ壘B鏍戜腑闇鍒犻櫎鐨勫厓绱,濡傛灉璇ュ厓绱犲湪B鏍戜腑瀛樺湪锛屽垯灏嗚鍏冪礌鍦ㄥ叾缁撶偣涓繘琛屽垹闄わ紱鍒犻櫎璇ュ厓绱犲悗锛岄鍏堝垽鏂鍏冪礌鏄惁鏈夊乏鍙冲瀛愮粨鐐癸紝濡傛灉鏈夛紝鍒欎笂绉诲瀛愮粨鐐逛腑鐨勬煇鐩歌繎鍏冪礌(鈥滃乏瀛╁瓙鏈鍙宠竟鐨勮妭鐐光濇垨鈥滃彸瀛╁瓙鏈宸﹁竟鐨勮妭鐐光)鍒扮埗鑺傜偣涓紝鐒跺悗鏄Щ鍔ㄤ箣鍚庣殑鎯呭喌锛涘鏋滄病鏈夛紝鐩存帴鍒犻櫎銆

+
    +
  • 鏌愮粨鐐逛腑鍏冪礌鏁扮洰灏忎簬锛坢/2锛-1,(m/2)鍚戜笂鍙栨暣锛屽垯闇瑕佺湅鍏舵煇鐩搁偦鍏勫紵缁撶偣鏄惁涓版弧锛
  • +
  • 濡傛灉涓版弧锛堢粨鐐逛腑鍏冪礌涓暟澶т簬(m/2)-1锛夛紝鍒欏悜鐖惰妭鐐瑰熶竴涓厓绱犳潵婊¤冻鏉′欢锛
  • +
  • 濡傛灉鍏剁浉閭诲厔寮熼兘涓嶄赴婊★紝鍗冲叾缁撶偣鏁扮洰绛変簬(m/2)-1锛屽垯璇ョ粨鐐逛笌鍏剁浉閭荤殑鏌愪竴鍏勫紵缁撶偣杩涜鈥滃悎骞垛濇垚涓涓粨鐐
  • + + +
+

鎺ヤ笅鏉ヨ繕浠5闃禕鏍戜负渚嬶紝璇︾粏璁茶В鍒犻櫎鐨勫姩浣滐紱

+
    +
  • 鍏抽敭瑕侀锛屽厓绱犱釜鏁板皬浜 2锛坢/2 -1锛夊氨鍚堝苟锛屽ぇ浜4锛坢-1锛夊氨鍒嗚
  • + + +
+

濡傚浘渚濇鍒犻櫎渚濇鍒犻櫎銆8銆,銆20銆,銆18銆,銆5銆

+

+

棣栧厛鍒犻櫎鍏冪礌銆8銆戯紝褰撶劧棣栧厛鏌ユ壘銆8銆戯紝銆8銆戝湪涓涓彾瀛愮粨鐐逛腑锛屽垹闄ゅ悗璇ュ彾瀛愮粨鐐瑰厓绱犱釜鏁颁负2锛岀鍚圔鏍戣鍒欙紝鎿嶄綔寰堢畝鍗曪紝鍜变滑鍙渶瑕佺Щ鍔ㄣ11銆戣嚦鍘熸潵銆8銆戠殑浣嶇疆锛岀Щ鍔ㄣ12銆戣嚦銆11銆戠殑浣嶇疆锛堜篃灏辨槸缁撶偣涓垹闄ゅ厓绱犲悗闈㈢殑鍏冪礌鍚戝墠绉诲姩锛

+

 

+

+

 涓嬩竴姝ワ紝鍒犻櫎銆20銆,鍥犱负銆20銆戞病鏈夊湪鍙跺瓙缁撶偣涓紝鑰屾槸鍦ㄤ腑闂寸粨鐐逛腑鎵惧埌锛屽挶浠彂鐜颁粬鐨勭户鎵胯呫23銆(瀛楁瘝鍗囧簭鐨勪笅涓厓绱)锛屽皢銆23銆戜笂绉诲埌銆20銆戠殑浣嶇疆锛岀劧鍚庡皢瀛╁瓙缁撶偣涓殑銆23銆戣繘琛屽垹闄わ紝杩欓噷鎭板ソ鍒犻櫎鍚庯紝璇ュ瀛愮粨鐐逛腑鍏冪礌涓暟澶т簬2锛屾棤闇杩涜鍚堝苟鎿嶄綔銆

+

+

涓嬩竴姝ュ垹闄ゃ18銆戯紝銆18銆戝湪鍙跺瓙缁撶偣涓,浣嗘槸璇ョ粨鐐逛腑鍏冪礌鏁扮洰涓2锛屽垹闄ゅ鑷村彧鏈1涓厓绱狅紝宸茬粡灏忎簬鏈灏忓厓绱犳暟鐩2,鑰岀敱鍓嶉潰鎴戜滑宸茬粡鐭ラ亾锛氬鏋滃叾鏌愪釜鐩搁偦鍏勫紵缁撶偣涓瘮杈冧赴婊★紙鍏冪礌涓暟澶т簬ceil(5/2)-1=2锛夛紝鍒欏彲浠ュ悜鐖剁粨鐐瑰熶竴涓厓绱狅紝鐒跺悗灏嗘渶涓版弧鐨勭浉閭诲厔寮熺粨鐐逛腑涓婄Щ鏈鍚庢垨鏈鍓嶄竴涓厓绱犲埌鐖惰妭鐐逛腑锛屽湪杩欎釜瀹炰緥涓紝鍙崇浉閭诲厔寮熺粨鐐逛腑姣旇緝涓版弧锛3涓厓绱犲ぇ浜2锛夛紝鎵浠ュ厛鍚戠埗鑺傜偣鍊熶竴涓厓绱犮23銆戜笅绉诲埌璇ュ彾瀛愮粨鐐逛腑锛屼唬鏇垮師鏉ャ19銆戠殑浣嶇疆锛屻19銆戝墠绉伙紱鐒躲24銆戝湪鐩搁偦鍙冲厔寮熺粨鐐逛腑涓婄Щ鍒扮埗缁撶偣涓紝鏈鍚庡湪鐩搁偦鍙冲厔寮熺粨鐐逛腑鍒犻櫎銆24銆戯紝鍚庨潰鍏冪礌鍓嶇Щ銆

+

+

鏈鍚庝竴姝ュ垹闄ゃ5銆戯紝 鍒犻櫎鍚庝細瀵艰嚧寰堝闂锛屽洜涓恒5銆戞墍鍦ㄧ殑缁撶偣鏁扮洰鍒氬ソ杈炬爣锛屽垰濂芥弧瓒虫渶灏忓厓绱犱釜鏁帮紙ceil(5/2)-1=2锛,鑰岀浉閭荤殑鍏勫紵缁撶偣涔熸槸鍚屾牱鐨勬儏鍐锛屽垹闄や竴涓厓绱犻兘涓嶈兘婊¤冻鏉′欢锛屾墍浠ラ渶瑕佽鑺傜偣涓庢煇鐩搁偦鍏勫紵缁撶偣杩涜鍚堝苟鎿嶄綔锛涢鍏堢Щ鍔ㄧ埗缁撶偣涓殑鍏冪礌锛堣鍏冪礌鍦ㄤ袱涓渶瑕佸悎骞剁殑涓や釜缁撶偣鍏冪礌涔嬮棿锛変笅绉诲埌鍏跺瓙缁撶偣涓紝鐒跺悗灏嗚繖涓や釜缁撶偣杩涜鍚堝苟鎴愪竴涓粨鐐广鎵浠ュ湪璇ュ疄渚嬩腑锛屽挶浠鍏堝皢鐖惰妭鐐逛腑鐨勫厓绱犮4銆戜笅绉诲埌宸茬粡鍒犻櫎銆5銆戣屽彧鏈夈6銆戠殑缁撶偣涓紝鐒跺悗灏嗗惈鏈夈4銆戝拰銆6銆戠殑缁撶偣鍜屽惈鏈夈1銆,銆3銆戠殑鐩搁偦鍏勫紵缁撶偣杩涜鍚堝苟鎴愪竴涓粨鐐广

+

 

+

涔熻浣犺涓鸿繖鏍峰垹闄ゆ搷浣滃凡缁忕粨鏉熶簡锛屽叾瀹炰笉鐒讹紝鍦ㄧ湅鐪嬩笂鍥撅紝瀵逛簬杩欑鐗规畩鎯呭喌锛屼綘绔嬪嵆浼氬彂鐜扮埗鑺傜偣鍙寘鍚竴涓厓绱犮7銆戯紝娌¤揪鏍囷紙鍥犱负闈炴牴鑺傜偣鍖呮嫭鍙跺瓙缁撶偣鐨勫厓绱燢蹇呴』婊¤冻浜2=<K<=4锛岃屾澶勭殑K=1锛夛紝杩欐槸涓嶈兘澶熸帴鍙楃殑銆濡傛灉杩欎釜闂缁撶偣鐨勭浉閭诲厔寮熸瘮杈冧赴婊★紝鍒欏彲浠ュ悜鐖剁粨鐐瑰熶竴涓厓绱犮傝屾鏃跺厔寮熻妭鐐瑰厓绱犲垰濂戒负2锛屽垰鍒氭弧瓒筹紝鍙兘杩涜鍚堝苟锛岃屾牴缁撶偣涓殑鍞竴鍏冪礌銆13銆戜笅绉诲埌瀛愮粨鐐锛岃繖鏍凤紝鏍戠殑楂樺害鍑忓皯涓灞傘

+

鐪嬪畬鎻掑叆锛屽垹闄わ紝鎯冲繀涔熸妸B鏍戠殑鐗瑰緛鎺屾彙浜嗭紝涓嬮潰鏅強涓嬪叾浠栫煡璇嗭紝鎹釜鑴戝瓙

+

 

+

 

+

纾佺洏IO涓庨璇

+

銆銆璁$畻鏈哄瓨鍌ㄨ澶囦竴鑸垎涓轰袱绉嶏細鍐呭瓨鍌ㄥ櫒(main memory)鍜屽瀛樺偍鍣(external memory)銆 

+

銆銆鍐呭瓨鍌ㄥ櫒涓哄唴瀛橈紝鍐呭瓨瀛樺彇閫熷害蹇紝浣嗗閲忓皬锛屼环鏍兼槀璐碉紝鑰屼笖涓嶈兘闀挎湡淇濆瓨鏁版嵁(鍦ㄤ笉閫氱數鎯呭喌涓嬫暟鎹細娑堝け)銆

+

銆銆澶栧瓨鍌ㄥ櫒鍗充负纾佺洏璇诲彇锛岀鐩樿鍙栨暟鎹潬鐨勬槸鏈烘杩愬姩锛屾瘡娆¤鍙栨暟鎹姳璐圭殑鏃堕棿鍙互鍒嗕负瀵婚亾鏃堕棿銆佹棆杞欢杩熴佷紶杈撴椂闂翠笁涓儴鍒嗭紝瀵婚亾鏃堕棿鎸囩殑鏄鑷傜Щ鍔ㄥ埌鎸囧畾纾侀亾鎵闇瑕佺殑鏃堕棿锛屼富娴佺鐩樹竴鑸湪5ms浠ヤ笅锛涙棆杞欢杩熷氨鏄垜浠粡甯稿惉璇寸殑纾佺洏杞燂紝姣斿涓涓鐩7200杞紝琛ㄧず姣忓垎閽熻兘杞7200娆★紝涔熷氨鏄1绉掗挓鑳借浆120娆★紝鏃嬭浆寤惰繜灏辨槸1/120/2 = 4.17ms锛涗紶杈撴椂闂存寚鐨勬槸浠庣鐩樿鍑烘垨灏嗘暟鎹啓鍏ョ鐩樼殑鏃堕棿锛屼竴鑸湪闆剁偣鍑犳绉掞紝鐩稿浜庡墠涓や釜鏃堕棿鍙互蹇界暐涓嶈銆傞偅涔堣闂竴娆$鐩樼殑鏃堕棿锛屽嵆涓娆$鐩業O鐨勬椂闂寸害绛変簬5+4.17 = 9ms宸﹀彸锛屽惉璧锋潵杩樻尯涓嶉敊鐨勶紝浣嗚鐭ラ亾涓鍙500 -MIPS鐨勬満鍣ㄦ瘡绉掑彲浠ユ墽琛5浜挎潯鎸囦护锛屽洜涓烘寚浠や緷闈犵殑鏄數鐨勬ц川锛屾崲鍙ヨ瘽璇存墽琛屼竴娆O鐨勬椂闂村彲浠ユ墽琛40涓囨潯鎸囦护锛屾暟鎹簱鍔ㄨ緞鍗佷竾鐧句竾涔冭嚦鍗冧竾绾ф暟鎹紝姣忔9姣鐨勬椂闂达紝鏄剧劧鏄釜鐏鹃毦銆備笅鍥炬槸璁$畻鏈虹‖浠跺欢杩熺殑瀵规瘮鍥撅紝渚涘ぇ瀹跺弬鑰冿細

+

+

 銆銆鑰冭檻鍒扮鐩業O鏄潪甯搁珮鏄傜殑鎿嶄綔锛岃绠楁満鎿嶄綔绯荤粺鍋氫簡涓浜涗紭鍖栵紝褰撲竴娆O鏃讹紝涓嶅厜鎶婂綋鍓嶇鐩樺湴鍧鐨勬暟鎹紝鑰屾槸鎶婄浉閭荤殑鏁版嵁涔熼兘璇诲彇鍒板唴瀛樼紦鍐插尯鍐咃紝鍥犱负灞閮ㄩ璇绘у師鐞嗗憡璇夋垜浠紝褰撹绠楁満璁块棶涓涓湴鍧鐨勬暟鎹殑鏃跺欙紝涓庡叾鐩搁偦鐨勬暟鎹篃浼氬緢蹇璁块棶鍒般傛瘡涓娆O璇诲彇鐨勬暟鎹垜浠О涔嬩负涓椤(page)銆傚叿浣撲竴椤垫湁澶氬ぇ鏁版嵁璺熸搷浣滅郴缁熸湁鍏筹紝涓鑸负4k鎴8k锛屼篃灏辨槸鎴戜滑璇诲彇涓椤靛唴鐨勬暟鎹椂鍊欙紝瀹為檯涓婃墠鍙戠敓浜嗕竴娆O锛岃繖涓悊璁哄浜庣储寮曠殑鏁版嵁缁撴瀯璁捐闈炲父鏈夊府鍔┿

+

浜嬪疄1 锛 涓嶅悓瀹归噺鐨勫瓨鍌ㄥ櫒锛岃闂熷害宸紓鎮畩銆

+
    +
  • 纾佺洏(ms绾у埆) << 鍐呭瓨(ns绾у埆)锛 100000鍊
  • +
  • 鑻ュ唴瀛樿闂渶瑕1s锛屽垯涓娆″瀛樿闂渶瑕佷竴澶
  • +
  • 涓轰簡閬垮厤1娆″瀛樿闂紝瀹佹効璁块棶鍐呭瓨100娆...鎵浠ュ皢鏈甯哥敤鐨勬暟鎹瓨鍌ㄥ湪鏈蹇殑瀛樺偍鍣ㄤ腑
  • + + +
+

浜嬪疄2 锛 浠庣鐩樹腑璇 1 B锛屼笌璇诲啓 1KB 鐨勬椂闂存垚鏈嚑涔庝竴鏍

+

浠庝互涓婃暟鎹腑鍙互鎬荤粨鍑轰竴涓亾鐞嗭紝绱㈠紩鏌ヨ鐨勬暟鎹富瑕佸彈闄愪簬纭洏鐨処/O閫熷害锛屾煡璇/O娆℃暟瓒婂皯锛岄熷害瓒婂揩锛屾墍浠鏍戠殑缁撴瀯鎵嶅簲闇姹傝岀敓锛汢鏍戠殑姣忎釜鑺傜偣鐨勫厓绱犲彲浠ヨ涓轰竴娆/O璇诲彇锛屾爲鐨勯珮搴﹁〃绀烘渶澶氱殑I/O娆℃暟锛屽湪鐩稿悓鏁伴噺鐨勬诲厓绱犱釜鏁颁笅锛姣忎釜鑺傜偣鐨勫厓绱犱釜鏁拌秺澶氾紝楂樺害瓒婁綆锛屾煡璇㈡墍闇鐨処/O娆℃暟瓒婂皯锛涘亣璁撅紝涓娆$‖鐩樹竴娆/O鏁版嵁涓8K锛岀储寮曠敤int(4瀛楄妭)绫诲瀷鏁版嵁寤虹珛锛岀悊璁轰笂涓涓妭鐐规渶澶氬彲浠ヤ负2000涓厓绱狅紝2000*2000*2000=8000000000锛80浜挎潯鐨勬暟鎹彧闇3娆/O锛堢悊璁哄硷級锛屽彲鎯宠岀煡锛孊鏍戝仛涓虹储寮曠殑鏌ヨ鏁堢巼鏈夊楂橈紱

+

鍙﹀涔熷彲浠ョ湅鍑哄悓鏍风殑鎬诲厓绱犱釜鏁帮紝鏌ヨ鏁堢巼鍜屾爲鐨勯珮搴﹀瘑鍒囩浉鍏

+

 

+

B鏍戠殑楂樺害

+

涓妫靛惈鏈塏涓诲叧閿瓧鏁扮殑m闃剁殑B鏍戠殑鏈澶ч珮搴︽槸澶氬皯锛

+

銆銆log锛坢/2锛(N+1)/2 + 1  锛宭og浠ワ紙m/2锛変负浣庯紝(N+1)/2鐨勫鏁板啀鍔1

+

绠楁硶濡備笅

+

+

 

+

 

+

 

+

B+鏍

+

 銆銆B+鏍戞槸搴旀枃浠剁郴缁熸墍闇鑰屼骇鐢熺殑B鏍戠殑鍙樺舰鏍戯紝閭d箞鍙兘涓瀹氫細鎯冲埌锛屾棦鐒舵湁浜咮鏍戯紝鍙堝嚭涓涓狟+鏍戯紝閭+鏍戝繀鐒舵槸鏈夊緢澶氫紭鐐圭殑

+

 

+

B+鏍戠殑鐗瑰緛锛

+
    +
  • 鏈塵涓瓙鏍戠殑涓棿鑺傜偣鍖呭惈鏈塵涓厓绱狅紙B鏍戜腑鏄痥-1涓厓绱狅級锛屾瘡涓厓绱犱笉淇濆瓨鏁版嵁锛屽彧鐢ㄦ潵绱㈠紩锛
  • +
  • 鎵鏈夌殑鍙跺瓙缁撶偣涓寘鍚簡鍏ㄩ儴鍏抽敭瀛楃殑淇℃伅锛屽強鎸囧悜鍚湁杩欎簺鍏抽敭瀛楄褰曠殑鎸囬拡锛屼笖鍙跺瓙缁撶偣鏈韩渚濆叧閿瓧鐨勫ぇ灏忚嚜灏忚屽ぇ鐨勯『搴忛摼鎺ャ (鑰孊 鏍戠殑鍙跺瓙鑺傜偣骞舵病鏈夊寘鎷叏閮ㄩ渶瑕佹煡鎵剧殑淇℃伅)锛
  • +
  • 鎵鏈夌殑闈炵粓绔粨鐐瑰彲浠ョ湅鎴愭槸绱㈠紩閮ㄥ垎锛岀粨鐐逛腑浠呭惈鏈夊叾瀛愭爲鏍圭粨鐐逛腑鏈澶э紙鎴栨渶灏忥級鍏抽敭瀛椼 (鑰孊 鏍戠殑闈炵粓鑺傜偣涔熷寘鍚渶瑕佹煡鎵剧殑鏈夋晥淇℃伅)锛
  • + + +
+

 

+

涓轰粈涔堣B+鏍戞瘮B鏍戞洿閫傚悎鏁版嵁搴撶储寮曪紵

+

1锛塀+鏍戠殑纾佺洏璇诲啓浠d环鏇翠綆

+

銆銆B+鏍戠殑鍐呴儴缁撶偣骞舵病鏈夋寚鍚戝叧閿瓧鍏蜂綋淇℃伅鐨勬寚閽堛傚洜姝ゅ叾鍐呴儴缁撶偣鐩稿B 鏍戞洿灏忋濡傛灉鎶婃墍鏈夊悓涓鍐呴儴缁撶偣鐨勫叧閿瓧瀛樻斁鍦ㄥ悓涓鐩樺潡涓紝閭d箞鐩樺潡鎵鑳藉绾崇殑鍏抽敭瀛楁暟閲忎篃瓒婂銆涓娆℃ц鍏ュ唴瀛樹腑鐨勯渶瑕佹煡鎵剧殑鍏抽敭瀛椾篃灏辫秺澶氥傜浉瀵规潵璇碔O璇诲啓娆℃暟涔熷氨闄嶄綆浜嗭紱

+

2锛塀+鏍戞煡璇㈡晥鐜囨洿鍔犵ǔ瀹

+

銆銆鐢变簬闈炵粓缁撶偣骞朵笉鏄渶缁堟寚鍚戞枃浠跺唴瀹圭殑缁撶偣锛岃屽彧鏄彾瀛愮粨鐐逛腑鍏抽敭瀛楃殑绱㈠紩銆傛墍浠ヤ换浣曞叧閿瓧鐨勬煡鎵惧繀椤昏蛋涓鏉′粠鏍圭粨鐐瑰埌鍙跺瓙缁撶偣鐨勮矾銆傛墍鏈夊叧閿瓧鏌ヨ鐨勮矾寰勯暱搴︾浉鍚岋紝瀵艰嚧姣忎竴涓暟鎹殑鏌ヨ鏁堢巼鐩稿綋锛

+

3锛塀+鏍戜究浜庤寖鍥存煡璇紙鏈閲嶈鐨勫師鍥狅紝鑼冨洿鏌ユ壘鏄暟鎹簱鐨勫父鎬侊級

+

銆銆B鏍戝湪鎻愰珮浜咺O鎬ц兘鐨勫悓鏃跺苟娌℃湁瑙e喅鍏冪礌閬嶅巻鐨勬垜鏁堢巼浣庝笅鐨勯棶棰橈紝姝f槸涓轰簡瑙e喅杩欎釜闂锛孊+鏍戝簲鐢ㄨ岀敓銆侭+鏍戝彧闇瑕佸幓閬嶅巻鍙跺瓙鑺傜偣灏卞彲浠ュ疄鐜版暣妫垫爲鐨勯亶鍘嗐傝屼笖鍦ㄦ暟鎹簱涓熀浜庤寖鍥寸殑鏌ヨ鏄潪甯搁绻佺殑锛岃孊鏍戜笉鏀寔杩欐牱鐨勬搷浣滄垨鑰呰鏁堢巼澶綆锛涗笉鎳傚彲浠ョ湅鐪嬭繖绡囪В璇-銆鑼冨洿鏌ユ壘

+

 

+

琛ュ厖锛欱鏍戠殑鑼冨洿鏌ユ壘鐢ㄧ殑鏄腑搴忛亶鍘嗭紝鑰孊+鏍戠敤鐨勬槸鍦ㄩ摼琛ㄤ笂閬嶅巻锛

+

B+鏍戝涓嬶細

+

+

 B+鏍戜粙缁 - wade&luffy - 鍗氬鍥 (cnblogs.com)

+

B+鏍

+

B+鏍戝拰浜屽弶鏍戙佸钩琛′簩鍙夋爲涓鏍凤紝閮芥槸缁忓吀鐨勬暟鎹粨鏋勩侭+鏍戠敱B鏍戝拰绱㈠紩椤哄簭璁块棶鏂规硶锛圛SAM锛屾槸涓嶆槸寰堢啛鎮夛紵瀵癸紝杩欎篃鏄疢yISAM寮曟搸鏈鍒濆弬鑰冪殑鏁版嵁缁撴瀯锛夋紨鍖栬屾潵锛屼絾鏄湪瀹為檯浣跨敤杩囩▼涓嚑涔庡凡缁忔病鏈変娇鐢˙鏍戠殑鎯呭喌浜嗐

+

B+鏍戠殑瀹氫箟鍗佸垎澶嶆潅锛屽洜姝ゅ彧绠瑕佸湴浠嬬粛B+鏍戯細B+鏍戞槸涓虹鐩樻垨鍏朵粬鐩存帴瀛樺彇杈呭姪璁惧鑰岃璁$殑涓绉嶅钩琛℃煡鎵炬爲锛屽湪B+鏍戜腑锛屾墍鏈夎褰曡妭鐐归兘鏄寜閿肩殑澶у皬椤哄簭瀛樻斁鍦ㄥ悓涓灞傜殑鍙惰妭鐐逛腑锛屽悇鍙惰妭鐐规寚閽堣繘琛岃繛鎺ャ

+

鎴戜滑鍏堟潵鐪嬩竴涓狟+鏍戯紝鍏堕珮搴︿负2锛屾瘡椤靛彲瀛樻斁4鏉¤褰曪紝鎵囧嚭锛坒an out锛変负5銆

+

+

鍙互鐪嬪嚭锛屾墍鏈夎褰曢兘鍦ㄥ彾鑺傜偣涓紝骞朵笖鏄『搴忓瓨鏀剧殑锛屽鏋滄垜浠粠鏈宸﹁竟鐨勫彾鑺傜偣寮濮嬮『搴忛亶鍘嗭紝鍙互寰楀埌鎵鏈夐敭鍊肩殑椤哄簭鎺掑簭锛5銆10銆15銆20銆25銆30銆50銆55銆60銆65銆75銆80銆85銆90銆

+

+

B+鏍戠殑鎻掑叆鎿嶄綔

+

B+鏍戠殑鎻掑叆蹇呴』淇濊瘉鎻掑叆鍚庡彾鑺傜偣涓殑璁板綍渚濈劧鎺掑簭锛鍚屾椂闇瑕佽冭檻鎻掑叆B+鏍戠殑涓夌鎯呭喌锛屾瘡绉嶆儏鍐甸兘鍙兘浼氬鑷翠笉鍚岀殑鎻掑叆绠楁硶锛屽琛5-1鎵绀恒 

+

+

鎴戜滑鐢ㄥ疄渚嬫潵鍒嗘瀽B+鏍戠殑鎻掑叆锛屾垜浠彃鍏28杩欎釜閿硷紝鍙戠幇褰撳墠Leaf Page鍜孖ndex Page閮芥病鏈夋弧锛屾垜浠洿鎺ユ彃鍏ュ氨鍙互浜嗐

+

+

杩欐鎴戜滑鍐嶆彃鍏ヤ竴鏉70杩欎釜閿硷紝杩欐椂鍘熷厛鐨凩eaf Page宸茬粡婊′簡锛屼絾鏄疘ndex Page杩樻病鏈夋弧锛岀鍚堣〃5-1鐨勭浜岀鎯呭喌锛岃繖鏃舵彃鍏eaf Page鍚庣殑鎯呭喌涓50銆55銆60銆65銆70銆傛垜浠牴鎹腑闂寸殑鍊60鎷嗗垎鍙惰妭鐐广

+

+

鍥犱负鍥剧墖鏄剧ず鐨勫叧绯伙紝杩欐鎴戞病鏈夎兘鍦ㄥ悇鍙惰妭鐐瑰姞涓婂弻鍚戦摼琛ㄦ寚閽堛傛渶鍚庢垜浠潵鎻掑叆璁板綍95锛岃繖鏃剁鍚堣〃5-1璁ㄨ鐨勭涓夌鎯呭喌锛屽嵆Leaf Page鍜孖ndex Page閮芥弧浜嗭紝杩欐椂闇瑕佸仛涓ゆ鎷嗗垎銆

+

+

 

+

鍙互鐪嬪埌锛屼笉绠℃庝箞鍙樺寲锛孊+鏍戞绘槸浼氫繚鎸佸钩琛銆備絾鏄负浜嗕繚鎸佸钩琛★紝瀵逛簬鏂版彃鍏ョ殑閿煎彲鑳介渶瑕佸仛澶ч噺鐨勬媶鍒嗛〉锛坰plit锛夋搷浣滐紝鑰孊+鏍戜富瑕佺敤浜庣鐩橈紝鍥犳椤电殑鎷嗗垎鎰忓懗鐫纾佺洏鐨勬搷浣滐紝搴旇鍦ㄥ彲鑳界殑鎯呭喌涓嬪敖閲忓噺灏戦〉鐨勬媶鍒嗐傚洜姝わ紝B+鏍戞彁渚涗簡鏃嬭浆锛坮otation锛夌殑鍔熻兘銆

+

鏃嬭浆鍙戠敓鍦↙eaf Page宸茬粡婊′簡銆佷絾鏄叾宸﹀彸鍏勫紵鑺傜偣娌℃湁婊$殑鎯呭喌涓嬨杩欐椂B+鏍戝苟涓嶄細鎬ヤ簬鍘诲仛鎷嗗垎椤电殑鎿嶄綔锛岃屾槸灏嗚褰曠Щ鍒版墍鍦ㄩ〉鐨勫厔寮熻妭鐐逛笂銆傞氬父鎯呭喌涓嬶紝宸﹀厔寮熻棣栧厛妫鏌ョ敤鏉ュ仛鏃嬭浆鎿嶄綔锛岃繖鏃舵垜浠彃鍏ラ敭鍊70锛屽叾瀹濨+鏍戝苟涓嶄細鎬ヤ簬鍘绘媶鍒嗗彾鑺傜偣锛岃屾槸鍋氭棆杞紝50锛55锛55鏃嬭浆銆

+

 

+

鍙互鐪嬪埌锛岄噰鐢ㄦ棆杞搷浣滀娇B+鏍戝噺灏戜簡涓娆¢〉鐨勬媶鍒嗘搷浣滐紝鑰岃繖鏃禕+鏍戠殑楂樺害渚濈劧杩樻槸2銆

+

+

B+鏍戠殑鍒犻櫎鎿嶄綔

+

B+鏍戜娇鐢ㄥ~鍏呭洜瀛愶紙fill factor锛夋潵鎺у埗鏍戠殑鍒犻櫎鍙樺寲锛50%鏄~鍏呭洜瀛愬彲璁剧殑鏈灏忓笺侭+鏍戠殑鍒犻櫎鎿嶄綔鍚屾牱蹇呴』淇濊瘉鍒犻櫎鍚庡彾鑺傜偣涓殑璁板綍渚濈劧鎺掑簭锛屽悓鎻掑叆涓鏍凤紝B+鏍戠殑鍒犻櫎鎿嶄綔鍚屾牱闇瑕佽冭檻濡傝〃5-2鎵绀虹殑涓夌鎯呭喌锛屼笌鎻掑叆涓嶅悓鐨勬槸锛屽垹闄ゆ牴鎹~鍏呭洜瀛愮殑鍙樺寲鏉ヨ 閲忋 

+

+

棣栧厛锛屽垹闄ら敭鍊间负70鐨勮繖鏉¤褰曪紝璇ヨ褰曠鍚堣〃5-2璁ㄨ鐨勭涓绉嶆儏鍐碉紝鍒犻櫎鍚庛

+

+

鎺ョ潃鎴戜滑鍒犻櫎閿间负25鐨勮褰曪紝杩欎篃鏄〃5-2璁ㄨ鐨勭涓绉嶆儏鍐碉紝浣嗘槸璇ュ艰繕鏄疘ndex Page涓殑鍊硷紝鍥犳鍦ㄥ垹闄eaf Page涓25鐨勫煎悗锛岃繕搴斿皢25鐨勫彸鍏勫紵鑺傜偣鐨28鏇存柊鍒癙age Index涓紝鏈鍚庡彲寰楀埌鍥俱

+

+

鏈鍚庢垜浠潵鐪嬪垹闄ら敭鍊间负60鐨勬儏鍐碉紝鍒犻櫎Leaf Page涓敭鍊间负60鐨勮褰曞悗锛屽~鍏呭洜瀛愬皬浜50%锛岃繖鏃堕渶瑕佸仛鍚堝苟鎿嶄綔锛屽悓鏍凤紝鍦ㄥ垹闄ndex Page涓浉鍏宠褰曞悗闇瑕佸仛Index Page鐨勫悎骞舵搷浣滐紝鏈鍚庡緱鍒板浘銆

+

+

绾㈤粦鏍戯紝瓒呭己鍔ㄩ潤鍥捐瑙o紝绠鍗曟槗鎳 - 鐭ヤ箮 (zhihu.com)

+

绾㈤粦鏍

+

绾㈤粦鏍戯紝Red-Black Tree 銆孯BT銆嶆槸涓涓嚜骞宠 (涓嶆槸缁濆鐨勫钩琛)鐨勪簩鍙夋煡鎵炬爲(BST)锛屾爲涓婄殑姣忎釜鑺傜偣閮介伒寰笅闈㈢殑瑙勫垯:

+
    +
  1. 姣忎釜鑺傜偣閮芥湁绾㈣壊鎴栭粦鑹
  2. +
  3. 鏍戠殑鏍瑰缁堟槸榛戣壊鐨 (榛戝湡鍦板瓡鑲查粦鏍戞牴锛 )
  4. +
  5. 娌℃湁涓や釜鐩搁偦鐨勭孩鑹茶妭鐐癸紙绾㈣壊鑺傜偣涓嶈兘鏈夌孩鑹茬埗鑺傜偣鎴栫孩鑹插瓙鑺傜偣锛屽苟娌℃湁璇翠笉鑳藉嚭鐜拌繛缁殑榛戣壊鑺傜偣锛
  6. +
  7. 浠庤妭鐐癸紙鍖呮嫭鏍癸級鍒板叾浠讳綍鍚庝唬NULL鑺傜偣(鍙跺瓙缁撶偣涓嬫柟鎸傜殑涓や釜绌鸿妭鐐癸紝骞朵笖璁や负浠栦滑鏄粦鑹茬殑)鐨勬瘡鏉¤矾寰勯兘鍏锋湁鐩稿悓鏁伴噺鐨勯粦鑹茶妭鐐
  8. + +
+

鐬棿鎳甸硷紵浜嗚В涓涓嬪嵃璞″氨琛岋紝寮濮嬬帺榄旀柟閮芥槸瑕佺収鐫榄旀柟鍏紡涓鐐圭偣鐜╃殑锛屽鐜╁嚑娆″氨鐔熸倝浜嗐傜孩榛戞爲涔熶竴鏍凤紝绾㈤粦鏍戞湁涓ゅぇ鎿嶄綔:

+
    +
  1. recolor (閲嶆柊鏍囪榛戣壊鎴栫孩鑹)
  2. +
  3. rotation (鏃嬭浆锛岃繖鏄爲杈惧埌骞宠 鐨勫叧閿)
  4. + +
+

浜. 绾㈤粦鏍戣鍒欑壒鐐

+

绾㈤粦鏍戝叿浣撴湁鍝簺瑙勫垯鐗圭偣鍛紵

+
    +
  1. 鑺傜偣鍒嗕负绾㈣壊鎴栬呴粦鑹诧紱
  2. +
  3. 鏍硅妭鐐瑰繀涓洪粦鑹诧紱
  4. +
  5. 鍙跺瓙鑺傜偣閮戒负榛戣壊锛屼笖涓簄ull锛
  6. +
  7. 杩炴帴绾㈣壊鑺傜偣鐨勪袱涓瓙鑺傜偣閮戒负榛戣壊锛堢孩榛戞爲涓嶄細鍑虹幇鐩搁偦鐨勭孩鑹茶妭鐐癸級锛
  8. +
  9. 浠庝换鎰忚妭鐐瑰嚭鍙戯紝鍒板叾姣忎釜鍙跺瓙鑺傜偣鐨勮矾寰勪腑鍖呭惈鐩稿悓鏁伴噺鐨勯粦鑹茶妭鐐癸紱
  10. +
  11. 鏂板姞鍏ュ埌绾㈤粦鏍戠殑鑺傜偣涓虹孩鑹茶妭鐐癸紱
  12. + +
+

瑙勫垯鐪嬬潃濂藉儚鎸哄锛屾病閿欙紝鍥犱负绾㈤粦鏍戜篃鏄潎琛′簩鍙夋爲锛岄渶瑕佸叿澶囪嚜鍔ㄧ淮鎸佸钩琛$殑鎬ц川锛屼笂闈㈢殑6鏉″氨鏄孩榛戞爲缁欏嚭鐨勮嚜鍔ㄧ淮鎸佸钩琛℃墍闇瑕佸叿澶囩殑瑙勫垯

+

鎴戜滑鐪嬩竴鐪嬩竴涓吀鍨嬬殑绾㈤粦鏍戝埌搴曟槸浠涔堟牱鍎匡紵

+

+

棣栧厛瑙h涓涓嬭鍒欙紝闄や簡瀛楅潰涓婄湅鍒扮殑鎰忔濓紝杩橀殣钘忎簡鍝簺鎰忔濆憿锛

+

绗竴. 浠庢牴鑺傜偣鍒板彾瀛愯妭鐐圭殑鏈闀胯矾寰勪笉澶т簬鏈鐭矾寰勭殑2鍊

+

  鎬庝箞鏍风殑璺緞绠楁渶鐭矾寰勶紵

+

  浠庤鍒5涓紝鎴戜滑鐭ラ亾浠庢牴鑺傜偣鍒版瘡涓彾瀛愯妭鐐圭殑榛戣壊鑺傜偣鏁伴噺鏄竴鏍风殑锛岄偅涔堢函鐢遍粦鑹茶妭鐐圭粍鎴愮殑璺緞灏辨槸鏈鐭矾寰勶紱

+

  浠涔堟牱鐨勮矾寰勭畻鏄渶闀胯矾寰勶紵

+

  鏍规嵁瑙勫垯4鍜岃鍒3锛岃嫢鏈夌孩鑹茶妭鐐癸紝鍒欏繀鐒舵湁涓涓繛鎺ョ殑榛戣壊鑺傜偣锛屽綋绾㈣壊鑺傜偣鍜岄粦鑹茶妭鐐规暟閲忕浉鍚屾椂锛屽氨鏄渶闀胯矾寰勶紝涔熷氨鏄粦鑹茶妭鐐癸紙鎴栫孩鑹茶妭鐐癸級* 2

+

绗簩. 涓轰粈涔堣鏂板姞鍏ュ埌绾㈤粦鏍戜腑鐨勮妭鐐逛负绾㈣壊鑺傜偣

+

 浠庤鍒4涓煡閬擄紝褰撳墠绾㈤粦鏍戜腑浠庢牴鑺傜偣鍒版瘡涓彾瀛愯妭鐐圭殑榛戣壊鑺傜偣鏁伴噺鏄竴鏍风殑锛屾鏃跺亣濡傛柊鐨勯粦鑹茶妭鐐圭殑璇濓紝蹇呯劧鐮村潖瑙勫垯锛屼絾鍔犲叆绾㈣壊鑺傜偣鍗翠笉涓瀹氾紝闄ら潪鍏剁埗鑺傜偣灏辨槸绾㈣壊鑺傜偣锛屽洜姝ゅ姞鍏ョ孩鑹茶妭鐐癸紝鐮村潖瑙勫垯鐨勫彲鑳芥у皬涓浜涳紝涓嬮潰鎴戜滑涔熶細涓句緥鏉ヨ鏄庛

+

浠涔堟儏鍐典笅锛岀孩榛戞爲鐨勭粨鏋勪細琚牬鍧忓憿锛熺牬鍧忓悗鍙堟庝箞缁存寔骞宠 锛岀淮鎸佸钩琛′富瑕侀氳繃涓ょ鏂瑰紡銆鍙樿壊銆戝拰銆鏃嬭浆銆戯紝銆鏃嬭浆銆戝張鍒嗐宸︽棆銆戝拰銆鍙虫棆銆戯紝涓ょ鏂瑰紡鍙浉浜掔粨鍚堛

+

 

+

鎴戜滑浼氬厛灏濊瘯 recolor锛屽鏋 recolor 涓嶈兘杈惧埌绾㈤粦鏍戠殑 4 鐐硅姹傦紝鐒跺悗鎴戜滑灏濊瘯 rotation锛屽叾瀹炵孩榛戞爲鐨勫叧閿帺娉曞氨鏄紕娓呮 recolor 鍜 rotation 鐨勮鍒欙紝鎺ヤ笅鏉ョ湅鐪嬭缁嗙殑绠楁硶鍏紡鍚 鍗冧竾鍒潃鎬ヨ蹇嗗叕寮忥紝鏈夊浘绀轰細閫愭璇存槑锛屽氨鍍忛瓟鏂逛竴鏍凤紝澶氱帺鍑犳灏辨噦浜:
鍋囪鎴戜滑鎻掑叆鐨勬柊鑺傜偣涓 X

+
    +
  1. 灏嗘柊鎻掑叆鐨勮妭鐐规爣璁颁负绾㈣壊
  2. +
  3. 濡傛灉 X 鏄牴缁撶偣(root)锛屽垯鏍囪涓洪粦鑹
  4. +
  5. 濡傛灉 X 鐨 parent 涓嶆槸榛戣壊锛屽悓鏃 X 涔熶笉鏄 root:
  6. + + +
+
    +
  • 3.1 濡傛灉 X 鐨 uncle (鍙斿彅) 鏄孩鑹
  • +
      +
    • 3.1.1 灏 parent 鍜 uncle 鏍囪涓洪粦鑹
    • +
    • 3.1.2 灏 grand parent (绁栫埗) 鏍囪涓虹孩鑹
    • +
    • 3.1.3 璁 X 鑺傜偣鐨勯鑹蹭笌 X 绁栫埗鐨勯鑹茬浉鍚岋紝鐒跺悗閲嶅姝ラ 2銆3
    • + + +
    + + +
+

璇濅笉澶氳锛岀湅涓嬪浘

+

+

+

璺熺潃涓婇潰鐨勫叕寮忚蛋:

+
    +
  1. 灏嗘柊鎻掑叆鐨 X 鑺傜偣鏍囪涓虹孩鑹
  2. +
  3. 鍙戠幇 X 鐨 parent (P) 鍚屾牱涓虹孩鑹诧紝杩欒繚鍙嶄簡绾㈤粦鏍戠殑绗笁鏉¤鍒欍屼笉鑳芥湁涓や釜杩炵画鐩搁偦鐨勭孩鑹茶妭鐐广
  4. +
  5. 鍙戠幇 X 鐨 uncle (U) 鍚屾牱涓虹孩鑹
  6. +
  7. 灏 P 鍜 U 鏍囪涓洪粦鑹
  8. +
  9. 灏 X 鍜 X 鐨 grand parent (G) 鏍囪涓虹浉鍚岀殑棰滆壊锛屽嵆绾㈣壊锛岀户缁噸澶嶅叕寮 2銆3
  10. +
  11. 鍙戠幇 G 鏄牴缁撶偣锛屾爣璁颁负榛戣壊
  12. +
  13. 缁撴潫
  14. + + +
+

鍒氬垰璇翠簡 X 鐨 uncle 鏄孩鑹茬殑鎯呭喌锛屾帴涓嬫潵瑕佽鏄粦鑹茬殑鎯呭喌

+
    +
  1. 濡傛灉 X 鐨 parent 涓嶆槸榛戣壊锛屽悓鏃 X 涔熶笉鏄 root:
  2. + + +
+
    +
  • 3.2 濡傛灉 X 鐨 uncle (鍙斿彅) 鏄粦鑹诧紝鎴戜滑瑕佸垎鍥涚鎯呭喌澶勭悊
  • +
      +
    • 3.2.1 宸﹀乏 (P 鏄 G 鐨勫乏瀛╁瓙锛屽苟涓 X 鏄 P 鐨勫乏瀛╁瓙)
    • +
    • 3.2.2 宸﹀彸 (P 鏄 G 鐨勫乏瀛╁瓙锛屽苟涓 X 鏄 P 鐨勫彸瀛╁瓙)
    • +
    • 3.2.3 鍙冲彸 (鍜 3.2.1 闀滃儚杩囨潵锛屾伆濂界浉鍙)
    • +
    • 3.2.4 鍙冲乏 (鍜 3.2.2 闀滃儚杩囨潵锛屾伆濂界浉鍙)
    • + + +
    + + +
+

褰撳嚭鐜 uncle 鏄粦鑹茬殑鏃跺欐垜浠涓姝ヨ鑰冭檻鐨勬槸 鏃嬭浆 锛岃繖閲屽厛璇峰皬浼欎即涓嶈鍏虫敞绾㈤粦鏍戠殑绗 4 鏉¤鍒欙紝涓昏鏄负浜嗘紨绀哄浣曟棆杞殑锛屾潵涓鐐圭偣鐪嬶紝涓嶈鐪嬪浘灏辨厡锛屾湁瑙i噴鐨 :

+

宸﹀乏鎯呭喌

+

杩欑鎯呭喌寰堢畝鍗曪紝鎯宠薄杩欐槸涓鏍圭怀瀛愶紝鎵嬫彁璧 P 鑺傜偣锛岀劧鍚庡彉鑹插嵆鍙

+

+

+

宸﹀彸

+

宸︽棆: 浣 X 鐨勭埗鑺傜偣 P 琚 X 鍙栦唬锛屽悓鏃剁埗鑺傜偣 P 鎴愪负 X 鐨勫乏瀛╁瓙锛岀劧鍚庡啀搴旂敤 宸﹀乏鎯呭喌

+

+

+

鍙冲彸

+

宸﹀乏鎯呭喌涓鏍凤紝鎯宠薄鎴愪竴鏍圭怀瀛

+

+

+

鍙冲乏

+

鍙虫棆: 浣 X 鐨勭埗鑺傜偣 P 琚 X 鍙栦唬锛屽悓鏃剁埗鑺傜偣 P 鎴愪负 X 鐨勫彸瀛╁瓙锛岀劧鍚庡啀搴旂敤 鍙冲彸鎯呭喌

+

+

+

浣犺鐨勫姩鍥惧湪鍝噷锛屼綘涓ぇ楠楀瓙锛屽埆鐫鎬ワ紝鐜板湪灏变负灏忎紮浼翠滑濂変笂鍔ㄥ浘婕旂ず锛屾潵璇存槑鍏紡鐨勪娇鐢:

+

妗堜緥涓

+
鎻掑叆 10锛20锛30锛15 鍒颁竴涓┖鏍戜腑
+
    +
  1. 鍚戠┖鏍戜腑绗竴娆℃彃鍏ユ暟瀛 10锛岃偗瀹氭槸 root 鑺傜偣
  2. +
  3. root 鑺傜偣鏍囪鎴愰粦鑹
  4. + + +
+
+
+ + +
+
    +
  1. 鍚戞爲涓彃鍏ユ柊鑺傜偣 20锛屾爣璁颁负绾㈣壊
  2. +
  3. 20 > 10锛屽苟鍙戠幇 10 娌℃湁鍙跺瓙鑺傜偣锛屽皢鏂拌妭鐐 20 浣滀负 10 鐨勫彸瀛╁瓙
  4. + + +
+
+
+ + +
+
    +
  1. 鍚戞爲涓彃鍏ユ柊鑺傜偣 30锛屾爣璁颁负绾㈣壊
  2. +
  3. 30 > 10锛屾煡鎵 10 鐨勫彸瀛愭爲锛屾壘鍒 20
  4. +
  5. 30 > 20锛岀户缁煡鎵 20 鐨勫彸瀛愭爲锛屽彂鐜 20 娌℃湁鍙跺瓙鑺傜偣锛屽皢鍊兼彃鍦ㄦ澶
  6. +
  7. 30 鍜 20 鑺傜偣閮戒负绾㈣壊锛30 涓哄彸瀛╁瓙锛20 涔熶负鍙冲瀛愶紝瑙﹀彂浜 鍙冲彸鎯呭喌
  8. +
  9. 閫氳繃涓娆℃棆杞紝鎻愯捣 20 鑺傜偣
  10. +
  11. 20 鑺傜偣鏄牴缁撶偣锛屾爣璁颁负榛戣壊
  12. + + +
+
+
+ + +
+
    +
  1. 鍚戞爲涓彃鍏ユ柊鑺傜偣 15锛屾爣璁颁负绾㈣壊
  2. +
  3. 閫氳繃姣斿澶у皬鍜屽垽鏂槸鍚︽湁鍙跺瓙鑺傜偣锛屾渶缁堟彃鍊间负 10 鑺傜偣鐨勫彸瀛╁瓙
  4. +
  5. 15 鍜 10 鑺傜偣閮戒负绾㈣壊锛15 鐨 uncle 鑺傜偣 30 涔熶负绾㈣壊
  6. +
  7. 鎸夌収鍏紡锛屽皢 15 鐨 parent 10 鍜 uncle 30 鏇存敼涓洪粦鑹
  8. +
  9. 璁 15 鑺傜偣 grand parent 20 鐨勯鑹蹭笌 15 鑺傜偣鐨勯鑹蹭竴鏍凤紝鍙樹负绾㈣壊
  10. +
  11. 20 涓烘牴缁撶偣锛屽皢鍏舵敼涓洪粦鑹
  12. + + +
+
+
+ + +
+
缁х画鎻掑叆鍏朵粬鑺傜偣鍙笉杩囧弽澶嶅簲鐢ㄤ笂闈㈢殑鍏紡锛屼笂闈㈠簲鐢ㄥ埌鐨勭孩榛戞爲宸ュ叿锛屽彲浠ユ殏鍋滃姩鐢绘晥鏋滐紝涓甯т竴甯х殑鐪嬬孩榛戞爲鐨勮浆鎹㈣繃绋嬶紝杩欐牱閫氳繃缁冧範锛屾煡鐪嬪叕寮忥紝瑙傚療鍙樺寲涓夌榻愪笅锛岀孩榛戞爲鐨勫叆闂ㄧ悊瑙e簲璇ュ畬鍏ㄤ笉鍐嶆槸闂浜
+
+

鍥. 绾㈤粦鏍戣妭鐐瑰垹闄

+

鐩告瘮杈冧簬绾㈤粦鏍戠殑鑺傜偣鎻掑叆锛屽垹闄よ妭鐐规洿涓哄鏉傦紝鎴戜滑浠庡瓙鑺傜偣鏄惁涓簄ull鍜岀孩鑹蹭负鎬濊冪淮搴︽潵璁ㄨ銆

+

4.1 瀛愯妭鐐硅嚦灏戞湁涓涓负null

+

褰撳緟鍒犻櫎鐨勮妭鐐圭殑瀛愯妭鐐硅嚦灏戞湁涓涓负null鑺傜偣鏃讹紝鍒犻櫎浜嗚鑺傜偣鍚庯紝灏嗗叾鏈夊肩殑鑺傜偣鍙栦唬褰撳墠鑺傜偣鍗冲彲锛岃嫢閮戒负null锛屽垯灏嗗綋鍓嶈妭鐐硅缃负null锛屽綋鐒跺鏋滆繚鍙嶈鍒欎簡锛屽垯鎸夐渶璋冩暣锛屽銆愬彉鑹层戜互鍙娿愭棆杞戙

+

+

4.2 瀛愯妭鐐归兘鏄潪null鑺傜偣

+

杩欑鎯呭喌涓嬶紝

+

绗竴姝ワ細鎵惧埌璇ヨ妭鐐圭殑鍓嶉┍鎴栬呭悗缁

+

鍓嶉┍锛宸﹀瓙鏍戜腑鍊兼渶澶х殑鑺傜偣锛堝彲寰楀嚭鍏舵渶澶氬彧鏈変竴涓潪null瀛愯妭鐐癸紝鍙兘閮戒负null锛夛紱

+

鍚庣户锛鍙冲瓙鏍戜腑鍊兼渶灏忕殑鑺傜偣锛堝彲寰楀嚭鍏舵渶澶氬彧鏈変竴涓潪null瀛愯妭鐐癸紝鍙兘閮戒负null锛夛紱

+

鍓嶉┍鍜屽悗缁ч兘鏄兼渶鎺ヨ繎璇ヨ妭鐐瑰肩殑鑺傜偣锛岀被浼间簬璇ヨ妭鐐.prev = 鍓嶉┍锛岃鑺傜偣.next = 鍚庣户銆

+

绗簩姝ワ細灏嗗墠椹辨垨鑰呭悗缁х殑鍊煎鍒跺埌璇ヨ妭鐐逛腑锛岀劧鍚庡垹鎺夊墠椹辨垨鑰呭悗缁

+

濡傛灉鍒犻櫎鐨勬槸宸﹁妭鐐癸紝鍒欏皢鍓嶉┍鐨勫煎鍒跺埌璇ヨ妭鐐逛腑锛岀劧鍚庡垹闄ゅ墠椹憋紱濡傛灉鍒犻櫎鐨勬槸鍙宠妭鐐癸紝鍒欏皢鍚庣户鐨勫煎鍒跺埌璇ヨ妭鐐逛腑锛岀劧鍚庡垹闄ゅ悗缁э紱

+

杩欑浉褰撲簬鏄竴绉嶁滃彇宸р濈殑鏂规硶锛屾垜浠垹闄よ妭鐐圭殑鐩殑鏄娇璇ヨ妭鐐圭殑鍊煎湪绾㈤粦鏍戜笂涓嶅瓨鍦紝鍥犳涓撴敞浜庤鐩殑锛屾垜浠苟涓嶅叧娉ㄥ垹闄よ妭鐐规椂鏄惁鐪熸槸鎴戜滑鎯冲垹闄ょ殑閭d釜鑺傜偣锛屽悓鏃舵垜浠篃涓嶉渶鑰冭檻鏍戠粨鏋勭殑鍙樺寲锛屽洜涓烘爲鐨勭粨鏋勬湰韬氨浼氬洜涓鸿嚜鍔ㄥ钩琛℃満鍒惰岀粡甯歌繘琛岃皟鏁淬

+

鍓嶉潰鎴戜滑宸茬粡璇翠簡锛屾垜浠鍒犻櫎鐨勫疄闄呬笂鏄墠椹辨垨鑰呭悗缁э紝鍥犳鎴戜滑灏变互鍓嶉┍涓轰富绾挎潵璁茶В锛屽悗缁х殑瀛︿範鍙弬鑰冨墠椹憋紝鍖呮嫭鍑犵鎯呭喌

+

4.2.1 鍓嶉┍涓洪粦鑹茶妭鐐癸紝骞朵笖鏈変竴涓潪null瀛愯妭鐐

+

+

鍒嗘瀽锛

+

鍥犱负瑕佸垹闄ょ殑鏄乏鑺傜偣64锛鎵惧埌璇ヨ妭鐐圭殑鍓嶉┍63锛

+

鐒跺悗鐢ㄥ墠椹辩殑鍊63鏇挎崲寰呭垹闄よ妭鐐圭殑鍊64锛屾鏃朵袱涓妭鐐癸紙寰呭垹闄よ妭鐐瑰拰鍓嶉┍锛夌殑鍊奸兘涓63锛

+

鍒犻櫎鍓嶉┍63锛屾鏃舵垚涓轰笂鍥捐繃绋嬩腑闂寸幆鑺傦紝浣嗘垜浠彂鐜板叾涓嶇鍚堢孩榛戞爲瑙勫垯4锛屽洜姝ら渶瑕佽繘琛岃嚜鍔ㄥ钩琛¤皟鏁达紱

+

杩欓噷鐩存帴閫氳繃銆鍙樿壊銆戝嵆鍙畬鎴愩

+

4.2.2 鍓嶉┍涓洪粦鑹茶妭鐐癸紝鍚屾椂瀛愯妭鐐归兘涓簄ull

+

+

鍒嗘瀽锛

+

鍥犱负瑕佸垹闄ょ殑鏄乏鑺傜偣64锛鎵惧埌璇ヨ妭鐐圭殑鍓嶉┍63锛

+

鐒跺悗鐢ㄥ墠椹辩殑鍊63鏇挎崲寰呭垹闄よ妭鐐圭殑鍊64锛屾鏃朵袱涓妭鐐癸紙寰呭垹闄よ妭鐐瑰拰鍓嶉┍锛夌殑鍊奸兘涓63锛

+

鍒犻櫎鍓嶉┍63锛屾鏃舵垚涓轰笂鍥捐繃绋嬩腑闂寸幆鑺傦紝浣嗘垜浠彂鐜板叾涓嶇鍚堢孩榛戞爲瑙勫垯5锛屽洜姝ら渶瑕佽繘琛岃嚜鍔ㄥ钩琛¤皟鏁达紱

+

杩欓噷鐩存帴閫氳繃銆鍙樿壊銆戝嵆鍙畬鎴愩

+

4.2.3 鍓嶉┍涓虹孩鑹茶妭鐐癸紝鍚屾椂瀛愯妭鐐归兘涓簄ull

+

+

鍒嗘瀽锛

+

鍥犱负瑕佸垹闄ょ殑鏄乏鑺傜偣64锛鎵惧埌璇ヨ妭鐐圭殑鍓嶉┍63锛

+

鐒跺悗鐢ㄥ墠椹辩殑鍊63鏇挎崲寰呭垹闄よ妭鐐圭殑鍊64锛屾鏃朵袱涓妭鐐癸紙寰呭垹闄よ妭鐐瑰拰鍓嶉┍锛夌殑鍊奸兘涓63锛

+

鍒犻櫎鍓嶉┍63锛屾爲鐨勭粨鏋勫苟娌℃湁鎵撶牬瑙勫垯銆

+

4.3 绾㈤粦鏍戝垹闄ゆ荤粨

+

绾㈤粦鏍戝垹闄ょ殑鎯呭喌姣旇緝澶氾紝浣嗕篃灏卞瓨鍦ㄤ互涓嬫儏鍐碉細

+

鍒犻櫎鐨勬槸鏍硅妭鐐癸紝鍒欑洿鎺ュ皢鏍硅妭鐐圭疆涓簄ull;

+

寰呭垹闄よ妭鐐圭殑宸﹀彸瀛愯妭鐐归兘涓簄ull锛屽垹闄ゆ椂灏嗚鑺傜偣缃负null;

+

寰呭垹闄よ妭鐐圭殑宸﹀彸瀛愯妭鐐规湁涓涓湁鍊硷紝鍒欑敤鏈夊肩殑鑺傜偣鏇挎崲璇ヨ妭鐐瑰嵆鍙紱

+

寰呭垹闄よ妭鐐圭殑宸﹀彸瀛愯妭鐐归兘涓嶄负null锛屽垯鎵惧墠椹辨垨鑰呭悗缁э紝灏嗗墠椹辨垨鑰呭悗缁х殑鍊煎鍒跺埌璇ヨ妭鐐逛腑锛岀劧鍚庡垹闄ゅ墠椹辨垨鑰呭悗缁э紱

+

鑺傜偣鍒犻櫎鍚庡彲鑳戒細閫犳垚绾㈤粦鏍戠殑涓嶅钩琛★紝杩欐椂鎴戜滑闇閫氳繃銆愬彉鑹层+銆愭棆杞戠殑鏂瑰紡鏉ヨ皟鏁达紝浣夸箣骞宠 锛屼笂闈篃缁欏嚭浜嗕緥瀛愶紝寤鸿澶у澶氬缁冧範锛岃屼笉蹇呰儗涓嬫潵銆

+

B*鏍

+

       鏄疊+鏍戠殑鍙樹綋锛屽湪B+鏍戠殑闈炴牴鍜岄潪鍙跺瓙缁撶偣鍐嶅鍔犳寚鍚戝厔寮熺殑鎸囬拡锛

+

+

 

+

 

+

+

   B*鏍戝畾涔変簡闈炲彾瀛愮粨鐐瑰叧閿瓧涓暟鑷冲皯涓(2/3)*M锛屽嵆鍧楃殑鏈浣庝娇鐢ㄧ巼涓2/3

+

锛堜唬鏇緽+鏍戠殑1/2锛夛紱

+

       B+鏍戠殑鍒嗚锛氬綋涓涓粨鐐规弧鏃讹紝鍒嗛厤涓涓柊鐨勭粨鐐癸紝骞跺皢鍘熺粨鐐逛腑1/2鐨勬暟鎹

+

澶嶅埗鍒版柊缁撶偣锛屾渶鍚庡湪鐖剁粨鐐逛腑澧炲姞鏂扮粨鐐圭殑鎸囬拡锛汢+鏍戠殑鍒嗚鍙奖鍝嶅師缁撶偣鍜岀埗

+

缁撶偣锛岃屼笉浼氬奖鍝嶅厔寮熺粨鐐癸紝鎵浠ュ畠涓嶉渶瑕佹寚鍚戝厔寮熺殑鎸囬拡锛

+

       B*鏍戠殑鍒嗚锛氬綋涓涓粨鐐规弧鏃讹紝濡傛灉瀹冪殑涓嬩竴涓厔寮熺粨鐐规湭婊★紝閭d箞灏嗕竴閮ㄥ垎

+

鏁版嵁绉诲埌鍏勫紵缁撶偣涓紝鍐嶅湪鍘熺粨鐐规彃鍏ュ叧閿瓧锛屾渶鍚庝慨鏀圭埗缁撶偣涓厔寮熺粨鐐圭殑鍏抽敭瀛

+

锛堝洜涓哄厔寮熺粨鐐圭殑鍏抽敭瀛楄寖鍥存敼鍙樹簡锛夛紱濡傛灉鍏勫紵涔熸弧浜嗭紝鍒欏湪鍘熺粨鐐逛笌鍏勫紵缁撶偣涔

+

闂村鍔犳柊缁撶偣锛屽苟鍚勫鍒1/3鐨勬暟鎹埌鏂扮粨鐐癸紝鏈鍚庡湪鐖剁粨鐐瑰鍔犳柊缁撶偣鐨勬寚閽堬紱

+

       鎵浠ワ紝B*鏍戝垎閰嶆柊缁撶偣鐨勬鐜囨瘮B+鏍戣浣庯紝绌洪棿浣跨敤鐜囨洿楂橈紱

+

闈㈣瘯棰:绾㈤粦鏍戠浉姣斾簬BST鍜孉VL鏍戞湁浠涔堜紭鐐
   绾㈤粦鏍戞槸鐗虹壊浜嗕弗鏍肩殑楂樺害骞宠 鐨勪紭瓒婃潯浠朵负浠d环锛屽畠鍙姹傞儴鍒嗗湴杈惧埌骞宠 瑕佹眰锛岄檷浣庝簡瀵规棆杞殑瑕佹眰锛屼粠鑰屾彁楂樹簡鎬ц兘銆
绾㈤粦鏍戣兘澶熶互O(log n)鐨勬椂闂村鏉傚害杩涜鎼滅储銆佹彃鍏ャ佸垹闄ゆ搷浣溿傛澶栵紝鐢变簬瀹冪殑璁捐锛屼换浣曚笉骞宠 閮戒細鍦ㄤ笁娆℃棆杞箣鍐呰В鍐炽
褰撶劧锛岃繕鏈変竴浜涙洿濂界殑锛屼絾瀹炵幇璧锋潵鏇村鏉傜殑鏁版嵁缁撴瀯鑳藉鍋氬埌涓姝ユ棆杞箣鍐呰揪鍒板钩琛★紝浣嗙孩榛戞爲鑳藉缁欐垜浠竴涓瘮杈冣滀究瀹溾濈殑瑙e喅鏂规銆

    鐩告瘮浜嶣ST锛屽洜涓虹孩榛戞爲鍙互鑳界‘淇濇爲鐨勬渶闀胯矾寰勪笉澶т簬涓ゅ嶇殑鏈鐭矾寰勭殑闀垮害锛屾墍浠ュ彲浠ョ湅鍑哄畠鐨勬煡鎵炬晥鏋滄槸鏈夋渶浣庝繚璇佺殑銆傚湪鏈鍧忕殑鎯呭喌涓嬩篃鍙互淇濊瘉O(logN)鐨勶紝杩欐槸瑕佸ソ浜庝簩鍙夋煡鎵炬爲鐨勩傚洜涓轰簩鍙夋煡鎵炬爲鏈鍧忔儏鍐靛彲浠ヨ鏌ユ壘杈惧埌O(N)銆傜孩榛戞爲鐨勭畻娉曟椂闂村鏉傚害鍜孉VL鐩稿悓锛屼絾缁熻鎬ц兘姣擜VL鏍戞洿楂橈紝鎵浠ュ湪鎻掑叆鍜屽垹闄や腑鎵鍋氱殑鍚庢湡缁存姢鎿嶄綔鑲畾浼氭瘮绾㈤粦鏍戣鑰楁椂濂藉锛屼絾鏄粬浠殑鏌ユ壘鏁堢巼閮芥槸O(logN)锛屾墍浠ョ孩榛戞爲搴旂敤杩樻槸楂樹簬AVL鏍戠殑. 瀹為檯涓婃彃鍏 AVL 鏍戝拰绾㈤粦鏍戠殑閫熷害鍙栧喅浜庝綘鎵鎻掑叆鐨勬暟鎹傚鏋滀綘鐨勬暟鎹垎甯冭緝濂,鍒欐瘮杈冨疁浜庨噰鐢 AVL鏍(渚嬪闅忔満浜х敓绯诲垪鏁),浣嗘槸濡傛灉浣犳兂澶勭悊姣旇緝鏉備贡鐨勬儏鍐,鍒欑孩榛戞爲鏄瘮杈冨揩鐨勩

+

涓轰粈涔堣瑕佺敤绾㈤粦鏍戯紵

1銆侀鍏堢孩榛戞爲鏄笉绗﹀悎AVL鏍戠殑骞宠 鏉′欢鐨勶紝鍗虫瘡涓妭鐐圭殑宸﹀瓙鏍戝拰鍙冲瓙鏍戠殑楂樺害鏈澶氬樊1鐨勪簩鍙夋煡鎵炬爲銆備絾鏄彁鍑轰簡涓鸿妭鐐瑰鍔犻鑹诧紝绾㈤粦鏍戞槸鐢ㄩ潪涓ユ牸鐨勫钩琛℃潵鎹㈠彇澧炲垹鑺傜偣鏃跺欐棆杞鏁扮殑闄嶄綆锛屼换浣曚笉骞宠 閮戒細鍦ㄤ笁娆℃棆杞箣鍐呰В鍐筹紝鑰孉VL鏄弗鏍煎钩琛℃爲锛屽洜姝ゅ湪澧炲姞鎴栬呭垹闄よ妭鐐圭殑鏃跺欙紝鏍规嵁涓嶅悓鎯呭喌锛屾棆杞殑娆℃暟姣旂孩榛戞爲瑕佸銆傛墍浠ョ孩榛戞爲鐨勬彃鍏ユ晥鐜囨洿楂

(鏇村鐩稿叧闈㈣瘯棰樻帹鑽愶細java闈㈣瘯棰樺強绛旀)

2銆佺孩榛戞爲鑳藉浠(log2 (n)) 鐨勬椂闂村鏉傚害杩涜鎼滅储銆佹彃鍏ャ佸垹闄ゆ搷浣

3銆佺畝鍗曟潵璇寸孩榛戞爲灏辨槸涓轰簡瑙e喅浜屽弶鏌ユ壘鏍戠殑缂洪櫡锛屽洜涓轰簩鍙夋煡鎵炬爲鍦ㄦ煇浜涙儏鍐典笅浼氶鍖栨垚涓涓嚎鎬х粨鏋勩

绾㈤粦鏍戝拰骞宠 鏍戠殑瀵规瘮鍜岄夋嫨

1銆佸钩琛℃爲缁撴瀯鏇村姞鐩磋锛岃鍙栨ц兘姣旂孩榛戞爲瑕侀珮锛涘鍔犲拰鍒犻櫎鑺傜偣 鎭㈠骞宠 鐨勬ц兘涓嶅绾㈤粦鏍

2銆佺孩榛戞爲锛岃鍙栨ц兘涓嶅骞宠 鏍戯紱澧炲姞鍜屽垹闄よ妭鐐 鎭㈠骞宠 鎬ц兘姣斿钩琛℃爲濂

绾㈤粦鏍戠殑浣跨敤鍦烘櫙锛

TreeMap銆乀reeSet浠ュ強JDK1.8涔嬪悗鐨凥ashMap搴曞眰閮界敤鍒颁簡绾㈤粦鏍

+

浜. 鎬荤粨

+

鏈枃涓昏浠嬬粛浜嗙孩榛戞爲鐨勭浉鍏冲師鐞嗭紝棣栧厛绾㈤粦鏍戠殑鍩虹浜屽弶鎼滅储鏍戯紝鎴戜滑鍏堢畝鍗曡浜嗕竴涓嬩簩鍙夋悳绱㈡爲锛屽苟涓旇浜嗕竴涓嬫悳绱㈢殑娴佺▼锛岀劧鍚庡氨閽堝绾㈤粦鏍戠殑6澶ц鍒欑壒鐐癸紝绾㈤粦鏍戠殑鎻掑叆鎿嶄綔锛屽垹闄ゆ搷浣滐紝閮戒娇鐢ㄤ簡澶ч噺鐨勫浘褰㈡潵鍔犱互璇存槑锛屾妧鏈兘鏄粌鍑烘潵鐨勶紝鏈夋椂鍊欏緢澶氫技鏄岄潪鐨勫湴鏂癸紝褰撳姩绗斿幓鍐欑殑鏃跺欙紝鍏跺疄寰堝ソ鐞嗚В銆傜孩榛戞爲鐨勪娇鐢ㄩ潪甯稿箍娉涳紝濡俆reeMap鍜孴reeSet閮芥槸鍩轰簬绾㈤粦鏍戝疄鐜扮殑锛岃孞dk8涓璈ashMap褰撻摼琛ㄩ暱搴﹀ぇ浜8鏃朵篃浼氳浆鍖栦负绾㈤粦鏍戯紝绾㈤粦鏍戞瘮杈冨鏉傦紝鏈汉涔熸槸杩樺湪瀛︿範杩囩▼涓紝濡傛灉鏈変笉瀵圭殑鍦版柟璇锋壒璇勬寚姝o紝鏈涘叡鍚岃繘姝ヨ阿璋€

+

 

+ +
+ + +
+ +
+
+ + 涓婁竴绡囷細 鍩虹宸╁浐_鏁版嵁缁撴瀯涓ヨ敋鏁忓涔 +
+ 涓嬩竴绡囷細 婕敾绠楁硶_灏忕伆鐏伴潰璇 + +
+ + +
posted @ +2021-08-08 11:39  +浣犵殑闆峰摜  +闃呰(13316)  +璇勮(3)  +  +鏀惰棌  +涓炬姤 +
+ + + + + + + B 鏍戠殑 **鍒犻櫎鎿嶄綔**姣旀彃鍏ュ鏉備竴浜涳紝鍥犱负蹇呴』淇濇寔 B 鏍戠殑 **骞宠 鎬**锛堟瘡涓妭鐐 key 鏁伴噺鍦 `[t-1, 2t-1]` 涔嬮棿锛夊拰 **children 鏁伴噺 = keys+1** 鐨勪笉鍙橀噺銆傚垹闄ゆ搷浣滀富瑕佸垎鍑犵鎯呭喌锛岄渶瑕佹寜**浠庢牴鍒板彾瀛**鐨勬濊矾閫掑綊澶勭悊銆 + +--- + +## 1锔忊儯 鍒犻櫎鐨勪笁绉嶅熀鏈儏鍐 + +璁炬垜浠鍒犻櫎 key `k`锛 + +### **鎯呭喌 1锛歬ey 鍦ㄥ彾瀛愯妭鐐逛笂** + +* 鐩存帴鍒犻櫎 key 鍗冲彲銆 +* 鍒犻櫎鍚庡鏋滃彾瀛愯妭鐐逛粛鐒舵湁 鈮 t-1 涓 key锛屽垯鏃犻渶杩涗竴姝ュ鐞嗐 +* 濡傛灉 key 鏁 < t-1锛屽垯闇瑕佷粠鍏勫紵鑺傜偣鍊 key 鎴栧悎骞惰妭鐐癸紙涓嬫枃璇﹁堪锛夈 + +--- + +### **鎯呭喌 2锛歬ey 鍦ㄥ唴閮ㄨ妭鐐逛笂** + +鍋囪 key `k` 鍦ㄥ唴閮ㄨ妭鐐 `x` 涓紝`x->keys[i] = k`銆 + +* **鎯呭喌 2a锛氬墠椹 key 鎵鍦ㄥ瓙鏍 y 鐨 key 鏁 鈮 t** + + * 鎵惧埌 k 鐨 **鍓嶉┍ key**锛堝乏瀛愭爲鏈澶 key锛夛紝璁颁綔 `pred`銆 + * 鐢 `pred` 鏇挎崲 `k`銆 + * 閫掑綊鍒犻櫎 `pred`锛堝畠涓瀹氬湪鍙跺瓙鑺傜偣鎴栧唴閮ㄨ妭鐐归噷锛夈 +* **鎯呭喌 2b锛氬悗缁 key 鎵鍦ㄥ瓙鏍 z 鐨 key 鏁 鈮 t** + + * 鎵惧埌 k 鐨 **鍚庣户 key**锛堝彸瀛愭爲鏈灏 key锛夛紝璁颁綔 `succ`銆 + * 鐢 `succ` 鏇挎崲 `k`銆 + * 閫掑綊鍒犻櫎 `succ`銆 +* **鎯呭喌 2c锛氬乏鍙冲瓙鏍 key 鏁伴兘 = t-1** + + * 鍚堝苟宸﹀彸瀛愭爲鍜 key k锛屽舰鎴愪竴涓柊鐨勮妭鐐癸紙key 鏁 = 2t-1锛夈 + * 閫掑綊鍦ㄥ悎骞跺悗鐨勮妭鐐逛腑鍒犻櫎 k銆 + +--- + +### **鎯呭喌 3锛歬ey 涓嶅湪鍐呴儴鑺傜偣涓** + +* 鎵惧埌 key 鎵鍦ㄧ殑瀛愭爲锛坈hild i锛夈 +* **淇濊瘉閫掑綊鍓嶅瓙鏍戣嚦灏戞湁 t 涓 key**锛 + + 1. 濡傛灉 child\[i] key 鏁 = t-1锛岄渶瑕佸厛鍊 key 鎴栧悎骞讹細 + + * **鍚戝乏鎴栧彸鍏勫紵鍊 key**锛堝厔寮 key 鈮 t锛 + + * 鐖惰妭鐐 key 涓嬬Щ鍒 child锛屽厔寮 key 涓婄Щ鍒扮埗鑺傜偣銆 + * **鍏勫紵 key 鏁 = t-1** + + * 涓庡厔寮熷悎骞讹紝鐖惰妭鐐 key 涓嬬Щ鍒板悎骞跺悗鐨勮妭鐐广 +* 閫掑綊鍦 child\[i] 涓垹闄 key銆 + +--- + +## 2锔忊儯 鍊 key / 鍚堝苟鐨勮鍒 + +* **鍊 key**锛 + + * 浠庡乏鍏勫紵鍊燂細宸﹀厔寮熺殑鏈澶 key 涓婄Щ鍒扮埗鑺傜偣锛岀埗鑺傜偣瀵瑰簲 key 涓嬬Щ鍒 child銆 + * 浠庡彸鍏勫紵鍊燂細鍙冲厔寮熺殑鏈灏 key 涓婄Щ鍒扮埗鑺傜偣锛岀埗鑺傜偣瀵瑰簲 key 涓嬬Щ鍒 child銆 +* **鍚堝苟**锛 + + * 鎶 child 涓庡厔寮熶互鍙婄埗鑺傜偣涓棿 key 鍚堝苟鎴愪竴涓妭鐐广 + * 鐖惰妭鐐 key 鏁板噺 1锛宑hild 鏁板噺 1銆 + * 鍙兘閫掑綊鍒 root锛屽鏋 root key 鏁 = 0锛屾牴鑺傜偣琚垹闄わ紝鏍戦珮搴﹀噺 1銆 + +--- + +## 3锔忊儯 鍒犻櫎鎿嶄綔鐨勯掑綊娴佺▼ + +浼唬鐮佸ぇ鑷村涓嬶紙椤跺眰鍑芥暟 `deleteKey(root, k)`锛夛細 + +```text +deleteKey(node, k): + if node is leaf: + if k in node.keys: + remove k from node.keys + return + + if k in node.keys: + if left child has >= t keys: + pred = max(left child) + replace k with pred + deleteKey(left child, pred) + else if right child has >= t keys: + succ = min(right child) + replace k with succ + deleteKey(right child, succ) + else: + merge left child, k, right child + deleteKey(merged child, k) + else: + child = subtree where k should be + if child.keys.size() == t-1: + if left/right sibling has >= t keys: + borrow from sibling + else: + merge with sibling + deleteKey(child, k) +``` + +--- + +## 4锔忊儯 鍏抽敭鐐规荤粨 + +1. **鍒犻櫎鍓嶄繚璇侀掑綊瀛愭爲 key 鏁 鈮 t**锛岄伩鍏嶉掑綊鏃朵笅婧€ +2. **鍊 key 鎴栧悎骞惰妭鐐**纭繚 B 鏍戜笉杩濆弽鏈灏忓害鏁伴檺鍒躲 +3. **鏍硅妭鐐圭壒娈婂鐞**锛氬垹闄ゅ悗濡傛灉 root 娌℃湁 key锛屾爲楂樺害鍑 1銆 +4. **閫掑綊**鏄疄鐜板垹闄ょ殑鏍稿績鎬濊矾锛屼粠涓婂埌涓嬩繚璇佹瘡涓妭鐐瑰湪閫掑綊鏃跺悎娉曘 + +--- + +濡傛灉浣犻渶瑕侊紝鎴戝彲浠ュ府浣 **鍐欎竴涓畬鏁寸殑 C++ B 鏍戝垹闄ゅ嚱鏁板疄鐜**锛岀洿鎺ュ拰浣犲凡鏈夌殑 `BTree` 绫绘暣鍚堬紝骞堕檮璇︾粏娉ㄩ噴銆 + +浣犲笇鏈涙垜甯綘鍐欏悧锛 diff --git a/BinaryTree/BalanceTree/B-Tree/main.cpp b/BinaryTree/BalanceTree/B-Tree/main.cpp new file mode 100644 index 0000000..332ea3d --- /dev/null +++ b/BinaryTree/BalanceTree/B-Tree/main.cpp @@ -0,0 +1,73 @@ +#include +#include "BTree.h" +using namespace std; +int main() { + BTree a(2); + a.insert(10);a.display(); + a.insert(3);a.display(); + a.insert(6);a.display(); + a.insert(9);a.display(); + a.insert(2);a.display(); + a.insert(5);a.display(); + a.insert(8);a.display(); + a.insert(1);a.display(); + a.insert(4);a.display(); + a.insert(7);a.display(); + a.insert(11);a.display(); + a.insert(15);a.display(); + a.insert(17);a.display(); + return 0; +} +/* +10 + +3 10 + +3 6 10 + +3 +6 9 10 + +2 3 +6 9 10 + +2 3 5 +6 9 10 + +2 3 5 +6 8 9 10 + +1 2 +3 5 +6 8 9 10 + +1 2 +3 4 5 +6 8 9 10 + +1 2 +3 4 5 +6 7 8 +9 10 + +1 2 +3 4 5 + +6 7 8 +9 10 11 + + +1 2 +3 4 5 + +6 7 8 +9 10 11 15 + + +1 2 +3 4 5 + +6 7 8 +9 10 +11 15 17 +*/ \ No newline at end of file