算法设计与分析绪论(我们为什么要学算法,算法为什么这么卷)[第一人称]

Posted 卖寂寞的小男孩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法设计与分析绪论(我们为什么要学算法,算法为什么这么卷)[第一人称]相关的知识,希望对你有一定的参考价值。

零.前言

这学期我们开设了算法设计与分析这堂课,出于对这位大佬(是我们哈工大深圳的博士生导师)博导的喜爱和对算法的兴趣,我打算写一系列的博文来记录我的一个学习过程,博主在重要的部分录了音,将十分详细地还原授课内容,力求将大佬的思想和方法讲透彻,提升自己的同时,也将这些内容分享给大家。

本篇文章是为绪论,即简单介绍了一下算法,上学期看了《大话数据结构》这本书,很喜欢里面的讲课方式,下面我也将和老师身份互换,以第一人称上这堂课。

目录

1.自我介绍

2.教材

3.什么是算法

4.计算与算法的定义

1.计算

2.算法

5.关于算法

1.算法的来源

2.最早的算法--欧几里得求最大公因子算法

6.伪代码

7.什么是问题

8.为什么要学算法

9.数据的重要性

10.本课目标

11.总结

11.算法设计者的问题


1.自我介绍

同学们好!欢迎来学习我的算法课,我的办公室在信息楼,你有事情可以来找我,虽然我经常不在办公室,所以大家有什么事情可以在qq群里反馈,也可以反映给你们的助教,不过我更希望你给我发邮件,其实我们技术人员用邮件最多,就像明星总是聚集在微博中一样。

下面我们来上课,《算法设计与分析》是非常非常重要的一门课,我们先说一说我们哈深计算机的大部分出路,一条是出国,一条是读研成为这一领域的研究人员,还有一条是进大厂,对吧。我想你们相当大的一部分会选择进大厂,做“新时代的农民工“(开个玩笑)对不对,我们说进大厂一般有三个岗位对不对,哪三个岗位大家可以说一下吗?

算法岗,测试岗,开发岗对不对,那么一般情况下大家会觉得算法好一点,薪资来说一般是算法高于开发,高于测试,所以经常有同学问我,我是去大厂的开发岗,还是去小厂的测试岗,我也不好说。所以一般情况下我们会认为去大厂的算法岗好一点,所以为了实现这个目标,我们一定要把我们这门课好好学习。

2.教材

我们这门课有教材,这个教材呢,大家都应该有所耳闻,就是这本算法导论。

 我从16年开始上这门课,一直用的是这本书,这本书有没有同学看完了?我向大家汇报一下,实话实说,我还没看完,所以这学期我不建议大家从头到尾全都看完,毕竟时间有限,你们还只是本科生,我们要学什么看什么。这本书已经在一定程度上很完备了,但是写作风格不太适合你们,外国人写的这本书比较全,比较深奥,理解起来会比较吃力,如果你只想考个七八十分,每天来上课就足够了,如果你想考的更高的话,就要多多思考,大学的自学能力也很重要,暂时将这本书当成字典来用。所以要跟着老师的思路走,把老师的讲义搞懂,是真的要看懂,不是把里面每一个字看懂,而是把背后的意思看懂,有可能的话去做一些课后题,对你能力的提升有很大的帮助。

也要多刷题,到leetcode上刷,从简单题到中等题到难题,现在内卷如此严重,我以前很少要求大家去刷题,但刷题其实真的是一个提升自己的过程,在刷题中要注入自己的思考。

3.什么是算法

什么是算法?算法是计算机领域的皇冠,或者说是皇冠上的明珠。我认为计算机领域最重要的两门课之一,另一门就是数据结构。在数学和计算机科学之中,算法/算则法(Algorithm)为一个计算的具体步骤,常用于计算、数据处理和自动推理。

举几个算法的例子,不知道大家以前是否参加过一个数学竞赛叫“祖冲之杯”,里面就有这种算法的题目,比如刘辉割圆术,在圆中放多边形,多边形的边数n越大,这个多边形面积就越接近这个圆的面积,不过很遗憾,当时还没有提出极限这一概念,所以总是差一点点。

比如加减乘数四则运算也是一种算法,还有上学期学的,也经常用到的最小生成树。

算法有什么用,在一些公司中,一个好的算法可以节省大量的人力物力,尤其是需要处理庞大的数据时,一个好的算法可以甚至可以帮公司省下上亿的资产,其实我们的生活的方方面面都被算法给深入地浸入了。我们看抖音,抖音的视频是不是一打开软件就是你想看的,比如你经常看小姐姐,那么它给你推的·是不是就都是小姐姐的视频了,当你在地铁上把手机拿出来,打开抖音。。。。或者当你想在京东上买一双皮鞋,你甚至会发现不只是在京东,在qq看点,在百度上都有向你推荐皮鞋的广告,我们发现我们的生活甚至被算法给操纵了,看的啥推的啥。你的抖音和我的抖音都不一样,每个人都被对自己独特的算法分析着,影响着。

4.计算与算法的定义

1.计算

可由一个给定计算模型机械地执行的规则或计算步骤序列称为该计算模型的一个计算。

计算模型可以是图灵机,也可以是其他计算模型,一个计算机是一个计算(计算模型是计算机),计算可能有用不停止--不是算法。

2.算法

算法是一个满足以下步骤的计算:

有穷性:有限步内必须停止。

确定性:每一步都是严格定义的操作。

能行性:每一个动作都能被精确地机械执行。

输入:有一个满足给定条件的输入。

输出:满足给定约定条件的结果。

5.关于算法

1.算法的来源

中文名字“算法”来源于周髀算经(公元前一世纪)。

英文名字“Algorithm”来自于9世纪波斯数学家花拉子米(al-Khwarizmi)。后面在说某个国家数学很厉害,但我没听清(捂脸)。

2.最早的算法--欧几里得求最大公因子算法

定理:两个数的最大公约数等于两个数中较小的那个数和这两个数相除余数的最大公约数。

定理是需要证明的,但公理不需要证明,感兴趣的同学自己证明一下。

     

    int euclid(int m, int n){

          int r;

            do{

               r = m % n;

     m = n;

     n = r;

            }while(r!=0);

            return m;

         }

这段代码就是这个算法的基本操作,你们都学过了高级语言程序设计和数据结构,别跟我说看不懂这段代码的内容。

 我们知道世界上的大学有两种体系,是德国的鸿宝体系(有点没听清楚,百度没查到。。)和美国的费曼体系,鸿宝体系是什么呢,鸿宝体系就是德国在19世纪中叶建立起来的大学体系,就是严格按照教学,老师讲,学生记,学生学,就是这种教学体系。另一种体系是美国教育学家费曼他提出来办大学其实很简单,只要找到足够的钱,只要把全国最优秀的年轻人聚集到一起,放在同一间教室,给他们最好的条件,让他们能找到他们想找到的任何知识,然后互相交流,甚至都不需要老师来讲,从而实现世界上最好的大学。你们的分数也都很高,但是你们不要指望老师把什么都交给你,我们这里没有学渣,至少高三的时候都是学霸,要把自己当成精英,老师讲的都是白米饭,如果想吃到大鱼大肉一定要自己多学,好好利用这里的条件,可以自己搞一个算法小组啊,一起讨论研究一下,多刷刷leetcode你们一定会受益匪浅的。如果这段代码看不懂你就不配在我们工大读书,你的高考成绩一定是有水分的,忘记的同学要好好复习C语言相关的内容。

6.伪代码

讲到这里我要问一下大家,有没有学过伪代码吗?我默认你们都学过而且都会写,我这里有一个伪代码的教程,回头发给大家,不会的一定要看。(想要的可以私聊博主啊!)

7.什么是问题

设Input和Output是两个集合。一个问题是一个关系RÍInput´Output,Input称为问题R的输入集合,Input的每个元素称为R的一个输入,Output称为问题R的输出或结果集合,Output的每个元素称为R的一个结果。

注意:问题定义了输入和输出的关系,

排序问题定义如下:

输入集合Input={<a1,…,an>|ai是整数}

输出集合Output={<b1,…,bn>|bi是整数, b1£….£bn}

问题SORT={(<a1,…,an>,<b1,…,bn>)|<a1,…,an>ÎInput, <b1,…, bn>ÎOutput,{a1, …, an}={b1, …, bn}}

问题就是输入和输出的关系,把问题数字化了。

好比一个导航系统,输入是什么?这些大厦,食堂,街道之类的,输出是什么?就是一个最优路径,这也涉及到数学中图论的内容,算法和数学是分不开的,学好算法的同时,还要学好数学的内容。

8.为什么要学算法

同学们,你们为什么要学算法?为了进大厂?好,同学们你们为什么学计算机?,我们学校招1000多个人,有五百个是计算机专业,一半。我们先休息几分钟回来再说。

好,为什么要学习计算机?为了就业,所以现在计算机为什么这么火,是就业造成的,你们怎么学的计算机?现在编程在初高中其实还并不普遍,你们大多数人都不会特别了解计算机,多半是老师推荐,家长推荐,学长推荐,所以你们选对了吗?选对了,如今很多的甚至有化学专业的报研究生的都报了计算机,学电子的,学机械的,学航天的报了计算机。

20年前,或者15年前,你们知道哪个专业是最火的吗,是通讯。计算机不行,计算机当时只能写一些网页,当时中国有四家企业,叫“巨、大、中、华”,分别是巨龙通信,大唐电信,中兴通讯,华为这四家公司,巨龙已经没了,大唐是消失边缘,中兴也没有以前的辉煌了,现在干的最好的就是华为。当时的通讯公司,诺基亚,爱立信,摩托罗拉,现在是不是基本要消失了,所以这就是行业的发展。我们的同学一般都想进华为,腾讯,还有一些最近很火的游戏行业,工资基本都是很高的,现在都不是特别想进通讯行业了,我们的基本薪资在各行业中也算是高的。

1.算法是计算机解决问题的基础,毫无疑问计算机是为了解决我们日常生活中的基本问题的。

2.算法是有用的,这是废话

3.算法是有趣的。

不知道你们记不记得打败围棋界各大高手的阿尔法go,你们很小的时候也有一个机器人“深蓝”,记不记得下国际象棋是冠军,基本都是碾压式的打败,基本已经不可能有人类战胜计算机了,几几年的事情,就那个时候人们都知道算法这个东西了,打败了我们人类的棋类冠军。还有那个机器人跑酷,会翻跟头,有一家公司经常会发机器人的各种运动的视频,这些都基于什么,是不是算法呀,所以我们说算法是不是太牛了,以后机器人一定会代替人类所有的体力劳动。你们可能现在玩的吃鸡呀,王者荣耀什么的,之前看新闻已经有人工智能击败人类的了,我不太懂怎么玩啊,我已经好多年没有玩游戏了,因为我发现了有比游戏更好玩的东西。

大家看现在的自动驾驶,华为在搞,百度在搞,特斯拉在搞,以后可能会解放双手代替汽车的,如果人人有一辆事故率和堵车率一定会降低的,还有一段视频,那个(英美达?没听清)的老板,一段演讲的视频,是完全虚拟生成的,他根本就没做这段报告,虚拟出来的,非常真实,这样的话你们什么都可以被虚拟出来,非常可怕。我现在有一个学生在做什么呢,在做基于音乐的舞蹈,就给一段音乐,就输出来一段人跳的舞蹈,非常真实,看不出破绽。我有一个师弟在创业公司做一个(唉,没听清)拿着几千万的工资。

所以你看人类在棋类已经被打败了吧,随着机器人对人类各种劳动的模拟替代,这个潘多拉魔盒就打开了吧,现在在游戏领域人类也被打败了。大公司都在拼了命的搞算法,腾讯,阿里,招那些搞算法的年轻人们,华为有个天才少年,给两百万。那么一下子薪资标准往上猛涨,别说大厂,现在稍微像一点样子的公司都在花费巨额资金招揽那些算法天才们,所以你看全部都是计算机,你看现在家长群里也是,问我我的孩子能不能报哈工大计算机,如果可以报我就上,不能报我就去别的学校了,计算机对社会的发展非常重要,而且比较容易有成就感,你学的多了你会发现计算机这个行业非常非常有趣,不要只局限于赚钱上。其实博主的感觉也是一样,那些真正搞科研搞到一定程度的人,源动力一定不是钱了,否则不会有那么高的成就。

博主有一个华5的研究生学长,是学化学的,我当时问他毕业年薪大概多少,他说10万左右,我当时想会不会有点少,要知道华5最差的专业有的也比我们哈深最好的计算机专业分高,可能是我们薪资的三分之一或者二分之一,但我想不一定有趣,这也许就是好多硕士跨考计算机的原因吧。

9.数据的重要性

当我们能够获得的数据越来越多,算法就越来越重要,学好算法可以帮助你们找到喜欢的工作,毫无疑问,我认为人工智能能够这么火,就是大数据与高算例,以及基于大数据与高算例的深度网络算法的发展,造成了这么火的计算机算法领域,同学们知道人工智能的三要素吗?算法,数据,算例,我们要学习的只有三分之一哦,你们认为三要素里最重要的是什么呢,我个人认为是数据,你有好的数据,哪怕算法一般,也很有可能让这个数据算的很好,我打一个比方,数据就好比是一个食材,算法就好比是一个厨师,你厨师做的菜再好,食材不行,仍然无法做出高水平的食物,巧妇难为无米之炊。所以说数据是非常重要的,大家知道一家公司,到美国去上市,按照美国的规定,一些数据要交到美国审查,但是我们中国的规定不允许,属于泄密。所以数据十非常重要的,像我们和一些有数据的公司或者医院合作,我们研究出一些算法,要写论文,但是写论文可以,第一作者必须是人家而不是我们,为什么呢?研究是我们做的呀,但数据是人家出的,只要用到人家的数据,我们就不能是第一作者,不做的话,有的是人需要这份数据来做。所以现在有很多地方的公司倒闭了,但他最值钱的东西就是他们的数据,所以现在也有大量的专门做数据的公司,有的一份数据就要好多钱,按秒收费的也有,当实验需要大量数据的时候,开销可想而知。所以也有很多人从事这种处理数据的工作,然后卖给一些需要这些数据的大厂。所以现在有一句话叫“人工智能人工做”,所以现在数据真的非常吃香。

另一个就是CPU,我当年读博士的时候一台笔记本就可以把所有数据都做了,但是现在我给我博士生上课用的那台电脑,花了我40万,我们还有老师花了300万买这个,有些大厂要花几千万,你们的笔记本都跑不了大数据,你们做实验一定要有大厂的支持或者学校的支持,你们的电脑只能处理一些很小的数据,真正能跑起来的都在机房里,你说你们一年6000多块的学费,这些钱还不值CPU的电费呢,我们学校的机房温度很高的,光膀子都不觉得冷,说话一定要喊出来才互相听得见,你们有条件有机会的话一定要珍惜,你们进大厂的话一定要知道算法只占三分之一,而且还不是排在第一位的三分之一。大家一定要清楚地认识。

10.本课目标

1.培养算法分析与设计的能力,这意味着我们要掌握常见的算法并拥有设计优秀算法的能力,创新精神就是用来应用的。

2.理解算法后面隐藏的历史,你会发现新的问题,你了解的算法和课本上不一样怎么办,了解他们创建的思想,思想很重要。

3.具有良好的算法思维,并要熟练应用。语言是会过时的,但是数据结构和算法永远不会过时。

4.有时间看看算法导论的书,多刷刷leetcode题。

11.总结

首先说明这个总结是博主写的,感觉这样写文章还是很累的,有些口语我只能把它们转化成书面语,说出来能听懂,但写出来我自己都有点懵。打算“卖血”买一个好的录音笔,再去听下一节课程(发抖)。

写这个专栏的目的呢是因为我很喜欢这个老师的课,也很喜欢算法这一很有成就感的技术型搬砖方向,在提升自己的同时也分享给大家。我还是要声明一下,这篇文章的内容如果大家感觉有哪些不对的地方(比如我没听清楚的地方都用蓝色笔写了)欢迎私信我,由于文体比较特殊,是我站在老师视角写的,所以还是希望大家不要太过纠结于抠字眼(狗头保命),把握文章主要想表达的大体方向,如果你非要认为我们老师哪里说得不对的话。。。。那就是我录音录的有问题,或者听录音听的有问题。

还有最后一个所有算法设计者经常要考虑的问题:

11.算法设计者的问题

这里我用一张图来表示全部内容,hiahiahia

 希望你的的回答是

以上是关于算法设计与分析绪论(我们为什么要学算法,算法为什么这么卷)[第一人称]的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研数据结构)第一章绪论-第二节1:算法的基本概念算法的特性及设计要求

数据结构-绪论

数据结构与算法笔记 - 绪论

数据结构与算法分析绪论

算法设计与分析「通关指南」

0-绪论