所谓的算法都是指排序查找吗?
波波老师,我们学习算法很多都是讲排序算法、查找算法,但是实际应用中像调度算法、推荐算法、图像处理算法等等,这些算法是最终都能转化为排序和查找吗? 或者说学习排序算法 会用在工作中的哪些场景呢?因为很多语言的sdk中已经有标准的排序函数了,而且优化的很好,不需要我们再自己重写个排序函数
正在回答 回答被采纳积分+1
首先,是的,算法不都指排序和查找,但是排序和查找是算法的基础。
另外需要强调一点,查找是远远比排序应用场景广泛得多的算法。大量的算法(或者应用)本质是查找。比如我们上网的过程,就是在查找不同的信息。即使你认为你是在“浏览”,在计算机的算法层面,也是查找。比如当你打开你的微信,看看有没有朋友给你发新的信息,从程序的角度,是程序把朋友发给你的信息从数据库中找到,然后展示在你的面前;想看看你订阅的公众号有没有什么新的文章,是程序从庞大的数据库中先查找到了你订阅了什么公众号,然后再查找这些公众号发表了什么内容(这里也有排序了,因为人们通常关注的事按照时间顺序从新到旧的信息),然后再展示到你的面前,等等。
==========
我非常理解“排序”非常让人“困惑”。因为一方面,直觉上,排序确实是应用范围没那么广的;另外一方面,排序算法比大多数人想象得难。如果排序算法像 1 + 1 = 2 一样简单,其实很多人也不会抱怨。但很多人很快就会发现,排序算法并不好掌握(相较而言,我从来没有听过有人抱怨为什么要学习顺序查找法。),再加上感觉费了半天劲学会了似乎也只是能“排序”而已,非常的 boring,所以很困惑。
这么说吧,学习排序的关键,就是理解“递归”,而不是学习排序算法本身。排序算法提供了一个非常好的递归的应用场景。而理解递归是理解很多算法的核心之一。不夸张的说,至少有 70% 的算法(很可能保守了)是建立在“递归”这个概念的基础上的。理解好递归,将让你理解清楚“树”这个重要的概念,而“树”这个概念,则是“查找”的核心。上面说了那么多查找,都发生在数据库中,而实现数据库的核心数据结构,就是树结构。
为什么排序算法能帮助我们理解递归,可以参考我的这篇公众号文章:https://mp.weixin.qq.com/s/GTBiWAzvvsVrykB7KsRg3g
再比如在我的这个课程中,专门介绍图论算法。图论算法是很多人工智能算法的基础(注意,是人工智能,而非机器学习):https://coding.imooc.com/class/370.html
图论算法能做到的很多事情,已经很有趣了。在我的这个课程中也有介绍,比如自动求解一些“解谜游戏”的解,或者在游戏中,点击一个位置,你控制的角色会自动绕过障碍物走过去,那这个角色具体是怎么找到这个路径的,包括我在这个课程中介绍的自动迷宫生成:https://coding.imooc.com/class/138.html
如果你学到这些算法,就会意识到:
1)都需要你对递归有非常好的理解;
2)其中用到了一些数据结构,是这个课程中介绍的基础,比如树结构,比如并查集;而这些结构,又和递归有着千丝万缕的联系;
==========
另外,你提到,因为很多语言的sdk中已经有标准的排序函数了,而且优化的很好,不需要我们再自己重写个排序函数。这是一个不成立的论点。原因很简单,你说的那些实际应用中的调度算法、推荐算法、图像处理算法,也都又封装好的非常标准的 API,直接调用就好,不需要重新写。而就像我举例说明的那样,无论是排序还是查找,其实都是在大量实际使用的。搜索引擎搜索到的结果,是排序后返回给你的;你浏览的消息,是按照时间排序的;你可以在电商页面按照价格顺序找到最便宜的商品,等等。
但你为什么觉得那些“高级”的算法,是“实际使用”的算法,而查找和排序,不是实际使用的算法呢?大概率是因为,那些“高级”算法,其实是还不成熟的算法,所以你可以看到现代有大量的工程师(而且是高级工程师),工作在这些领域,而排序和查找,已经非常成熟了,所以你看不到有人还工作在这些领域。(其实这也是错误的,比如数据库内核的工程师,本质还是在工作在解决各种场景的查找问题,只不过他们不叫“查找工程师”而已。而数据库内核相关的工作,是近十年计算机领域最蓬勃发展的领域之一。哪怕在这个 AI 时代,存储也是关键的关键。可以参考我的这篇文章:https://mp.weixin.qq.com/s/ooG8-664yXBK8j6uU99Y9g )
这就像你会觉得学习初中数学解一元二次方程有什么用?学习破解密码才更有用。但实际上,学习一元二次方程(和所有的初等数学包括高等数学),都是让你能去真正破解密码的基础。
==========
当然,我完全能理解很多同学对这些“基础”不感兴趣。也正因为如此,我从来不号召大家“死磕”基础。我号召大家再去理解“基础”到底有什么用以后,再去学习基础。这样学习,你的目标更强,学习效率更高。
所以,我强烈建议你,找到你想学习的那个领域,然后直接去学习哪个领域。在深入学习的过程中,你近乎一定会碰到“基础不够”这个问题,届时,搞明白自己到底是什么基础不够,搞明白这些基础到底能做什么以后,再回头补基础也不晚。(尤其对于非学生而言。)
当然,如果你没有碰到基础问题,那就太好了,你跳过了基础,能直接去攻破更前沿,重要的问题。
为此我还写过一篇文章:学算法有什么用?可能真的没用。
https://mp.weixin.qq.com/s/D9Y8KgkgKrH4hPMTw-fD0w
==========
最后,如果觉得这个课程的内容不是你想要的,请迅速联系慕课网做退课处理。
加油!:)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星