Skip to content

Commit 70b7f6d

Browse files
committed
Deployed 2358ee6 with MkDocs version: 1.0.4
1 parent 752761a commit 70b7f6d

File tree

6 files changed

+31
-16
lines changed

6 files changed

+31
-16
lines changed

14_树与二叉树/btree.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,16 @@ def preorder_trav_use_stack(self, subtree):
7474
while not s.empty():
7575
peek = s.pop()
7676
print(peek.data) # 注意这里我用了 print,你可以用 yield 产出值然后在调用的地方转成 list
77-
if subtree.left:
78-
s.push(subtree.left)
79-
if subtree.right:
80-
s.push(subtree.right)
77+
if peek.right:
78+
s.push(peek.right)
79+
if peek.left:
80+
s.push(peek.left)
8181

8282
def inorder_trav(self, subtree):
8383
if subtree is not None:
84-
self.preorder_trav(subtree.left)
84+
self.inorder_trav(subtree.left)
8585
print(subtree.data)
86-
self.preorder_trav(subtree.right)
86+
self.inorder_trav(subtree.right)
8787

8888
def reverse(self, subtree):
8989
if subtree is not None:
@@ -133,8 +133,10 @@ def layer_trav_use_queue(self, subtree):
133133
btree = BinTree.build_from(node_list)
134134
print('====先序遍历=====')
135135
btree.preorder_trav(btree.root)
136+
136137
print('====使用 stack 实现先序遍历=====')
137-
btree.preorder_trav(btree.root)
138+
btree.preorder_trav_use_stack(btree.root)
139+
138140
print('====层序遍历=====')
139141
btree.layer_trav(btree.root)
140142
print('====用队列层序遍历=====')

14_树与二叉树/tree/index.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@
182182
<li class="toctree-l2"><a href="#_10">延伸阅读</a></li>
183183

184184

185+
<li class="toctree-l2"><a href="#leetcode">Leetcode</a></li>
186+
187+
185188
</ul>
186189
</li>
187190

@@ -477,13 +480,15 @@ <h1 id="_9">练习题</h1>
477480
<li>树的遍历我们用了 print,请你尝试换成一个 callback,这样就能自定义处理树节点的方式了。</li>
478481
<li>请问树的遍历操作时间复杂度是多少?假设它的 size 是 n</li>
479482
<li>你能用非递归的方式来实现树的遍历吗?我们知道计算机内部使用了 stack,如果我们自己模拟如何实现?请你尝试完成</li>
480-
<li>使用树的层序遍历我们能实现一个树的左右视图,比如从一个二叉树的左边能看到哪些节点。请你尝试做这个练习题 https://leetcode.com/problems/binary-tree-right-side-view/description/</li>
481483
</ul>
482484
<h1 id="_10">延伸阅读</h1>
483485
<ul>
484486
<li>《Data Structures and Algorithms in Python》 13 章 Binary Trees</li>
485487
<li><a href="https://www.geeksforgeeks.org/iterative-preorder-traversal/">https://www.geeksforgeeks.org/iterative-preorder-traversal/</a></li>
486488
</ul>
489+
<h1 id="leetcode">Leetcode</h1>
490+
<p>使用树的层序遍历我们能实现一个树的左右视图,比如从一个二叉树的左边能看到哪些节点。
491+
请你尝试做这个练习题 https://leetcode.com/problems/binary-tree-right-side-view/description/</p>
487492

488493
</div>
489494
</div>

15_堆与堆排序/heap_and_heapsort/index.html

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -353,12 +353,20 @@ <h1 id="_5">实现堆排序</h1>
353353

354354
<h1 id="python-heapq">Python 里的 heapq 模块</h1>
355355
<p>python 其实自带了 heapq 模块,用来实现堆的相关操作,原理是类似的。请你阅读相关文档并使用内置的 heapq 模块完成堆排序。
356-
一般我们刷题或者写业务代码的时候,使用这个内置的 heapq 模块就够用了。</p>
356+
一般我们刷题或者写业务代码的时候,使用这个内置的 heapq 模块就够用了,内置的实现了是最小堆</p>
357357
<h1 id="top-k">Top K 问题</h1>
358358
<p>面试题中有这样一类问题,让求出大量数据中的top k 个元素,比如一亿个数字中最大的100个数字。
359359
对于这种问题有很多种解法,比如直接排序、mapreduce、trie 树、分治法等,当然如果内存够用直接排序是最简单的。
360-
如果内存不够用呢? 这里我们提一下使用固定大小的堆来解决这个问题的方式。
361-
其实思路比较简单,先迭代前 k 个元素建立一个最小堆,之后的元素如果小于堆顶最小值,跳过,否则替换堆顶元素。</p>
360+
如果内存不够用呢? 这里我们提一下使用固定大小的堆来解决这个问题的方式。</p>
361+
<p>一开始的思路可能是,既然求最大的 k 个数,是不是应该维护一个包含 k 个元素的最大堆呢?
362+
稍微尝试下你会发现走不通。我们先用数组的前面 k 个元素建立最大堆,然后对剩下的元素进行比对,但是最大堆只能每次获取堆顶
363+
最大的一个元素,如果我们取下一个大于堆顶的值和堆顶替换,你会发现堆底部的小数一直不会被换掉。如果下一个元素小于堆顶
364+
就替换也不对,这样可能最大的元素就被我们丢掉了。</p>
365+
<p>相反我们用最小堆呢?
366+
先迭代前 k 个元素建立一个最小堆,之后的元素如果小于堆顶最小值,跳过,否则替换堆顶元素并重新调整堆。你会发现最小堆里
367+
慢慢就被替换成了最大的那些值,并且最后堆顶是最大的 topk 个值中的最小值。
368+
(比如1000个数找10个,最后堆里剩余的是 [990, 991, 992, 996, 994, 993, 997, 998, 999, 995],第一个 990 最小)</p>
369+
<p>按照这个思路很容易写出来代码:</p>
362370
<pre><code class="py">import heapq
363371

364372

@@ -382,9 +390,9 @@ <h1 id="top-k">Top K 问题</h1>
382390
if val &lt; min_val: # 当然你可以直接 if val &gt; min_val操作,这里我只是显示指出跳过这个元素
383391
pass
384392
else:
385-
heapq.heapreplace(self.minheap, val)
393+
heapq.heapreplace(self.minheap, val) # 返回并且pop堆顶最小值,推入新的 val 值并调整堆
386394
else:
387-
heapq.heappush(self.minheap, val)
395+
heapq.heappush(self.minheap, val) # 前面 k 个元素直接放入minheap
388396

389397
def get_topk(self):
390398
for val in self.iterable:
@@ -397,7 +405,7 @@ <h1 id="top-k">Top K 问题</h1>
397405
i = list(range(1000)) # 这里可以是一个可迭代元素,节省内存
398406
random.shuffle(i)
399407
_ = TopK(i, 10)
400-
print(_.get_topk())
408+
print(_.get_topk()) # [990, 991, 992, 996, 994, 993, 997, 998, 999, 995]
401409

402410

403411
if __name__ == '__main__':

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,5 +581,5 @@ <h2 id="_21">本电子书制作和写作方式</h2>
581581

582582
<!--
583583
MkDocs version : 1.0.4
584-
Build Date UTC : 2018-12-23 03:03:35
584+
Build Date UTC : 2018-12-23 10:31:06
585585
-->

search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

sitemap.xml.gz

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)