Algorithmic Complexity
1.01 MB
52 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
英语 | .pdf | 3 |
摘要 | ||
文档探讨了算法复杂性不仅是预优化问题,而是设计和可扩展性的关键因素。实践中,常数、平均性能和内存局部性同样重要。文档比较了不同复杂度算法的运行时间,介绍了Szpilka和缓存效率。计算复杂性涉及时间和空间资源,常用大O表示。文档还讨论了分摊复杂性,指出它衡量一系列操作的总复杂性,而非单次。最后,强调可扩展性比性能更重要。 | ||
AI总结 | ||
以下是文档《Algorithmic Complexity》的中文总结,重点突出了核心观点和关键信息:
---
### 算法复杂度总结
1. **算法复杂度的重要性**
- 算法复杂度不仅仅是性能问题,更是设计和扩展性(scalability)的重要元素。
- 物理论素案(big O)的最坏情况分析不应是唯一的决策因素。
- 实际中,常数因素(如2n比4n好)和平均性能同样重要。
- 内存局部性(memory locality)也是关键因素。
2. **设计中的权衡**
- 前期准备(如排序或索引)与运行时效率。
- 时间与空间的权衡:可以通过使用空间(如缓存或索引)来换取时间效率。
3. **时间复杂度估算**
- 文档通过表格展示了不同复杂度(如O(1)、O(log n)、O(n)、O(n log n)等)在不同输入规模(n)的执行时间估计。
- 例如:
- 对于n=1,000,000,O(1)操作约需1微秒,而O(n^2)操作可能需要数天甚至数万年。
- 假设单个操作需1微秒,O(n^2)在n=1,000,000时超过可行范围。
4. **分摊复杂度**
- 分摊复杂度是对一系列操作总的最坏情况复杂度的平均值。
- 例如:
- 如果n次操作总的最坏情况复杂度为O(n),则分摊复杂度为O(1)。
- 如果总的最坏情况复杂度为O(n^2),则分摊复杂度为O(n)。
5. **容器操作的复杂度**
- 例如:
- `push_back`到一个`vector`的分摊复杂度为O(1)。
- `std::list::insert`和`std::list::erase`的复杂度为O(1)。
- STL中的具体操作复杂度:
- O(1):`std::vector::pop_back`。
- O(n):`std::find`、`std::max`、`std::min`。
- O(log n):`std::binary_search`、`std::map::find`、`std::map::insert`。
- O(n log n):`std::sort`。
- O(n^2):冒泡排序(bubble sort)。
6. **复杂度的意义**
- 算法复杂度不仅仅关注性能,还关系到算法的资源需求(如时间、空间)和扩展性。
---
### 总结
算法复杂度是设计高效、可扩展算法的核心要素。在实际应用中,需综合考虑最坏情况、平均性能、常数因素、内存局部性以及空间与时间的权衡。通过理解分摊复杂度和常见操作的复杂度,可以更好地选择合适的算法和数据结构。 |
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
下载文档到本地,方便使用
- 可预览页数已用完,剩余
40 页请下载阅读 -
文档评分