【补】搜索

在这里,汇集了搜索算法,包括线性查找、二分查找等。 线性查找(Linear Search) 代码实现 #include <iostream> using namespace std; int main() { int nums[10]; for (int i = 0; i < 10; i++) { nums[i] = i + 1; // 初始化数组,1~10 } int find; cin >> find; // 线性查找 for (int i = 0; i < 10; i++) { if (nums[i] == find) { cout << i; // 输出找到的索引 return 0; } } cout << "Not found"; // 没找到 } 算法解析 这是最基本的查找算法,也是最简单的一种。 遍历数组 for (int i = 0; i < 10; i++),依次检查 nums[i] 判断是否匹配 if (nums[i] == find),如果找到目标值,就输出索引 i 提前返回 return 0; 避免多余的遍历,提高效率 未找到时输出 “Not found” 遍历结束仍然没找到目标值,则打印 “Not found” 时间复杂度为 O(n),适用于无序数组,或小规模数据 二分查找(Binary Search) 代码实现 #include<iostream> using namespace std; int main() { int nums[10]; for (int i = 0; i <= 9; i++) { nums[i] = i + 1; } int find = 0; // 要查找的元素 int left = 0, right = 9; // 元素下标 int mid = 0; // 元素下标 cin >> find; while (left <= right) { mid = (left + right) / 2; if (nums[mid] > find) { // 要找的元素在中点左边 right = mid - 1; continue; } if (nums[mid] < find) { //要找的元素在中点左边 left = mid + 1; continue; } if (nums[mid] == find) { cout << mid; return 0; } } cout << "Not found"; } 算法解析 初始化 nums 数组被初始化为 {1, 2, 3, …, 10},即 升序排列。 left = 0, right = 9,分别表示搜索范围的 左端 和 右端。 mid = (left + right) / 2,计算当前范围的 中间元素。 查找过程 如果 nums[mid] > find,说明目标在 左半部分,所以更新 right = mid - 1。 如果 nums[mid] < find,说明目标在 右半部分,所以更新 left = mid + 1。 如果 nums[mid] == find,找到目标,输出索引并终止程序。 终止条件 找到目标时,输出其索引并返回。 若 left > right,表示搜索范围为空,目标元素不存在,输出 “Not found”。 时间复杂度 二分查找的时间复杂度是 O(log N),原因是: ...

三月 29, 2025 · 林墨瀚

算法自学笔记专栏总序

欢迎来到我的《算法自学笔记》专栏!这是我在自学算法过程中的一个学习日志,旨在记录并分享我对常见算法和数据结构的理解、学习过程中的思考以及探索到的有用资源。我希望通过这个专栏,能帮助自己更好地总结学习成果,同时为其他对算法感兴趣的同学提供一些启发和参考。 专栏内容概览 本专栏将涵盖以下几个主要方面: 基本数据结构:包括数组、链表、栈、队列、哈希表、树、图等常见数据结构。 排序与查找算法:涉及快速排序、归并排序、二分查找、线性查找等常用算法。 动态规划:深入讲解背包问题、最短路径问题、最长公共子序列等经典问题的解法。 图算法:介绍深度优先搜索、广度优先搜索、最小生成树、最短路径等图相关算法。 其他算法:包括贪心算法、回溯算法、分治算法等常见的高级算法。 专栏目标 整理学习笔记:将学习过程中遇到的关键点、算法实现和常见问题进行总结,并加以归纳整理。 分享学习经验:记录并分享自己的自学心得,帮助更多对算法感兴趣的学习者更高效地入门和进阶。 持续更新:随着学习的深入,我将持续更新专栏内容,不断补充新的算法和数据结构,力求使本专栏内容更加丰富和完善。 专栏发展方向 目前,我已完成了常见数据结构和部分经典算法的学习笔记。未来,我会继续扩展更深入的算法和数据结构内容,并根据实践经验不断优化和完善笔记。 此外,专栏的配套网站也在开发中,未来将提供更加直观的学习资料,并结合在线编程和算法演示,进一步增强互动性和学习体验。 如何使用本专栏 仓库地址 浏览笔记:可以随时浏览并参考专栏中的各类学习笔记,帮助你理解算法的核心思想及其实现方式。 贡献代码:如果你在某个算法或数据结构上有新的见解或改进,欢迎通过提交 Pull Request 参与贡献。 参与讨论:如果你在学习过程中有问题或想法,可以在 Issues 区域提出,我们一起讨论、解决。 关于我 我的背景 我是一个初二学生,虽然算法学习起步较晚,但我一直对编程和算法充满浓厚兴趣。如今,我正通过自学不断提升自己的算法水平,并希望能通过实践提升自己的编程能力。 为什么专注算法学习 在我的学习经历中,我曾对编程语言产生浓厚兴趣,并开始尝试学习一些编程语言。然而,老师建议我先专注于算法学习,因为掌握算法的核心思维将帮助我更好地理解编程语言的底层原理。因此,我决定将语言学习暂时搁置,集中精力攻克算法,培养扎实的逻辑思维能力。这一决定,也为我后续的编程之路打下了坚实的基础。 我的目标 我的目标是通过不断学习算法和数据结构,在信息奥赛(NOI)中争取获得省赛一等奖。我相信,通过扎实的算法基础,不仅能提升我的编程水平,也能帮助我在将来的编程竞赛中脱颖而出。 学习资源与参考资料 在这条自学算法的道路上,我参考了以下书籍和资料: 《hello 算法》:为初学者提供了很多实用的算法学习资料和代码示例,帮助我从零基础入门。 CS自学指南:为自学计算机科学的学生提供了清晰的学习路径,帮助我规划和组织学习内容。 HackWay技术学习路线:提供了从入门到进阶的技术学习路线,帮助我更系统地提升技能。 《算法基础:打开算法之门》:为算法入门提供了详细的讲解,帮助我理解基础概念。 《算法导论》:经典教材,深入探讨了算法设计和分析,是我的重要参考书。 《数据结构、算法与应用:C++语言描述》:结合C++语言讲解数据结构和算法的实现,帮助我理解实际应用。 许可证 此专栏内容采用 CC BY-NC-SA 4.0 许可证,您可以在非商业用途下使用和分享本专栏的内容,但需要注明出处,并且分享的内容须遵循相同的许可协议。 致谢 特别感谢所有在算法和编程领域做出贡献的前辈,正是因为有了他们的知识和经验,我们这些自学者才能更容易获得进步。希望通过我的努力,这些宝贵的知识能帮助更多的学习者。 这是我自学算法过程中的一个小小总结和记录,希望你在这个专栏中能收获知识与灵感。欢迎你在学习中提出建议,或者与我共同探讨算法的奥妙!

一月 21, 2025 · 林墨瀚