function call can be expire
This commit is contained in:
@@ -22,7 +22,30 @@
|
||||
<body>
|
||||
<h1>效率的重要性与实践验证</h1>
|
||||
<h2>效率</h2>
|
||||
<h3>理论热身:算法选择的智慧</h3>
|
||||
<h3>算法是什么</h3>
|
||||
<h4>算法就是解决某一个问题的做法,其实它在生活中无处不在</h4>
|
||||
<p>比如从学校宿舍走到食堂:</p>
|
||||
<ol>
|
||||
<li>要先宿舍下楼</li>
|
||||
<li>然后到食堂楼之间可能有3条路,
|
||||
A. 直线方向穿过曲折难走的小路,
|
||||
B. 先走远路到平坦的道上,
|
||||
C. 等一会校车,</li>
|
||||
<li>从3者选择一条走过去,最后再上楼。</li>
|
||||
</ol>
|
||||
<h4>算法的5大组成</h4>
|
||||
<ol>
|
||||
<li>输入</li>
|
||||
<li>输出</li>
|
||||
<li>有穷性</li>
|
||||
<li>确定性</li>
|
||||
<li>可行性</li>
|
||||
</ol>
|
||||
<p>这5大组成其实暗示了一个特性
|
||||
其实对于所有的可以被算法描述的问题,
|
||||
一定会有一种算法有解的。
|
||||
至少有一种方法称为”暴力搜索“”穷举法“,穷尽一切可能。</p>
|
||||
<h3>效率的重要性与验证</h3>
|
||||
<h4>任务:分析与决策</h4>
|
||||
<p>项目组目前有两套备选的交通信号灯同步算法,它们将在不同性能的服务器上运行:</p>
|
||||
<ul>
|
||||
@@ -34,7 +57,7 @@
|
||||
</li>
|
||||
</ul>
|
||||
<p>你的项目经理(右侧的Agent)希望你通过分析,来判断哪个方案更具前景。请与TA对话,逐一回答以下问题。</p>
|
||||
<h4>思考题</h4>
|
||||
<h4>问题</h4>
|
||||
<p>与右侧的Agent对话,回答以下问题:</p>
|
||||
<ol>
|
||||
<li>
|
||||
@@ -52,7 +75,8 @@
|
||||
</ol>
|
||||
<h3>编程实践:验证算法的真实性能</h3>
|
||||
<h4>任务:编码与分析</h4>
|
||||
<p>理论分析让你认识到了算法效率的重要性。现在,你需要通过编程来亲身感受不同交通状况对同一算法性能的巨大影响。我们将以“插入排序”为例,来处理三种典型的交通流量数据,这分别对应算法分析中的<strong>最好</strong>,<strong>最坏</strong>和<strong>平均</strong>情况。</p>
|
||||
<p>理论分析让你认识到了算法效率的重要性。现在,你需要通过编程来亲身感受不同交通状况对同一算法性能的巨大影响。
|
||||
我们将以“插入排序”为例,来处理三种典型的交通流量数据,这分别对应算法分析中的<strong>最好</strong>,<strong>最坏</strong>和<strong>平均</strong>情况。</p>
|
||||
<h5>题目:模拟交通流量排序</h5>
|
||||
<p>实现插入排序算法,并验证其在处理“畅通无阻”(数据有序)、“交通大堵塞”(数据逆序)和“随机车流”(数据随机)三种模式时的效率差异。</p>
|
||||
<h5>代码框架</h5>
|
||||
@@ -127,6 +151,27 @@ for size in network_sizes:
|
||||
<p><strong>融会贯通</strong>:结合第一关的理论分析和第二关的编程实验,你对“算法是解决问题的核心”这句话有了怎样更深的理解?</p>
|
||||
</li>
|
||||
</ol>
|
||||
<h3>规模与增长率</h3>
|
||||
<h4>算法复杂度定义</h4>
|
||||
<p>为了更好地描述算法优化的效果,定义为当问题规模趋于无穷大时算法运行时间(算法复杂度,也可以理解为计算机运行的步骤数)</p>
|
||||
<p>符号:<code>Θ( f(n) )</code> 相对常用,
|
||||
称为“渐进等于”,表示算法复杂度随着问题规模n的增大而增大的速率,和函数f(n)在常数倍率上相同。</p>
|
||||
<h4>算法复杂度的计算</h4>
|
||||
<p>计算时间复杂度是一件比较重要的技能,我们来用一些例子试着计算:
|
||||
假设你是一个收银员,有n个人排队,1分钟你只能收银1个人,随着n增大,你收银的时间复杂度(时长)增长,和哪一个函数增长“渐进等于”呢?</p>
|
||||
<h5>增加一点难度</h5>
|
||||
<p>你这个收银员有超能力,可以越来越熟练,第1个人用时1分钟,第2人用时1/2分钟,第3人只用1/4分钟,随着n增大,时间复杂度怎么样呢?</p>
|
||||
<h5>再难一点</h5>
|
||||
<p>如果你这个超能力是这样的:第1个人用时1分钟,后面2个人用时1分钟,后面4个人用时1分钟,后面8个人用时1分钟,那么这种情况下,随着用户n的增大,时间复杂度可以用那个函数描述呢?</p>
|
||||
<h4>另外两个符号</h4>
|
||||
<p>最后还有两个符号:</p>
|
||||
<ul>
|
||||
<li>O 记号:渐近 “小于”:f (n)“≤”g (n)</li>
|
||||
<li>Ω 记号:渐近 “大于”:f (n)“≥”g (n)
|
||||
比如上面Θ( n ) > Θ( log_2(n) ) > Θ( 1 ),就可以写作Θ( 1 )= O ( log_2(n) ) = O ( n ),或者写作Θ( n ) = Ω( log_2(n) ) = Ω( 1 )</li>
|
||||
</ul>
|
||||
<p>当然事实上,上面的写法比较不常见,只是让大家理解一下,常函数的增长渐进小于log_2(n),也渐进小于n。</p>
|
||||
<p>在具体的使用中,由于渐进大于没什么意义(我们不会去找一个更差的算法),我们常混用Θ、O,也就是只研究函数上界(研究一个算法复杂度渐进小于哪一个函数)</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user