| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【万字长文】不学算法你也应该知道的算法知识 -> 正文阅读 |
|
[数据结构与算法]【万字长文】不学算法你也应该知道的算法知识 |
文末有投票哦~~前言兄弟,想一起学习算法吗?想一起变强吗?想毕业的时候在算法方面吊打面试官吗?想成为刷题狂人吗? 快来联系我,一起互相监督,一起征服力扣~~ 我的伙伴,刷题四天王(自己封的): 那还等啥!算法那还不得赶紧学起来!这一激动我这包整的河南话都彪出来了。 一、什么是算法什么是算法?我们为什么要学算法?算法是为了什么才出现的?算法是怎么从解决一个问题慢慢到解决一个体系的问题的? 想要学习算法,如果你要求不高,你可以不学这个,你只需要知道怎么用,如何用,什么地方用就可以了~ 但是如果你对算法想有深入的了解,那么这些你是需要知道的。 1.1 绪论想必大家都听过这样一句话: 你可能会说:屁嘞,我不会数据结构与算法,我也照样写程序。我只能说:能说出来这话,一看你就是个新手! 你了解什么是数据结构吗?你了解什么是算法吗?不要把它们看得那么高大上,他们的原本定义其实很简单的~~ 数据结构:
算法:
有点模糊也没关系,我来带你看几个例子,你就明白了~~ 案例:例子1 HelloWorld:
例子2 两个数字相加:
例子3 两数之和(来真的了啊!):
当然,例3的方法是很简陋的,更简单的方法还有哈希法和二分法,在这道题中,哈希法的时间复杂度是O(n),二分法的时间复杂度为O(nlogn) 感兴趣的话,可以看看我的这一篇博客:零基础的我刷力扣一周后,总结了点东西 这三个例子大概也能让你对什么是数据结构与算法有一个大致的了解了。那么接着看吧~ 二、为什么要学算法既然知道了算法是什么,那么你知道为什么要学习算法吗?
那么为什么公司喜欢会算法的人呢?换句话说,为什么会算法的人会更吃香呢?
而算法的出现也是因为先有了问题,之前也说过算法是什么了,就是一个问题的解决方案,所以我们的算法是为了解决问题才出现的。 三、算法的特性当然一个问题都是可以由多个算法解决的。俗话说,无规矩不成方圆。 那么不同的算法是不是得有相同的规则,或者说相同的特性,才能约束算法,不能任意一种算法就可以解决问题。 打个比方,就用曹冲称象这个例子吧。为了不浪费大家的脑子,我决定就说的简单一点。
你觉得方法1和方法2怎么样?先不急着回答,我们先看看算法的这几个性质。 1. 有穷性
2. 确定性
3. 可行性
4. 正确性
那么,在看完这四个特性后你怎么回答上面的问题呢? 当然,答案我也在特性里面说了出来,还不知道答案的,面壁思过去! 四、算法的分析那么讲了这么多,我们怎么判断我们的程序是好是坏呢?那就是时间复杂度和空间复杂度。 是不是感觉这两个名词好难理解?没事,他其实也不难。 1. 时间复杂度所谓时间复杂度就是算法执行的时间。而时间复杂度可以由两种方式:
我们知道,即使是同一种算法,在不同的编程语言,不同的机器,不同的环境索引行的实际时间也是不一样的。 所以第一种方式,就不是很银杏化!那么就只能是第二种方法了来判断我们的程序是否得到了优化~~ 而时间复杂度又分为三种,最优情况,最劣情况,平均情况。而这个情况是由问题来决定的~ 这三种情况我就不多说啦~看名字就知道了 时间复杂度统一使用O(x)来表示,也是俗称的大O表示法,而时间复杂度的大小与问题有关。
而如果需要嵌套循环,那么可能是O(n**2)或者O(nlogn)。 常见的时间复杂度按照从小到大的顺序排列有:O(1),O(logn),O(n),O(nlogn),O(n**2),O(2**n),O(n!) 2. 空间复杂度根据算法在执行过程所使用的存储空间,分为堆区和栈区,当然还有别的区。 而栈区中存放着变量名,堆区中存放着变量名指向的值。这么说可能不好理解,那就画个图吧~~ 诶😱😨叭叭了这么多,好像还没到点上! 稍安勿躁嘛~~ 这就来空间复杂度啦~ 其实和时间复杂度差不多,我们使用常数,实数,或者对数组,字符串进行原地修改的时候,空间复杂度就是O(1),因为没有开辟新的空间 而如果是新建一个字符串,数组就是需要新开辟一个数组或者字符串空间,所以空间复杂度为O(n) 五、算法关于一些生活中常见的算法… 这里不讲代码,只讲原理! 1. 贪婪算法在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法 。 他也叫贪心算法。 举个栗子:
贪婪算法所能解决的问题的特性:
贪婪算法的有点事简单,直观,容易实现,但是缺点也很明显,那就是他会认为当前选择是满足条件的就进行下一个,而不管当前操作是否会对下一操作产生影响。 2. 分治法- 分治法就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 举个栗子:
分治法所能解决的问题的特性:
分治法的难度较高,技巧性较高,需要使用者对问题有着透彻的理解,效率也不高。 但是能解决很多复杂的问题。 3. 动态规划在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线.这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策问题。在多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化的过程为动态规划方法 这个算法是极其难以理解的,就算理解,代码也很难敲出来。 而也可以这么理解,动态规划的塑像是与分治法的思想相反的,如果说分治法这种吧一个问题分解成多个简单问题的方法叫做自上而下的方法,那么动态规划就是一种自下而上的解决方法。 而动态规划也不会出现贪婪算法那种当前操作最优而不再以下一操作的情况。 举个栗子:
动态规划解决的问题的特性:
优点是效率高,缺点是太难了~~ 有好多人都不会用,包括某菜鸡博主~~ 4. 回溯法回溯法是一种优化的穷举法。 所谓穷举法就是穷举问题的所有可能性,直到发现解决问题的最佳解为止。当然利用穷举法可以解决很大一部分的实际问题,但由穷举法的实现过程可知它所花费的资源是相当多的。使用穷举法进行彻底的搜索彻底的比较,要以大量的运算为基础,而大量的运算势必要花费大量的时间,有时这种消耗是计算机也承担不起的。所以用穷举法解决问题往往是不实际的。 说白了还是穷举法~~ 举个栗子:
回溯法解决的问题的特性:
缺点:由于是穷举法,所以效率极低 5. 概率算法概率算法允许算法在执行过程中随机地选择下一个计算步骤。在很多情况下,算法在执行过程中面临选择时,随机性选择比最优选择省时,因此概率算法可以在很大程度上降低算法的复杂度。 他也叫,随机算法。 说直白了他就是碰运气,但是总能碰到正确的答案,但是得不到精准的答案。 只有在某些场合才会使得效率增大。 举个栗子:
优点是在某种情况下能使得解决问题的效率大大提高,缺点是不是所有的问题都适用。 结语希望阅读完我这篇文章,能够让你对数据结构与算法打下基础。 我是布小禅,一位初入IT界的萌新,希望多多关照~~ 兴趣是最好的老师,坚持是不变的真理。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 1:36:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |