{"id":199641,"date":"2025-05-06T10:04:08","date_gmt":"2025-05-06T02:04:08","guid":{"rendered":"https:\/\/server.hk\/cnblog\/199641\/"},"modified":"2025-05-06T10:04:08","modified_gmt":"2025-05-06T02:04:08","slug":"%e7%94%a8python%e5%ae%9e%e7%8e%b0%e7%9a%84b%e6%a0%91%e6%8f%92%e5%85%a5%e7%ae%97%e6%b3%95%e8%a7%a3%e6%9e%90%e5%8f%8a%e5%9b%be%e7%a4%ba","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/199641\/","title":{"rendered":"\u7528Python\u5b9e\u73b0\u7684B\u6811\u63d2\u5165\u7b97\u6cd5\u89e3\u6790\u53ca\u56fe\u793a"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>\u7528Python\u5b9e\u73b0\u7684B\u6811\u63d2\u5165\u7b97\u6cd5\u89e3\u6790\u53ca\u56fe\u793a<\/h1>\n<p>\u54c8\u55bd\uff01\u5927\u5bb6\u597d\uff0c\u5f88\u9ad8\u5174\u53c8\u89c1\u9762\u4e86\uff0c\u6211\u662f\u4e3b\u673a\u5b9d\u8d1d\u7684\u4e00\u540d\u4f5c\u8005\uff0c\u4eca\u5929\u7531\u6211\u7ed9\u5927\u5bb6\u5e26\u6765\u4e00\u7bc7\uff0c\u672c\u6587\u4e3b\u8981\u4f1a\u8bb2\u5230\u7b49\u7b49\u77e5\u8bc6\u70b9\uff0c\u5e0c\u671b\u5927\u5bb6\u4e00\u8d77\u5b66\u4e60\u8fdb\u6b65\uff0c\u4e5f\u6b22\u8fce\u5927\u5bb6\u5173\u6ce8\u3001\u70b9\u8d5e\u3001\u6536\u85cf\u3001\u8f6c\u53d1! \u4e0b\u9762\u5c31\u4e00\u8d77\u6765\u770b\u770b\u5427\uff01<\/p>\n<p>B\u6811\u662f\u9ad8\u5ea6\u5e73\u8861\u7684\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u8fdb\u884c\u63d2\u5165\u64cd\u4f5c\uff0c\u8981\u5148\u83b7\u53d6\u63d2\u5165\u8282\u70b9\u7684\u4f4d\u7f6e\uff0c\u9075\u5faa\u8282\u70b9\u6bd4\u5de6\u5b50\u6811\u5927\uff0c\u6bd4\u53f3\u5b50\u6811\u5c0f\uff0c\u5728\u9700\u8981\u65f6\u62c6\u5206\u8282\u70b9\u3002<\/p>\n<h3>\u4e00\u56fe\u770b\u61c2B\u6811\u63d2\u5165\u64cd\u4f5c\u539f\u7406<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20240123\/170600472265af90f29d451.jpg\" class=\"aligncenter\"> <\/p>\n<h3>B\u6811\u63d2\u5165\u7b97\u6cd5<\/h3>\n<pre><code>BreeInsertion(T, k)r &nbsp;root[T]if n[r] = 2t - 1<br>&nbsp;&nbsp;&nbsp;&nbsp;s = AllocateNode()<br>&nbsp;&nbsp;&nbsp;&nbsp;root[T] = s<br>&nbsp;&nbsp;&nbsp;&nbsp;leaf[s] = FALSE<br>&nbsp;&nbsp;&nbsp;&nbsp;n[s] &lt;- 0<br>&nbsp;&nbsp;&nbsp;&nbsp;c1[s] &lt;- r<br>&nbsp;&nbsp;&nbsp;&nbsp;BtreeSplitChild(s, 1, r)<br>&nbsp;&nbsp;&nbsp;&nbsp;BtreeInsertNonFull(s, k)else BtreeInsertNonFull(r, k)BtreeInsertNonFull(x, k)i = n[x]if leaf[x]<br>&nbsp;&nbsp;&nbsp;&nbsp;while i \u2265 1 and k &lt; keyi[x]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyi+1 [x] = keyi[x]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i - 1<br>&nbsp;&nbsp;&nbsp;&nbsp;keyi+1[x] = k<br>&nbsp;&nbsp;&nbsp;&nbsp;n[x] = n[x] + 1else while i \u2265 1 and k &lt; keyi[x]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i - 1<br>&nbsp;&nbsp;&nbsp;&nbsp;i = i + 1<br>&nbsp;&nbsp;&nbsp;&nbsp;if n[ci[x]] == 2t - 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BtreeSplitChild(x, i, ci[x])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if k &amp;rt; keyi[x]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i + 1<br>&nbsp;&nbsp;&nbsp;&nbsp;BtreeInsertNonFull(ci[x], k)BtreeSplitChild(x, i)BtreeSplitChild(x, i, y)z = AllocateNode()leaf[z] = leaf[y]n[z] = t - 1for j = 1 to t - 1<br>&nbsp;&nbsp;&nbsp;&nbsp;keyj[z] = keyj+t[y]if not leaf [y]<br>&nbsp;&nbsp;&nbsp;&nbsp;for j = 1 to t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cj[z] = cj + t[y]n[y] = t - 1for j = n[x] + 1 to i + 1<br>&nbsp;&nbsp;&nbsp;&nbsp;cj+1[x] = cj[x]ci+1[x] = zfor j = n[x] to i<br>&nbsp;&nbsp;&nbsp;&nbsp;keyj+1[x] = keyj[x]keyi[x] = keyt[y]n[x] = n[x] + 1<\/code><\/pre>\n<h3>\u7528Python\u5b9e\u73b0B\u6811\u63d2\u5165\u7b97\u6cd5<\/h3>\n<pre><code>class BTreeNode:<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, leaf=False):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.leaf = leaf<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.keys = []<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.child = []<br><br>class BTree:<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, t):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.root = BTreeNode(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.t = t<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def insert(self, k):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root = self.root<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if len(root.keys) == (2 * self.t) - 1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = BTreeNode()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.root = temp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.child.insert(0, root)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.split_child(temp, 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.insert_non_full(temp, k)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.insert_non_full(root, k)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def insert_non_full(self, x, k):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = len(x.keys) - 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if x.leaf:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.keys.append((None, None))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while i &gt;= 0 and k[0] &lt; x.keys[i][0]:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.keys[i + 1] = x.keys[i]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i -= 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.keys[i + 1] = k<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while i &gt;= 0 and k[0] &lt; x.keys[i][0]:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i -= 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i += 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if len(x.child[i].keys) == (2 * self.t) - 1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.split_child(x, i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if k[0] &gt; x.keys[i][0]:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i += 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.insert_non_full(x.child[i], k)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def split_child(self, x, i):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = self.t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y = x.child[i]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z = BTreeNode(y.leaf)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.child.insert(i + 1, z)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.keys.insert(i, y.keys[t - 1])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z.keys = y.keys[t: (2 * t) - 1]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y.keys = y.keys[0: t - 1]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not y.leaf:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z.child = y.child[t: 2 * t]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y.child = y.child[0: t - 1]<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def print_tree(self, x, l=0):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"Level \", l, \" \", len(x.keys), end=\":\")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i in x.keys:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(i, end=\" \")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l += 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if len(x.child) &gt; 0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i in x.child:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.print_tree(i, l)<br><br>def main():<br>&nbsp;&nbsp;&nbsp;&nbsp;B = BTree(3)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;for i in range(10):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B.insert((i, 2 * i))<br><br>&nbsp;&nbsp;&nbsp;&nbsp;B.print_tree(B.root)<br><br>if __name__ == '__main__':<br>&nbsp;&nbsp;&nbsp;&nbsp;main()<\/code><\/pre>\n<p>\u597d\u4e86\uff0c\u672c\u6587\u5230\u6b64\u7ed3\u675f\uff0c\u5e26\u5927\u5bb6\u4e86\u89e3\u4e86\u300a\u7528Python\u5b9e\u73b0\u7684B\u6811\u63d2\u5165\u7b97\u6cd5\u89e3\u6790\u53ca\u56fe\u793a\u300b\uff0c\u5e0c\u671b\u672c\u6587\u5bf9\u4f60\u6709\u6240\u5e2e\u52a9\uff01\u5173\u6ce8\u4e3b\u673a\u5b9d\u8d1d\u516c\u4f17\u53f7\uff0c\u7ed9\u5927\u5bb6\u5206\u4eab\u66f4\u591a\u6570\u636e\u5e93\u77e5\u8bc6\uff01<\/p>\n<p> \u7248\u672c\u58f0\u660e \u672c\u6587\u8f6c\u8f7d\u4e8e\uff1a\u7f51\u6613\u4f0f\u7fb2 \u5982\u6709\u4fb5\u72af\uff0c\u8bf7\u8054\u7cfb \u5220\u9664 <\/p>\n<dl>\n<dt>\n <\/dt>\n<\/dl>\n","protected":false},"excerpt":{"rendered":"<p>\u7528Python\u5b9e\u73b0\u7684B\u6811\u63d2\u5165\u7b97\u6cd5&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101],"tags":[],"class_list":["post-199641","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/199641","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/comments?post=199641"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/199641\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=199641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=199641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=199641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}