算法思维初学者指南
概念
数据结构和算法是编程的基础。编程语言来来去去,但DSA一直在那里,确保软件开发过程的效率。
算法是用于解决问题或执行计算的过程。算法充当指令的精确列表,在基于硬件或软件的例程中逐步执行指定的操作。算法是成功和高效开发的核心。您将在学习编码时使用它们,在技术面试中会被问及它们,它们可能会成为您日常开发工作的一部分。
每个解决方案都始于策略,而算法是解决编码问题的策略。因此,我们必须学会设计一种高效的算法,并将该“算法”转换为正确的代码以完成工作。
但是在数据结构和算法中存在许多编码问题,大多数时候,这些问题对我们来说是新的。因此,作为程序员,我们需要将自己培养成自信的问题解决者,不会被给定问题的难度吓倒。
思维逻辑
它强调了编程中的逻辑。让我们举一个现实生活中的例子开始。
想象一下,您是一名班级监督员,必须收集所有学生的试卷并根据他们的卷号排列它们。
你把文件分成相等的两半,另一半给你的朋友。之后,您和您的伴侣按卷号对两半进行排序。最后,剩下要做的就是一次堆叠两组一张纸,瞧!你已经用了一半的时间完成了。
不知不觉中,您在此实例中使用了合并排序,这是可用的最重要的排序算法之一。
数据结构用于以逻辑方式存储和组织数据,而算法是我们用来执行特定任务的过程。两者相结合,使智能手机、计算机和网站能够做出有效的决策并顺利运行。
简单的事实是,算法只是做事的方式。它们是解决某种问题的过程。
从本质上讲,算法思维是思考如何以系统的方式解决问题。类似于这样的思考过程:
- 明确定义问题
- 将问题分解为小而简单的部分
- 为问题的每个部分定义解决方案
- 实施解决方案
- 使其高效(最终)
不同算法
以下是不同种类型的算法:
- 暴力算法:Brute Force Algorithm 该算法盲目迭代问题的所有可能解决方案,搜索函数的一个或多个解决方案。
- 递归算法:Recursive Algorithm 此算法反复调用自身,直到解决问题。递归算法在每次调用递归函数时都使用较小的值调用自身。
- 动态规划算法:Dynamic Programming Algorithm 该算法通过将问题划分为子问题来解决问题。然后将结果存储起来,以应用于将来的相应问题。
- 分而治之算法:Divide and Conquer Algorithm 这种通用算法分为两部分。一部分将问题划分为更小的子问题。第二部分解决这些问题,然后将它们组合起来产生解决方案。
- 贪婪算法:Greedy Algorithm 该算法通过找到局部最优解来解决优化问题,希望它是全局水平的最优解。但是,它不能保证最佳解决方案。
- 回溯算法:Backtracking Algorithm 该算法在增量方法中找到给定问题的解决方案,并一次解决一个问题。
- 随机算法:Randomized Algorithm 该算法减少了运行时间和基于时间的复杂性。它使用随机元素作为其逻辑的一部分。
- 搜索引擎算法:Search engine algorithm 该算法将关键字和运算符的搜索字符串作为输入,在其关联的数据库中搜索相关网页并返回结果。
- 加密算法:Encryption algorithm 此计算算法根据指定的操作转换数据以保护数据。对称密钥算法(例如数据加密标准)使用相同的密钥来加密和解密数据。如果算法足够复杂,那么缺少密钥的人都无法解密数据。
- 排序算法:Sorting algorithm 排序算法用于基于比较运算符重新排列数据结构,该运算符用于确定数据的新顺序。
- 哈希算法: Hashing algorithm 该算法获取数据并将其转换为具有哈希的统一消息。
示例:在给定的数字列表中查找最大值。
解决方案:这是一组说明(或算法),您可以按照这些说明(或算法)在列表中查找最大值。
- 从第一个数字开始,并将其指定为最大值。
- 现在,转到第二个数字;如果第二个数字>第一个数字,则将最大值设置为第二个数字,否则没有变化。
- 即,如果当前数字大于最大值,则将最大值设置为当前数字。
- 转到列表中的下一个数字,然后重复步骤 2,直到到达列表末尾。
- 最大值是存储在最大值变量中的值。
用 Python 编写上述程序:
def find_max(list):
maximum = list[0] # 将第一个值设置为最大值
for i in range(len(list)):
if list[i] > maximum: # 检查当前值是否大于当前最大值
maximum = list[i] # 如果当前值大于当前值,则将当前值设置为最大值
return maximum
# 测试列表
l1 = [1, 2, 3, 4, 5, -5, -4.5, -3.5, -2.5, -1.5, 0]
# 输出结果
find_max(l1)
优点和缺点
优点 | 缺点 |
---|---|
提供清晰准确的解决方案描述,使其易于理解和遵循 | 设计算法既困难又耗时 |
它是可重用的,即一旦设计了算法,就可以多次使用 | 它需要强大的解决问题的能力和对编程概念的理解 |
算法被设计为优化和高效,这使得它们能够解决复杂的问题。 | 它们是为特定平台或编程语言设计的,这使得它们不太灵活。 |