Skip to content

Commit 98cf9aa

Browse files
committed
Deployed f02d6c2 with MkDocs version: 1.0.4
1 parent 105159b commit 98cf9aa

File tree

5 files changed

+56
-4
lines changed

5 files changed

+56
-4
lines changed

13_高级排序算法/quick_sort/index.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,7 @@ <h1 id="_3">思考题</h1>
322322
<li>请你补充 quicksort_inplace 的单元测试</li>
323323
<li>最坏的情况下快排的时间复杂度是多少?什么时候会发生这种情况?</li>
324324
<li>我们实现的快排是稳定的啵?</li>
325-
<li>选择基准值如果选不好就可能导致复杂度升高,算导中提到了一种『median of 3』策略,就是说选择 pivot 的时候
326-
从子数组中随机选三个元素,再取它的中位数,你能实现这个想法吗?这里我们的代码很简单地取了第一个元素作为 pivot</li>
325+
<li>选择基准值如果选不好就可能导致复杂度升高,算导中提到了一种『median of 3』策略,就是说选择 pivot 的时候 从子数组中随机选三个元素,再取它的中位数,你能实现这个想法吗?这里我们的代码很简单地取了第一个元素作为 pivot</li>
327326
<li>利用快排中的 partition 操作,我们还能实现另一个算法,nth_element,快速查找一个无序数组中的第 n 大元素,请你尝试实现它并编写单测。其实这个函数是 C++ STL 中的一个函数。</li>
328327
<li>你知道 Python 内置的 sorted 如何实现的吗?请你 Google 相关资料了解下。很多内置的排序都使用了快排的改良版。</li>
329328
</ul>

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,9 @@
168168
<li class="toctree-l2"><a href="#python-heapq">python 里的 heapq</a></li>
169169

170170

171+
<li class="toctree-l2"><a href="#top-k">Top K 问题</a></li>
172+
173+
171174
<li class="toctree-l2"><a href="#_6">练习题</a></li>
172175

173176

@@ -351,6 +354,56 @@ <h1 id="_5">实现堆排序</h1>
351354
<h1 id="python-heapq">python 里的 heapq</h1>
352355
<p>python 其实自带了 heapq 模块,用来实现堆的相关操作,原理是类似的。请你阅读相关文档并使用内置的 heapq 模块完成堆排序。
353356
一般我们刷题或者写业务代码的时候,使用这个内置的 heapq 模块就够用了。</p>
357+
<h1 id="top-k">Top K 问题</h1>
358+
<p>面试题中有这样一类问题,让求出大量数据中的top k 个元素,比如一亿个数字中最大的100个数字。
359+
对于这种问题有很多种解法,比如直接排序、mapreduce、trie 树、分治法等,当然如果内存够用直接排序是最简单的。
360+
如果内存不够用呢? 这里我们提一下使用固定大小的堆来解决这个问题的方式。
361+
其实思路比较简单,先迭代前 k 个元素建立一个最小堆,之后的元素如果小于堆顶最小值,跳过,否则替换堆顶元素。</p>
362+
<pre><code class="py">import heapq
363+
364+
365+
class TopK:
366+
&quot;&quot;&quot;获取大量元素 topk 大个元素,固定内存
367+
思路:
368+
1. 先放入元素前 k 个建立一个最小堆
369+
2. 迭代剩余元素:
370+
如果当前元素小于堆顶元素,跳过该元素(肯定不是前 k 大)
371+
否则替换堆顶元素为当前元素,并重新调整堆
372+
&quot;&quot;&quot;
373+
374+
def __init__(self, iterable, k):
375+
self.minheap = []
376+
self.capacity = k
377+
self.iterable = iterable
378+
379+
def push(self, val):
380+
if len(self.minheap) &gt;= self.capacity:
381+
min_val = self.minheap[0]
382+
if val &lt; min_val: # 当然你可以直接 if val &gt; min_val操作,这里我只是显示指出跳过这个元素
383+
pass
384+
else:
385+
heapq.heapreplace(self.minheap, val)
386+
else:
387+
heapq.heappush(self.minheap, val)
388+
389+
def get_topk(self):
390+
for val in self.iterable:
391+
self.push(val)
392+
return self.minheap
393+
394+
395+
def test():
396+
import random
397+
i = list(range(1000))
398+
random.shuffle(i)
399+
_ = TopK(i, 10)
400+
print(_.get_topk())
401+
402+
403+
if __name__ == '__main__':
404+
test()
405+
</code></pre>
406+
354407
<h1 id="_6">练习题</h1>
355408
<ul>
356409
<li>这里我用最大堆实现了一个 heapsort_reverse 函数,请你实现一个正序排序的函数。似乎不止一种方式</li>

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 00:51:33
584+
Build Date UTC : 2018-12-23 02:56:52
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)