前言
数据结构与算法是一门很重要的科目,在目前数据化时代也起着至关重要的作用,在以后面试以及工作中起着至关重要的作用。今天我们就来谈一谈数据结构与算法中的算法,在百度词条中,算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。通俗的来讲,算法就是解决某一实际问题的,如果一个小白想要开始学习算法,怎么做才能最高效呢?
必备基础
算法的特征:
有穷性(算法的有穷性是指算法必须能在执行有限个步骤之后终止)
确切性(算法的每一步骤必须有确切的定义)
输入项(一个算法有0个或多个输入,以刻画运算对象的初始情况)
输出项(一个算法有一个或多个输出,以反映对输入数据加工后的结果)
可行性(也称之为有效性)。
影响算法优劣的因素:时间复杂度,空间复杂度,正确性,可读性,健壮性(也称容错性)
这些基础知识掌握后,就继续看笔者学习算法的经验吧。
经验分享
笔者初学算法的时候是大一想要参加程序竞赛,让自己的大学生活不是那么颓废,然后就突然觉得学习算法挺有意思的,就学上了,所以兴趣是最好的老师,接下来进入正题。
我们要明确算法是有很多种,多到这一辈子都学不完,我们重点是掌握一些常用的算法,这些学会了以后小伙伴们可以根据自己的方向去钻研。以下这些就是算法学习之路必须攻克的关卡:排序类算法,动态规划,贪心算法,递归,回溯类算法。学好这些其实就两步,练习过后理解,理解过后再练习,如果觉得没掌握,就再来一次,反复着来,怎么都可以掌握,这是总体学习的方针。下面针对不同算法来做一下讲解吧。
排序类算法
笔者认为排序类算法是众多算法中最简单的一类算法,排序本质其实就是比较大小,不同的排序方法只是比较大小的方式有所差异,大家多理解其中的差异就可以很轻松地掌握不同的排序方法,面对众多的排序算法,就一下几种常用:冒泡排序,选择排序,插入排序,快速排序,堆排序。这些排序看理论很好懂,代码也好懂,大家稍微用一点心就可以看懂的。
动态规划
重点!在一类问题中,可能会有许多可行解。动态规划算法可以帮助我们在这些可行解里面找出最优解。其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中,最后通过这个表来得到最优答案。我们一起来看一道力扣平台上比较简单的动态规划题目:
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组,求所有子数组的和的最大值。 示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 |
在这道题里,目标是找连续子集的最大和,这道题我们创建数组dp吧,用dp[i]代表以元素 nums[i] 为结尾的连续子数组最大和。所以dp[0]为-2,dp[1]为max[dp[0],dp[0]+nums[1]], dp[2]为max[dp[1],dp[1]+nums[2]],一次类推,最后我们在dp里就找到了和题目相符合的解了,是不是很简单呀。解决了第一道此类型的题目后,以后的就会感觉轻松很多,练习再理解,理解再练习,反复着来,很快就会了。
贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。都是最优解,那贪心和上面的动态规划有什么区别呢?动态规划最后得到的结果是从整体出发的,而贪心就是从局部,比如平时购物找零钱时,为使找回的零钱的硬币数最少,不要求找零钱的所有方案,而是从最大面值的币种开始,按递减的顺序考虑各面额,先尽量用大面值的面额,当不足大面值时才去考虑下一个较小面值,这就是贪心算法。动态规划则会求出所有方案。如需找零9元时,我们有1元,3元和5元的硬币,用贪心算法只会得到(5,3,1)一种结果,动态规划还可以得到(3,3,3)这第二种结果。
下面给大家一道经典的背包问题,大家自己研究怎么贪吧:
有一个背包,背包容量是M=150。有7个物品,物品不可以分割成任意大小。 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 物品 A B C D E F G 重量 35 30 60 50 40 10 25 价值 10 40 30 50 35 40 30
|
回溯类算法
这类算法其实就是指深度优先搜索和广度优先搜索。这两种道理很简单,但是实际运用起来会很困难,先用下面的图来说明一下吧
我们要从A开始然后找到目标点D,我们可以沿着一种特定点进行移动,无法移动时再按照某种方式进行回溯。
如果是深度优先搜索,我们就按着一条线一直往下走,无路可走时再回溯到起点,此时就是A-C-F,再是(A)-(C)-E-G,最后是(A)-B-D,连起来就是A-C-F-E-G-B-D。(括号里是走过的点)广度优先搜索就是先走当前点可以走的所有点,再走下一个点可到的所有点,此时就是A-B-C,再(C)-E-F,再(B)-D最后(E)-G,连起来就是A-B-C-E-F-D-G这就是回溯类算法最基本的思想,想深入学习,大家就去力扣平台上练题吧