【算法】浅谈前端算法

作者:陈立林
链接:https://zhuanlan.zhihu.com/p/29974629
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

计算机领域,算法问题是不可忽视的。前端圈圈内圈外一直都有人调侃前端的算法问题。也有从事前端大数据可视化分析的我简单谈谈我对前端算法的看法。算法在前端的地位。算法简单来说,是一门研究计算机性能和资源分配的学科。

前端或者说JS在算计方面表现得并不优秀,在讲为什么要学习它之前,我想先说说在前端领域什么比算法效率更加重要。比如:

1.安全。web安全在前端已经占有一定比重,尤其是支付领域等。我们最最常见的就是登陆验证码。

2.用户体验。我们做出来的东西是最直接和用户接触的,面向用户的东西必须用户体验优先。算法和用户体验也有关联,但通过算法在前端大幅度提高性能导致提高用户体验,是非常少的。

3.模块化和可拓展性。前端需要改代码的情况往往是比较多的,谁都不希望我要修改添加代码的时候会产生连锁反应,我明明要改的只是一个功能一个函数,却不得不因此改十几个函数,这多悲催。

4.语义化和可维护性。代码的可读性也非常重要,程序员很大一部分的时间都是在查修bug,要是随手写一坨自己回过头都看不懂代码,那多尴尬。

5.略

为什么要学习算法前端的代码运行环境本来就不善于处理大量的数据计算,前端也有很多东西比算法重要。那我们为什么要学习算法?为了实现功能。大多数情况下,前端并不在乎你写的程序有多快,更加在乎你能不能实现功能。学了算法,能让你实现一些你以前实现不了的功能。

在前端进行大量的数据计算是不合理的,but,判断一个算法,一个产品,乃至一个程序员的优劣通常不是在最优情况,而是最差的情况。在一些不得已的时候,尤其是大数据可视化领域,我们不得不在前端处理大量数据,除了在心中默默吐槽这种架构,该实现的功能还是要实现,该优化的性能还是要优化。

明确学习和使用算法的目的。

一个排序功能,用冒泡排序法,归并排序法,快速排序法?who tm care。一个原生sort函数直接搞定。这就是实用场景,快速实现你的功能即可。

那需不需要学习各种排序算法呢?需要,因为各种排序算法用了很多不用的手段,知识去实现同一个功能,学习里面的知识和优劣对比方法是很有用。

算法其实算是一种简称,其实应该叫做算法设计,不是说你能够默写几个书上的算法代码就叫会算法了,而是能够利用里面的知识点去解决一些书本没有的具体问题实现具体功能,我们学习的是这种能力,而不是死记硬背的知识。

还有就是学习算法有利于面试,有利于工作交流,有利于抓住跨领域的进阶机会。

算法入门难吗

某种意义上讲,中国人都会一定的算法。举个例子,公差为1的,首项为1的等差数列,输入正整数n,计算首项到第N项的和。

方法1:
var sum = 0;
for (var i = 1; i <= n; i++) {
sum = sum + i;
}
方法二:var sum = (1 + n)n/2;

小学生都会等差数列的简便计算在我看来就是一种算法。

方法一是输入n是多少就要积累算多少次,那么方法一的复杂度就是n。

方法二无论如何都是一步到位,那么方法一的复杂度就是1。

n的输入是不可预期的,当n无限大时,小霸王电脑用方法二计算都比你用一个超算中心使用方法二计算来得快。

看到这里,理解上面,恭喜你,算法摸到门槛了。哈哈。

对于一些转行,非科班出生或者算法不好的同学,根本没必要对算法感到恐惧。多数情况下,前端领域用到的算法,我感觉并不会比理科高考数学题难,甚至很多场景不如文科高考数学题。

当然,计算机在算法还有更有魅力的东西,你深入学习就会知道。

如何学习算法?排序是算法的基础。

所以…你以为我马上会推荐你去学排序吗?NO!在前端你觉得你算法差可能是因为你不熟悉javascript,更准确的说是ECMAscript的API。

首先,去了解一下常用的JavaScript Array和Object,能够灵活运用足以解决初和中级常见的算法问题。

第二步就是当你觉得一些原生api不够用的时候就去用用lodash和underscore插件。

第三步就是研究lodash或者underscore的源码,假如你这的能够做到第一步说的灵活运用,那这一步也不会有什么困难。

第四步写自己的数据处理插件,如无实际需要可以跳过这步,我就因为我经常要计算一个复杂数组对象的复杂聚合运算(如过滤过后分组,计算最大,最小,平均,和等等),于是就在前端模拟SQL的语法做了一个插件。

第五步才是学习算法,建议学《算法导论》,贴个链接,网易公开课,麻省理工的公开课,中文字幕。我也在看,需要大学高数知识。基本的排序应该要懂的。其他我也没有往深里面专研,主要想知道里面有什么知识点,将来遇到解决不了的算法问题起码有个研究思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值