算法学习1-入门了解

一、定义

算法可以被定义为:一个明确的、有序的、有限的步骤集合,用于解决一个特定的问题或执行一个特定的任务。

1、明确 (Clear):

算法的每一步都应该是清晰、无歧义的,这样任何人都可以理解并按照算法的指示进行。

2、有序 (Ordered):

步骤的顺序是固定的,这确保了每次运行算法时,它都会产生相同的结果(如果输入和初始条件保持不变)。

3、有限 (Finite):

算法的执行不能无限期地进行;经过一定数量的步骤后,它应该结束。

4、解决问题或执行任务:

算法的目的是解决某个特定的问题或执行某个特定的任务,无论是计算数字、排序列表,还是其他更复杂的任务。

二、特性

1、有穷性(Finiteness):

算法的有穷性指的是算法在执行有限的步骤后必须结束。换句话说,算法不能无限循环下去,它必须在某个点上停止并给出结果。这保证了算法在现实世界中的实用性,因为任何计算资源都是有限的。

2、确切性(Definiteness):

算法的确切性要求算法的每一步都必须有明确的定义,不能存在歧义。这意味着算法中的每一个指令或操作都必须是清晰、无歧义的,以便任何执行算法的人或机器都能准确地理解并执行它。

3、输入(Input):

算法通常具有零个或多个输入。输入是算法开始执行前需要的数据或信息。这些输入数据用于指导算法的执行过程,并影响算法的输出结果。在某些情况下,算法可能没有显式的输入,但通常都会有一个或多个输入(可能是隐式的)。

4、输出(Output):

算法至少有一个输出,用于表示算法执行的结果。这个输出是算法对输入数据进行处理后得到的答案或解决方案。在大多数情况下,输出是显式的,可以通过某种方式(如打印到屏幕、保存到文件等)进行查看或使用。

5、可行性(Feasibility):

算法的可行性要求算法中的每一个步骤都必须是可行的,即它们可以在有限的时间内完成。这包括算法中的计算、存储和通信等操作。如果算法中的某个步骤无法在有限的时间内完成,那么该算法就是不可行的。

6、高效性(Efficiency):

虽然高效性不是算法定义中的直接特性,但在实际应用中非常重要。高效性通常指的是算法在解决问题时所需的时间和空间资源。一个高效的算法能够在较短的时间内使用较少的资源完成任务,从而提高整个系统的性能。

7、鲁棒性(Robustness):

算法的鲁棒性是指算法在面对异常情况或错误输入时能够正常工作的能力。一个鲁棒的算法应该能够处理各种异常情况,并给出合理的错误提示或结果,而不是崩溃或产生不可预测的行为。

8、可维护性(Maintainability):

算法的可维护性是指算法在修改、扩展或维护时的难易程度。一个可维护的算法应该具有良好的结构、清晰的注释和易于理解的代码,以便其他开发人员能够轻松地理解、修改和扩展它。

三、算法分析

1算法效率的分析

1)、时间复杂性:

衡量算法执行所需时间的指标,通常用大O表示法来表示。较低的时间复杂性通常意味着更高的性能。O(f(n)):n为问题的规模,f(n)为执行次数的系数为1的最小阶,O(f(n))表示时间复杂度。

2)、空间复杂性:

衡量算法在执行过程中所需内存空间的指标。与时间复杂性类似,我们希望尽量减少算法的空间占用。表示与世界复杂度一样。

2算法效率的影响因素

问题规模:问题的大小或输入数据的数量。

计算模型:计算机执行基本操作的速度。

实现细节:算法的具体实现方式(如编程语言、数据结构选择等)。

3、算法分析的重要性

评估算法的性能,以便选择最优算法或改进现有算法。

优化计算过程,提高程序的性能和可维护性。

深入了解算法的工作原理和计算复杂性理论。

四、常用算法

算法可以宏泛的分为三类:

A、有限的,确定性算法 

这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。

B、有限的,非确定算法 

这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。

C、无限的算法 

是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。

1、递推算法

递推法是计算机序列常用的一种算法,它按照一定的规律来计算序列中的每一项,通常是通过计算机前面的一些项来的出序列中指定的值。其思想是把一个庞大的负责的运算过程转化为简单的多次重复计算,该方法利用了计算机快和不知疲惫的机器特点。

1)、例子:小明有5块钱,说小红比小明多2块,小李又说我比小红多2块,小王说我比小李多两块。那么其他人是多少?

这个问题就可以使用递推算法:设小明=a 小红=a1  小李=a2    小王= a3  

a=5

a1=5+2

a2=(5+2)+2

a3=((5+2)+2)+2

2、递归算法

递归是一种通过在算法的执行过程中自我调用的方式来解决问题的方法。在递归算法中,问题被分解为更小的子问题,并通过递归调用相同的算法来解决这些子问题。递归算法通常通过定义一个或多个基本情况(边界条件)来终止递归过程。

1)、例子:

找文件:在电脑中,文件夹可以包含其他文件夹,这些子文件夹也可以包含更多的文件夹,如此类推。这是一个典型的递归结构。当你编写程序来遍历整个文件系统以查找特定类型的文件时,你可能需要使用递归来访问每个子文件夹并检查它们的内容。

2)、适用场景

问题可以被分解为更小的子问题进行求解的场景一些常见的应用场景包括:

树的遍历: 二叉树的前序、中序和后序遍历就是递归算法的经典示例。

图的搜索: 图的深度优先搜索(DFS)和广度优先搜索(BFS)都可以使用递归算法实现。

动态规划: 在动态规划问题中,递归算法通常被用来定义子问题的状态转移方程。

分治算法: 分治算法将问题拆分为更小的子问题,通常通过递归算法来解决。

回溯算法: 在回溯算法中,递归算法用于在解空间中搜索所有可能的解。

3)、优缺点

递归算法的优点是可以让代码更简洁、更易于理解,尤其是处理树形结构或分层结构的数据时。然而,递归也有其缺点,比如可能导致大量的函数调用,从而消耗更多的内存和可能引起栈溢出错误,尤其是在深度递归的情况下。为了克服这些问题,有时候可以使用迭代算法或者尾递归优化等技巧。

3、分治算法

将难以直接解决的大问题分解成一些规模较小的相同问题,请注意这个相同,以便与动态规划进行区别使用。

1)、例子:

整理房间:当你需要整理一个凌乱的房间时,你可以使用分治算法的方法来完成任务。首先,你可以将房间分成不同的区域,比如书桌、衣柜、床铺等。然后,分别清理每个区域,最后再整体检查一遍房间。这样,原本看起来巨大的任务就被分解成了几个较小且更易管理的任务。

大型项目管理:在工作或学习中,面对一个大型项目,有效的策略是将其分解为一系列可管理的子任务或阶段,分配给不同的团队成员或设定不同的截止日期。每个子任务完成后,整个项目的进度就会向前推进。

2)、分治算法的基本步骤:

分解(Divide):将原始问题分解为多个相同或相似的子问题。这一步通常涉及将问题划分成更小的规模,以便于处理。

解决(Conquer):逐个解决每个子问题。对于小规模的子问题,可以直接求解。

合并(Combine):将各个子问题的解合并,得出原始问题的解。这一步确保子问题的解能够有效地组合成原始问题的解。

3)、适用场景

问题可以被分解为更小的相同或相似的子问题进行求解的场景,一些常见的应用场景包括:

a、归并排序(Merge Sort):

归并排序是一种经典的排序算法,它利用了分治思想。该算法将一个大的排序问题分解为多个小的排序子问题,分别解决后再将它们合并起来,得到整体有序的结果。

b、快速排序(Quick Sort):

快速排序也是一种常见的排序算法,同样基于分治思想。它通过选取一个基准元素,将数组划分为两个子数组,然后分别对这两个子数组进行排序,最终得到有序结果。

c、最大子数组和问题:

这个问题要求在一个整数数组中找到一个连续的子数组,使得子数组的元素和最大。分治算法可以将问题分解为三种情况:最大子数组在左边、最大子数组在右边,或者跨越了数组中点。然后,将这三种情况的解合并,得到全局最优解。

4、贪心算法

贪心算法的核心思想是在每一步中都选择当前状态下的最优解,而不考虑全局后果。它通常适用于那些问题,其最优解可以通过一系列局部最优解的组合得到

1)、步骤

选择阶段: 从问题的所有可能选择中,选择一个局部最优解。

限制阶段: 将问题规模缩小,转化为一个子问题。

最优解合并阶段: 将局部最优解与子问题的解合并,得到全局最优解。

核心思想:贪心算法:从当前的数据可以推断以后的数据;动态规划,以前的数据可以推断现在的数据。注意区分两者的思想,虽然思想不同,但是贪心算法可以解的题也可以用动态规划来解,只是动态规划的时间复杂度与空间复杂度都相对于贪心算法更高一些。

贪心算法的关键是选择合适的贪心策略,以确保每一步都是局部最优的。然而,需要注意的是,贪心算法并不总能得到全局最优解,因此在应用时需谨慎考虑问题的性质。

2)、例子

找零钱问题:当你在商店购物,需要找回零钱时,收银员通常会使用贪心算法来找出最少数量的硬币和纸币。例如,假设你在一个只接受现金的商店里需要找回97美分,收银员会先给你一个50美分的硬币,再给两个20美分的硬币,然后是一个5美分的硬币和两个1美分的硬币,总共用了6枚硬币。这个过程就是一个典型的贪心算法应用,每次都选择面值最大的货币。

3)、适用场景

递归算法适用于:问题可以被分解为更小的子问题进行求解的场景。

局部最优即全局最优的场景,如何证明局部最优可得到全局最优这是贪心算法的难点,一些常见的应用场景包括:

活动选择问题: 给定一系列活动,每个活动有开始时间和结束时间。目标是选择最大数量的不重叠活动,使得参与活动的人数最多。

霍夫曼编码: 在数据压缩中,霍夫曼编码是一种用于压缩数据的贪心算法。它通过为出现频率较高的字符分配较短的编码来减少数据的存储空间。

最小耗费生成树(Prim算法):在图中寻找最小生成树的问题中,Prim算法通过从一个初始节点开始,逐步选择与当前树相连的边中权值最小的边,从而构建最小生成树。

零钱兑换问题: 给定一些面额不同的硬币和一个目标金额,找出使用最少的硬币来达到目标金额。

分数背包问题: 在背包问题中,每个物品有一定的价值和重量,但可以分割成较小的部分。贪心策略是优先选择单位价值最高的物品。

5、动态规划算法

动态规划算法是一种常用的问题解决方法。它通过将问题分解为更小的子问题,并保存子问题的解,以避免重复计算。与分治法不同的是,动态规划算法的子问题往往是不相同的且有关联的。

1)、步骤

动态规划的核心在于:

现在的问题由过去求解,分析当前解是如何从过去的解中得到的,即从问题中得到递推式。

使用一个表来记录所有已解决的子问题的答案,不管他以后是否被用到,只要他被计算过,就将其结果记录表中。

明确dp[i][j]所指的含义

2)、应用场景包括:

背包问题: 给定一组物品和一个背包,每个物品有自己的重量和价值,要求选择一些物品放入背包,使得背包中物品的总价值最大。动态规划算法可以帮助我们解决这个问题,通过构建一个价值表格,在每个状态下选择最优的决策。

最长公共子序列问题: 给定两个字符串,找到它们之间最长的共同子序列的长度。通过构建一个二维表格,依次计算每个子问题的最长公共子序列长度,并保存在表格中。

最优路径规划: 在一个网格中,从起点到终点,要求找到路径的总和最小或者最大的路径。动态规划算法可以通过构建一个二维表格,依次计算每个子问题的解,并保存在表格中,最终得到最优路径。

3)、例子

购物预算分配:假设你有一个固定的购物预算,想要购买一系列商品,每件商品有不同的价格和价值。动态规划可以帮助你决定如何分配预算,以获得最大化的总价值。例如,你可以创建一个表,列出所有可能的预算分配情况,然后选择最佳的组合。

6、回溯算法

回溯算法是一种深度优先的搜索技术它遵循一种“试错”的思路。在解决问题的过程中,我们通过选择某个路径并探索下去,然后发现当前选择并不是最优或者不符合约束条件时,就返回上一步重新选择路径,直到找到问题的解或者遍历完所有可能的路径。

1)、步骤:

定义问题的解空间:确定问题的解可表示为一个N维向量,其中N是问题的规模,一般是一个数组。

确定约束条件:定义问题的解必须满足的条件,以便在搜索过程中剪枝,即找到解,进行减枝。

选择合适的搜索顺序:根据问题的特点,选择合适的搜索顺序,以提高搜索效率。

编码回溯函数:实现回溯函数,其中包括终止条件、约束条件的判断和路径的选择,这个是核心。

执行回溯搜索:根据回溯函数进行递归搜索,记录符合条件的解并完成状态回退。

2)、例子

迷宫寻路:在迷宫中寻找出路,如果没有地图,你可能会尝试一条路径,如果这条路径不通,你就会返回到之前的岔路口,尝试另一条路。这个过程中,你不断地前进和回退,直到找到正确的出路,这就是回溯算法的直观应用。

五、总结

算法确实是计算机科学的基石,它构成了软件开发、数据分析、人工智能等多个领域的核心。掌握算法基础对于任何计算机科学的学习者来说都是至关重要的,它不仅能深化你对计算机程序运行机制的理解,还能显著提升程序的性能和效率,进而解决更复杂的问题。

在算法学习的旅程中,以下关键步骤将引导你从入门到精通:

1. 理解基本概念:首先,熟悉算法的基本定义,包括它是什么、它如何工作以及它在解决问题中的作用。理解算法的输入、输出、步骤和目标是至关重要的。

2. 学习度量指标:掌握评估算法性能的标准,如时间复杂度(大O符号)和空间复杂度。这些指标帮助你判断算法的效率,以及它在处理大规模数据时的表现。

3. 熟悉常用算法:从简单的排序算法(如冒泡排序、插入排序、快速排序)和搜索算法(如线性搜索、二分搜索)开始,逐渐过渡到更复杂的算法,如动态规划、贪心算法、图算法和机器学习算法。

4. 算法设计与分析:学会如何设计新算法,以及如何分析算法的正确性、效率和资源消耗。这包括理解算法的设计原则,如分治、贪心、动态规划等,以及如何使用数学工具进行分析。

5. 实践与挑战:通过解决实际问题和参与编程竞赛,将理论知识应用于实践。在线平台如LeetCode、Codeforces和HackerRank提供了丰富的练习题和竞赛,帮助你巩固技能并测试算法设计能力。

6. 持续学习与探索:计算机科学是一个快速发展的领域,算法也不例外。持续关注最新的研究进展,阅读学术论文,参加研讨会,可以让你保持前沿知识,发现新的算法和技术。

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值