121 lines
5.9 KiB
HTML
121 lines
5.9 KiB
HTML
|
||
<html>
|
||
<head>
|
||
<style>
|
||
img {
|
||
max-width: 100%;
|
||
height: auto;
|
||
}
|
||
</style>
|
||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.2.0/github-markdown.min.css">
|
||
</head>
|
||
<body class="markdown-body">
|
||
<h1>效率的重要性与实践验证</h1>
|
||
<blockquote>
|
||
<p>Auto-generated at 2025-09-16 05:03</p>
|
||
</blockquote>
|
||
<h3>理论热身:算法选择的智慧</h3>
|
||
<h4>任务:分析与决策</h4>
|
||
<p>项目组目前有两套备选的交通信号灯同步算法,它们将在不同性能的服务器上运行:</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>方案A</strong>:部署在超级服务器上(10^9 次运算/秒),采用的是一种较为简单的算法,处理n个路口需要 $2n^2$ 次计算。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>方案B</strong>:部署在普通服务器上(10^7 次运算/秒),但采用的是一种更优化的算法,处理n个路口需要 $50nlog_2n$ 次计算。</p>
|
||
</li>
|
||
</ul>
|
||
<p>你的项目经理(右侧的Agent)希望你通过分析,来判断哪个方案更具前景。请与TA对话,逐一回答以下问题。</p>
|
||
<h4>思考题</h4>
|
||
<p>与右侧的Agent对话,回答以下问题:</p>
|
||
<ol>
|
||
<li>
|
||
<p><strong>概念回顾</strong>:首先,请向你的“经理”解释,根据课程所学,一个合格的“算法”应具备哪些基本特征? </p>
|
||
</li>
|
||
<li>
|
||
<p><strong>小规模测试</strong>:对于一个包含100个路口的小型城区(n=100),计算并说明方案A和方案B分别需要多长时间完成计算?在这种情况下,你会推荐哪个方案?</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>大规模应用</strong>:现在,我们需要为一座拥有100万个路口的大都市(n=1,000,000)进行规划。再次计算并说明两个方案的耗时。你的推荐会改变吗?为什么?</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>总结陈词</strong>:综合以上分析,向你的“经理”总结:为什么一个更优的算法设计,其重要性远超硬件性能的提升? 这验证了课程中提到的哪个核心观点?</p>
|
||
</li>
|
||
</ol>
|
||
<h3>编程实践:验证算法的真实性能</h3>
|
||
<h4>任务:编码与分析</h4>
|
||
<p>理论分析让你认识到了算法效率的重要性。现在,你需要通过编程来亲身感受不同交通状况对同一算法性能的巨大影响。我们将以“插入排序”为例,来处理三种典型的交通流量数据,这分别对应算法分析中的<strong>最好</strong>,<strong>最坏</strong>和<strong>平均</strong>情况。</p>
|
||
<h5>题目:模拟交通流量排序</h5>
|
||
<p>实现插入排序算法,并验证其在处理“畅通无阻”(数据有序)、“交通大堵塞”(数据逆序)和“随机车流”(数据随机)三种模式时的效率差异。</p>
|
||
<h5>代码框架</h5>
|
||
<p>在代码编辑区,完成 <code>insertion_sort(arr)</code> 函数的实现后,运行完整代码,并与Agent讨论结果。
|
||
<strong>请创建任意文件,将下面代码写入到编辑器中</strong>
|
||
```python
|
||
import random
|
||
import time</p>
|
||
<p>def insertion_sort(arr):
|
||
"""
|
||
实现插入排序算法
|
||
参数arr: 待排序的交通数据数组(整数代表车辆通行次序)
|
||
返回: 排序后的数组
|
||
"""
|
||
# TODO: 请在此处实现你的插入排序逻辑</p>
|
||
<p>def generate_traffic_data(n):
|
||
"""
|
||
生成模拟交通数据
|
||
参数n: 数据规模(路口数量或监控点数量)
|
||
返回: 三种不同交通状况的数据
|
||
"""
|
||
random_data = [random.randint(0, 10**6) for _ in range(n)]
|
||
# 模拟“畅通无阻”:交通流按次序进入,数据基本有序 (Best Case)
|
||
best_case_data = sorted(random_data)
|
||
# 模拟“交通大堵塞”:疏散时情况完全反转,数据逆序 (Worst Case)
|
||
worst_case_data = sorted(random_data, reverse=True)
|
||
# 模拟“随机车流”:正常但无规律的交通状况 (Average Case)
|
||
average_case_data = random_data
|
||
return best_case_data, worst_case_data, average_case_data</p>
|
||
<p>def measure_performance(func, data):
|
||
"""
|
||
测量算法性能
|
||
参数func: 排序函数
|
||
参数data: 交通数据
|
||
返回: 执行时间(毫秒)
|
||
"""
|
||
start_time = time.perf_counter_ns()
|
||
func(data.copy()) # 使用副本避免影响其他测试
|
||
end_time = time.perf_counter_ns()
|
||
return (end_time - start_time) / 10**6 # 转换为毫秒</p>
|
||
<h1>测试不同规模的路口网络</h1>
|
||
<p>network_sizes = [1000, 5000, 10000]
|
||
print("交通数据处理算法性能测试:")
|
||
for size in network_sizes:
|
||
best, worst, avg = generate_traffic_data(size)</p>
|
||
<pre><code>time_best = measure_performance(insertion_sort, best)
|
||
time_worst = measure_performance(insertion_sort, worst)
|
||
time_avg = measure_performance(insertion_sort, avg)
|
||
|
||
print(f"网络规模 n={size}:")
|
||
print(f" - 畅通无阻 (Best Case): {time_best:.2f} ms")
|
||
print(f" - 交通大堵塞 (Worst Case): {time_worst:.2f} ms")
|
||
print(f" - 随机车流 (Average Case): {time_avg:.2f} ms")
|
||
</code></pre>
|
||
<p>```</p>
|
||
<h4>分析与讨论</h4>
|
||
<p>完成编程并得到输出后,请与右侧Agent讨论以下问题,以检验你的理解:</p>
|
||
<ol>
|
||
<li>
|
||
<p><strong>结果分析</strong>:当网络规模从1000增加到10000时,“交通大堵塞”(最坏情况)的处理时间增长了大约多少倍?这更符合O(n)(线性)还是O(n2)(二次)的增长模式?</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>原因探究</strong>:为什么“畅通无阻”(最好情况)的处理速度如此之快?它的时间复杂度是什么?请结合你的代码逻辑来解释。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>实践应用</strong>:根据你的实验结果,你认为插入排序是否适合用于需要快速响应大规模交通拥堵的实时预警系统?为什么?</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>融会贯通</strong>:结合第一关的理论分析和第二关的编程实验,你对“算法是解决问题的核心”这句话有了怎样更深的理解?</p>
|
||
</li>
|
||
</ol>
|
||
</body>
|
||
</html>
|
||
|