从0开始学算法——第一天(认识算法)
写在开头的话
在信息技术飞速发展的今天,算法成为了我们生活中不可或缺的一部分。算法,简单来说,是一系列明确的步骤或规则,用于解决特定问题。它们在计算机科学中扮演着核心角色,从数据处理到机器学习,再到优化问题,算法的应用无处不在。本章节我们来聊聊算法这件事儿,也聊聊算法和数据结构是什么关系。
知识点:
(1)算法是什么(2)为什么要学习算法
算法是什么
通俗介绍
初步学习算法的朋友,可能觉得算法是个很高大上的东西,其实不然。
算法就是从我们的生活中,从解决一个个问题中诞生的。我们可以从一个简单的小故事开始,从前有一个聪明的厨师,名叫小美。她每天都要准备各种各样的菜肴,但每次都面临一个问题:如何在有限的时间内完成所有的菜?
一天,艾米丽决定制定一个“烹饪算法”。她把所有的菜分成几个步骤,比如准备食材、烹饪、装盘等。为了提高效率,她开始按照固定的顺序来进行:先准备所有的蔬菜,再煮面,最后一起装盘。这个顺序就像是一种明确的规则,每一步都必须按照特定的方式进行。
随着时间的推移,艾米丽的算法越来越成熟。她开始尝试不同的组合,优化每一个步骤,比如提前腌制肉类,让其更入味。最终,她不仅缩短了烹饪时间,还提高了菜肴的美味度。
其实上面的故事我们可以大概知道:算法是解决问题的明确步骤和规则,帮助我们高效地达到目标。
例子
再举几个例子,方便大家理解:
搜索算法:想象一个小镇的图书馆,书籍排列在不同的书架上。如果一个学生想找到一本特定的书,他可以使用两种方法:
- 线性搜索:从第一个书架开始,逐一检查每本书,直到找到目标书。这种方法简单,但效率低下,尤其是书多的时候。
- 二分搜索:如果书籍是按字母顺序排列的,学生可以先查找中间的书,如果目标书在字母表中较早的位置,就在前半部分继续查找。这种方法显著提高了查找效率。
排序算法:假设你要为一个聚会准备饮品,手头有一堆不同的饮品。为了让大家更容易选择,你可以:
- 冒泡排序:反复比较相邻的饮品,逐步将最重的饮品“冒泡”到顶部,直到所有饮品按类型或口味排序。
- 快速排序:选择一个基准饮品,将其余饮品分成两组,一组比基准饮品更轻,另一组更重,然后递归处理每一组,最终得到排序的饮品列表。
路径规划算法:想象你在一个城市中,想从家到朋友的地方。你可以:
- Dijkstra 算法:考虑每条街道的距离,找到从起点到终点的最短路径。这种算法考虑了不同路径的成本,确保你选择最佳路线。
贪心算法:
- 找零问题:假设你在商店购物,总共需要支付 87 元,你有不同面值的硬币。贪心算法会优先使用面值最大的硬币,比如先使用 50 元、20 元和 10 元的硬币,然后是 5 元和 1 元,直到凑够 87 元。这种方法确保你使用最少的硬币。
到这里我们可以用更加官方的语言总结一下,算法是解决问题的明确步骤或规则。它可以被视为一个指令集,指导我们如何从输入开始,经过一系列操作,最终得到所需的输出。对于初学计算机的同学来说,可以这样总结算法的核心要素:
- 明确性:算法的每一步都必须清晰且没有歧义。
- 例子:假设你要制作一杯咖啡。一个明确的步骤是“将水煮沸”。这条指令没有模糊之处,执行者知道该如何操作。而如果说“准备水”,这就可能产生歧义,因为“准备水”可以有多种解释。
- 有穷性:算法必须在有限的步骤内完成,不会无限循环。
- 例子:设想一个算法用于找出一个数字的平方根。这个算法会进行若干次计算并最终得出结果,比如“将数字除以 2,然后判断结果是否接近平方根”。这个过程会在有限的步骤内完成,最终得出一个结果。如果一个算法无穷无尽,也就意味着没有结果,不明确。
- 输入与输出:算法接收特定输入,经过处理后产生输出。
- 例子:考虑一个算法用于计算圆的面积。输入是圆的半径(例如,半径为 5),算法会通过公式“面积 = π × 半径 ²”进行计算,输出结果是该圆的面积(约为 78.54)。
- 可行性:算法的每一步都应该是可执行的,可以由计算机实现。
- 想象一个排序算法,比如冒泡排序。每一步都可以通过比较相邻的元素并交换来实现。每个操作都很简单,任何人都能理解和执行。而如果算法需要进行一些复杂的数学运算或抽象概念,就可能无法直接执行,从而失去可行性。
到这里大家大概知道了算法到底是什么,但是你们应该也会好奇数据结构是什么?算法和数据结构之间又存在什么关系呢?
程序=数据结构+算法
如果程序比做一个人,那么数据结构相当于骨架,算法相当于一直流淌的血液,算法和数据结构是计算机科学中两个密切相关的概念,它们共同构成了程序设计的基础,数据结构和算法是很拆不开的,你中有我,我中有你,相辅相成。算法和数据结构相互依赖。有效的算法需要适当的数据结构来存储和管理数据,而适当的数据结构则能提高算法的效率。在这里我先不展开数据结构的话题,为了让大家更好的理解,借助《数据结构 C 语言》版本中的一句话:
为了编写出一个”好“的程序,必须分析待处理的对象的特性以及各处理对象之间存在的关系,这就是”数据结构“这门学科和发展的背景。
为什么要学习算法
算法这么好,每个人都要学么?我可不可以不学? 答案:不是每个人都要学,但是计算机学生是逃不掉的,不是计算机的学生,如果想从事相关工作,学习算法也是必经之路。下面我从几个点来聊聊:
1. 专业基础
- 核心知识:算法是计算机科学的基础之一,理解算法原理有助于深入掌握数据结构、编程语言和软件工程等课程,一句话:算法是很多其他知识的基础。
- 理论与实践结合:学习算法不仅有助于理解计算机系统如何工作,还能够将理论应用于实际编程中,提高代码效率和可读性。
2. 就业机会
- 求职竞争力:许多技术岗位(如软件工程师、数据科学家、系统设计师等)都需要良好的算法基础。面试中常常会涉及算法和数据结构的题目,掌握这些内容能够提高面试成功率。(大厂面试必考算法)
- 行业需求:随着科技的发展,各行各业对算法的需求不断增加,例如人工智能、机器学习和大数据分析等领域。
3. 解决问题能力
- 逻辑思维:学习算法能够提升逻辑思维和抽象能力,帮助你更好地分析和解决复杂问题,生活中你会遇到很多问题,算法不能说完全帮上你,但是至少能帮助你做出足够理智的决策。
- 优化能力:理解算法的效率和复杂度分析,使你能够在编写代码时进行优化,提高程序性能。
4. 实际应用
- 项目开发:在实际项目中,选择合适的算法可以显著提高系统的效率和响应速度。例如,选择合适的排序或搜索算法可以优化数据处理过程。
- 创新能力:掌握算法有助于你在技术创新上有所突破,能够设计出更高效或更智能的系统和应用。
- 算法竞赛:参加编程竞赛(如 ACM、LeetCode 等)不仅提高编程能力,还能深化对算法的理解,锻炼快速解决问题的能力。
5. 持续学习
- 适应变化:计算机领域发展迅速,新的算法和技术层出不穷。学习算法的基础使你能够更容易地适应新技术,持续学习和更新知识。算法就像是内功,内功学好了,以不变应万变。
从功利的角度来看,如果以后需要从事计算机行业,找到一份满意的工作,熟悉算法就是你的一部分底气,是你基础扎实的体现,容易让你从面试中脱颖而出,想换工作的时候也不用特别费力再刷算法题目。一位前辈曾经和我说过,算法或许不会在你平时的开发中,每一天都能帮到你具体的工作,但是一旦起作用,就是极大的帮助,同时,算法也可以帮助我们培养不为难的精神,至少不畏惧,明知山有虎,偏向虎山行。
总结
在本章节中,介绍了算法的定义,强调其作为解决问题的系统性步骤和规则在计算机科学中的核心地位。同时,探讨了学习算法的重要性,包括对逻辑思维的提升、职业竞争力的增强,以及在实际应用中的广泛适用性。
