算法2:算法就是设计

释放双眼,带上耳机,听听看~!

又是小程讲道理的时间,如果根本就不对你的口味请直接离开。讲什么道理呢,就是对算法的理解,算法是什么,有什么用,怎么学习算法。

上一次讲了递归的简单入门,说递归是重要而实用的算法套路。那为什么递归是算法先?

(1)算法是什么?

算法就是设计好的计算流程。

首先,算法是经过设计的,是为了解决某个或某类问题的,是有考虑资源成本的,等等。那些不知道为何而做的,随遇而安的,不是算法。

然后,算法是计算流程。计算是一个抽象概念,形式上可以是数值运算,也可以是调配资源,也可以是攻城夺寨,等等。而流程,就是操作步骤。

再简单一点,突出重点,算法就是经过设计的东西。你要有设计,不是说想到哪做到哪,不是“自然而然”的行动,当然,如果你的直觉充满了设计,你是天生的设计师,那不能否认你的“边做边想”也是算法,只不过你没有提炼出来而已。

另一个问题,算法跟程序是什么关系?

有人曾说过:程序=数据结构+算法,所以要写好程序就要算法好。我并不同意这种说话,我认为程序跟算法没有必然的联系,我认为,程序=变量+流程,很多时候,写好程序只要理解业务跟需求,并且掌握编程工具,就可以做到,并不需要你有设计算法的能力。同样,算法设计好,也不一定能把程序写好,你可能根本就不懂编程工具,还写什么程序。

所以,设计是设计,写程序是写程序,没有必然关系的,你可以专做算法设计而不写代码。只不过,一般像我们这些一线开发,设计跟编程是同一个人,所以才有算法设计跟编程一起来的情况,像那些高级的,他们很可能只扔给你一个算法,由你来编程实现,这时两者就明显分开(设计者有可能不懂编程)。

既然算法就是事先设计,那这个设计有用吗?

(2)算法有没有用?

这个问题很好回答,从大局来说,从行业、技术的发展来说,算法一定是一个关键元素。

那对于个人呢,算法设计是不是有用?

你可能会觉得,只有跟我相关的算法才有用,比如,如果我整天都是写Android平台的activity,那我理解视频的压缩算法又能带来什么帮助呢?如果我的职责就是优化视频首帧的显示速度,那理解压缩算法就可能有帮助了。所以你可能会得出一个结论:只有跟我相关的算法才有用。

我觉得跟你相关的算法能直接帮助到你的,而跟你不相关的算法的理解也一样能帮助到你。正如之前所说,具体的事情本身往往不是关注点,关注点在于做这个事情的过程中强化什么。

所以,没有疑问,算法设计是有用的,退一万步来说,你对设计的思考能让你保持独立思考与坚持苦想的习惯。而且你会发现,现实工作环境中,懂算法的人更能通杀不同的平台(所以工资高呗),毕竟设计套路很多是相通的。

既然算法设计能帮到我们,甚至某些场合是必须的,那应该怎么去学习算法呢?毕竟那么多算法设计!

(3)怎么学习算法?

就像武侠小说中的太祖长拳、罗汉拳一样,算法是套路。你应该学习的是设计套路,至于怎么把多个套路组合,怎么分拆成散打,那是参悟的问题。

学习算法,主要还是学习经典的套路,比如分治思想、贪婪算法、回溯法,等等,而对于专门领域的算法,你可能要学得更加具体(这个过程足够强化你的苦想能力)。

不要学那些“抖机灵的算法”,有些“算法”只是编程技术的巧妙运用,并不是套路。包括很多算法题目,都没有引导大家去学习算法套路,而只是强调编程技巧。编程技巧有可能是重要的,但跟学习算法没有关系,应该摒弃这个干扰。

比如,这样一个题目:

逆转单向链表。

如果从“分治”与“复用”的套路出发,就会把问题简化为“如何把两个结点逆转”,两个结点逆转是容易实现的。当两个结点逆转后,问题再次变成了“如何把两个结点逆转”,只不过是指向往前推进了。

如果“抖机灵”,使用编程技巧,可以先把所有结点的地址保存到数组,然后循环数组,让a[i]->next = a[i-1],留意边界,即可。但是,编程技巧不是算法套路,不应该出现在算法设计上。

另外,专门领域的算法,比如视频压缩、搜索引擎等算法,也是套路,而且是实战性很强的套路。

总的来说,你应该学习经典的算法套路,并且忽略编程技巧类的干扰,毕竟在这里,我们学的是设计,而不是编程。

总结一下,又是讲道理,回答了“算法是什么”、“有没有用”、“怎么学习”这三个问题。算法就是设计,是我们的朋友,要跟经典的算法套路打交道。

人已赞赏
随笔日记

高可用实现KeepAlived原理简介

2020-11-9 4:27:42

随笔日记

基于STM8的IIC协议---STM8第五章

2020-11-9 4:27:44

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索