精华内容
下载资源
问答
  • 前端算法修炼

    2019-02-22 15:18:30
    直进大厂的前端算法描述,
  • JavaScript版数据结构与算法 轻松解决前端算法面试视频教程,完整版15章!从求职角度,在面试前建立自己的算法技术体系。本课程带你用JS语言解决LeetCode上的经典算法题,对每一道题都进行线上测试,每题都有时间/...
  • JavaScript版数据结构与算法 轻松解决前端算法面试视频教程,完整版15章!从求职角度,在面试前建立自己的算法技术体系。本课程带你用JS语言解决LeetCode上的经典算法题,对每一道题都进行线上测试,每题都有时间/...
  • 前端算法 二叉树 class buildingNode { constructor(key, value) { /** * 创建二叉树节点 * 节点具有:指向父节点、左子节点、右节点的指针,自身的data属性(下部代码中的key、value) */ this.parent = null; this...
  • 作者:陈立林 ...来源:知乎 著作权归作者所有。...也有从事前端大数据可视化分析的我简单谈谈我对前端算法的看法。算法在前端的地位。算法简单来说,是一门研究计算机性能和资源分配的学科。 前端或者说J...

    作者:陈立林
    链接: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的语法做了一个插件。

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

    展开全文
  • 基于FPGA的语音识别前端算法研究实现.pdf
  • 主要给大家介绍了关于前端算法之文字避让的相关资料,对于这个知识相信很多的朋友都不知道,但看到效果会惊叹不已,实现这一个效果主要利用的是inMap文字避让功能,文中通过示例代码介绍的非常详细,需要的朋友可以...
  • 前端算法代码收集库 旨在帮助大家提高javascript编码水平,代码规范,面对面试官问最难的算法问题也能从容应对 这是一个常见的js算法面试题收集库,包含测试,欢迎,如果库中没有的算法,欢迎提issue或者PR。 这里先...
  • 前端面试大全、前端常见问题和原理总结、前端面试题、前端面试经验、前端知识持续更新中,包括:JavaScript、Vue、Webpack、TypeScript、html、css、前端架构、前端算法、前端工程搭建、前端职场、React、技术选型、...
  • 前端算法代码收集库

    2019-08-08 08:19:33
    旨在帮助大家提高javascript编码水平,代码规范,面对面试官问最难的算法问题也能从容应对
  • 算法在面试中更是起到锦上添花的作用,也是前端笔试的必考点。 本场 Chat 主要以前端面试中关于 JS 的各种面试题为主要核心,深入浅出的剖析相应面试题涉及到的 JS 相关知识,由一道面试题来展开一个知识面,帮助...

    前端行业正在蓬勃发展, JS 是 Web 前端核心,对前端开发者来说,只有拥有坚实的 JS 基础才有可能在面试中脱颖而出,获得各大厂的 Offer ,直达人生巅峰。

    本场 Chat 主要以前端面试中关于 JS 的各种面试题为核心,深入浅出地剖析相应面试题涉及到的 JS 相关知识,由一道面试题来展开一个知识面,帮助大家对 JS 的知识结构有一个全面认识。主要适合正在找工作的大学生与实习生,给予读者一些关于面试的总结与帮助。

    本场 Chat 您将会学到如下内容:

    1. 了解 JS 知识体系
    2. 巩固 JS 基础知识
    3. ES6 语法的关键点
    4. 一些前端算法知识

    阅读全文: http://gitbook.cn/gitchat/activity/5ca2c2579814fa7a53616c57

    您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

    FtooAtPSkEJwnW-9xkCLqSTRpBKX

    展开全文
  • 前端算法之弹幕设计

    千次阅读 2018-07-27 15:07:10
    大家都说前端写页面较多,几乎用不到算法。本文愿从弹幕设计这个场景来描述算法前端中的应用,我们先来看下实现效果: 图1.1 弹幕效果   开场之前我们先来描述弹幕开发的难度,再集中精力描述算法设计的思路...

    大家都说前端写页面较多,几乎用不到算法。本文愿从弹幕设计这个场景来描述算法在前端中的应用,我们先来看下实现效果:

    图1.1 弹幕效果

     

    开场之前我们先来描述弹幕开发的难度,再集中精力描述算法设计的思路。

    * 如何保证不同字号的弹幕不碰撞
    * 弹幕的位置计算
    * 弹幕的速度控制及动画实现
    * 弹幕与视频的同步

    ***如何保证不同字号的弹幕不碰撞***

    如果弹幕采用相同的字号,碰撞的问题处理起来比较简单,只要考虑相邻弹幕的播放速度和偏移的位置就可以计算出来。然而使用不同字号的弹幕处理起来就麻烦了许多,弹幕的起始位置不可以线性的增加,比如第一行放了字幕,接下来的字幕可以按顺序从上至下依次放置即可。

    ***弹幕的位置计算***

    只有设计好弹幕的初始位置,才可以动态、高效的管理不同字号弹幕的碰撞问题。打个比方,我们通过接口获取了2秒之内的弹幕数据1000条,每个字幕的长度、速度、字号都不同,怎么管理这些弹幕,示意图如下:

    图2.1 弹幕管理示意图

     

    这是第一种情况,按照从上到啊的顺序依次摆放以后会有几个问题:
    1. 弹幕五、六、七该怎么计算位置,按top值循环取模+累加吗?
    2. 当弹幕一或者弹幕三足够长的时候,如何准时的跳过当前位置计算?
    3. 当前屏幕的弹幕播放结束,如何再计算的时候利用空出来的位置
    4. 空出的位置是否满足当前弹幕的高度
    5. ……

    一系列问题就不统统列举出来了,基于这个背景我们结合数学建模的思维方式,找到了弹幕场景相似度非常高的机场运营。我们可以把弹幕当做飞机,每个时间段播放多少弹幕和机场每个时间段放飞多少飞机一个道理。

    首都国际机场一共有3条跑道,两条4E级跑道、一条4F级跑道,2016年的吞吐量为9000万人次。它的运行机制就是所有飞机通过搭台有顺序的共用3条跑道来完成运输任务的。

    同理,我们也设计了几个个角色:一个是轨道(跑道)、一个是调度(塔台)、一个是弹幕(飞机),我们为每个角色设计一个类分为为Track、Main、Bullet。

    * 轨道
                
           轨道这个角色很重要,它可以解决弹幕位置计算、速度控制、碰撞检测问题。
           首先,我们要来初始化轨道。通俗的说我们要修建几个跑道呢,我们不是实物,可以动态调整轨道的                        数量,计算的原则:
            轨道数量 = 播放器有效高度 / 设备基准字号
        * 播放器有效高度:播放器的实际高度减去控制条的高度,因为弹幕不可以遮挡控制条。
        * 设备基准字号:移动端是10px,pc端是12px;
            为啥计算公式是这样的?因为我们要支持不同字号的弹幕。试想不同的字号对物理空间的占用是不同的,然而如果要求轨道的尺寸是动态的,那就带来很复杂的计算。本文提出“虚拟轨道”的概念,在交通管制中最常见的就是道路合并或者改向。我们也是采用将相邻的物理轨道临时合并为一条轨道。这样就可以轻松的解决不同字号的轨道占用问题。原理图如下:
            

    图2.2 轨道计算示意图

    其次我们来回忆下机场的工作流程:
    1. 机长呼叫塔台,CZ6132请求起飞
        * 目前跑道均被占用,请等待
            * N时刻后再次执行步骤1
        * 目前跑道 A1 空闲,准许进入
            * 执行步骤3
    2. 塔台查看跑道使用情况
    3. 进入跑道,起飞完成
    4. 机长通知塔台,本次起飞完成,释放跑道的占用
    5. 其他飞机同样执行上述步骤

    按照这个思路,我们的弹幕工作流程:
        
    1. 弹幕进入播放器
    2. 轨道根据弹幕的播放速度、尺寸计算是否有合适的轨道提供
        * 没有
            * 通知弹幕尚无合适轨道提供,请等待;同时,弹幕队列中的其他弹幕依次执行步骤1
        * 有
            * 执行步骤3
    3. 播放器加载弹幕DOM,开始播放,待播放完成
    4. 播放完成通知轨道更新轨道占用情况
    5. 其他弹幕同样执行上述步骤

    图2.3 轨道可用性计算示意图

     

    关于轨道的基本原理我们整理清楚了,当然还有不少细节比如如何和调度通信、如何和弹幕通信以及虚拟轨道检测算法等。有兴趣的同学可以参考代码吧。https://github.com/bytedance/xgplayer/blob/master/packages/xgplayer/src/control/makeBullet.js

    * 弹幕
           弹幕基本是实现“飞机”的角色,我们要求它具有自身的属性和方法。比如调度中心通过id能拿到它所有的基本信息,轨道控制也可以通过弹幕进行检查和更新。当然弹幕也必须具备状态自动更新、移动、播放结束通知、自动销毁等功能。
    * 调度
            调度就是搭台的化身,承接着轨道、弹幕的控制,也保持着与播放器的步调一致。它的职责如下:
        1. 播放器交互控制
        2. 弹幕队列控制
        3. 自身状态更新
        4. 数据格式转换
        5. 动画执行
            还是直接用流程图来描述更直接些:
            
           

    图2.4 弹幕运行机制流程图

    在弹幕启动之后,首先要检查本地是否已有缓存数据,没有的话直接请求数据并缓存,然后执行数据读取,首次过滤数据进入弹幕队列,同时启动定时器。弹幕队列的数据会定期请求轨道,检测队列里的弹幕是否可以进入,一旦确认后轨道做好登记,弹幕就可以进入播放器开启动画播放了。定时器每隔2秒就会再次更新数据进入到弹幕队列(这块不同的业务可以定制不同的规则)。弹幕播放结束后会通知调度和轨道,调度会在弹幕队列中移除该弹幕实例,轨道也会移除该弹幕实例的轨道占用。

    所有代码实现来自带解析器、能节省流量的[西瓜播放器](https://h5player.bytedance.com/), [Github](https://github.com/bytedance/xgplayer/)


      [1]: /img/bVbd8mH
      [2]: /img/bVbd8nj
      [3]: /img/bVbd8nq
      [4]: /img/bVbd8nz
      [5]: /img/bVbd8nH

    展开全文
  • 前端算法之快排

    千次阅读 2017-03-04 19:56:51
    之前数据结构课学过一些排序算法,如冒泡 希尔 插入等等,可是都忘了,而前端最基本的算法就是快排,这里赶紧复习一下。快排的原理快排的基本原理是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有...

    之前数据结构课学过一些排序算法,如冒泡 希尔 插入等等,可是都忘了,而前端最基本的算法就是快排,这里赶紧复习一下。

    快排的原理

    快排的基本原理是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,再通过此方法去对这两部分进行排序,直到不可再分为止。
    算法步骤(懒得写,百科抄的):
    1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
    3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
    4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
    5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

    快排实现

    反正快排也是前端必会的基本算法,这里用js实现一下。
    由于我们在递归的过程中array空间只有一个(由于传的是引用,差别不大,这里便于理解),采用闭包来编写。

    function quickSort(array){
    
        //array:数组 start:起始下标 end: 结束下标
        function sort(start,end){
    
            var right=end;//右‘指针’
            var left=start;//左‘指针’
            var flag=array[start];//比较标准
    
            //递归终止条件
            if(end-start>0){
                //一趟排序
                while(left<right){
    
                    //从右边开始比较
                    while(left<right){
                        if(array[right]<flag){
                            array[left++]=array[right];
                            break;
                        }else{
                            right--;
                        }
                    }
    
                    //比较左边
                    while(left<right){
                        if(array[left]>flag){
                            array[right--]=array[left];
                        }else{
                            left++;
                        }
                    }
                }
    
                array[left]=flag;
                sort(start,left-1);//左边递归
                sort(left+1,end);//右边递归
            }
        }
    
        sort(0,array.length-1);
    
        return array;
    }
    

    时间复杂度

    快排我的理解就是第一趟定一个点位置,第二趟分两个区域定2个点,第n趟分2^(n-1)个区域定2^(n-1)个点,直到所有点的位置都定好为止。

    最差的情况:正序或逆序的情况,第一次定一个点,第二次还是定一个点,直到最后一次。
    时间复杂度与冒泡一样为n(n+1)/2

    最好的情况,t=n*k 其中1+2+…+2^(k-1)=n 根据等比数列求和公式解得:n~2^k即k~log以2为底n的对数,t=nlogn(以2为底)

    展开全文
  • Cartographer 的前端算法思路

    千次阅读 2018-09-17 13:49:55
    论文内容简单翻译 算法与代码分析 Ceres Scan Matcher Translation &amp; Rotational Cost ...前一篇博客里面提到的是 Cartographer 前端实现中非常小的一个部分的算法思路,参照了《Real time correlative...
  • 前端算法面试题汇总

    千次阅读 2017-09-07 20:25:56
    数组去重function unique(arr) { const seen=new Map(); return arr.filter((a) => !seen.has(a)&& seen.set(a,1)); } //or function unique(arr) { return Array.from(new Set(arr)) ...[...(new Set(ar
  • 【JavaScript】算法练习 项目说明 本项目记录个人平时练习各类型的算法题解题思路及解题源码,希望对各位有所帮助 目录结构 |- src // 资源文件夹 |- |- 二叉树相关算法 |- |- 基础算法题库 |- |- |- 猜数字游戏.js ...
  • 阿里与字节跳动前端算法面试题

    千次阅读 2020-04-05 11:18:35
    1头条:数组扁平滑处理以下是几种解决方案: let arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10 ]; /*方案1:使用 Array.prototype.flat 处理*/ arr = arr.flat(Infinity);...
  • leetcode1两数之和 每天一道算法题,重视积累,量变引发质变 目录
  • 前端对于算法的重视程度还是不足的,但是随着前后端分离的越来越明显,大量的数据渲染过程开始由服务器端开始转向浏览器端。 那么平时我们普通前端所做的工作用到算法的地方大部分还是遍历,事件绑定。也有些低层次...
  • 前端算法之快速排序(JS版)

    千次阅读 2017-08-16 20:08:36
    2.算法实现:<1>.从数列中挑出一个元素,称为 “基准”(pivot); <2>.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该...
  • 阿里前端算法面试题两道

    千次阅读 2017-08-22 14:40:49
    二维数组的全排列组合。 如输入[[1,2],[3,4],[5,6]] 输出: [ 1, 3, 5 ] [ 1, 3, 6 ] [ 1, 4, 5 ] [ 1, 4, 6 ] [ 2, 3, 5 ] [ 2, 3, 6 ] [ 2, 4, 5 ] [ 2, 4, 6 ] 代码实现:function printArr...
  • 算法对于前端工程师来说总有一层神秘色彩,这篇文章通过解读V8源码,带你探索Array.prototype.sort函数下的算法实现。 来,先把你用过的和听说过的排序算法都列出来: 快速排序 冒泡排序 插入排序 归并排序...
  • 作为一名前端,虽然在平常开发中很少编写算法,但当我们需要深入前端框架,开发语言,开源库时,懂算法将大大提高我们看源码的能力。例如: virtual-dom diff算法做了一些约定,后将原先O(n3)的时间复杂度降到了O...
  • 前端算法合集第一辑 目录结构无算法,不前端 前端面试中常见的数据结构与算法汇总写在卷首开发工具算法题目--&amp;amp;amp;gt;两数之和题目描述:示例:我的解答:结果分析执行用时为68ms的范例:解法分析 无...
  • 前端常见算法

    千次阅读 2017-06-06 09:54:12
    前端常见算法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 194,792
精华内容 77,916
关键字:

前端算法