前端升级打怪路:算法入门

135 阅读5分钟

抽象能力

学习到现在为什么可以理解每一行代码,但是代码和到一起之后就看不懂了?

function t(fn, delay){  //声明t,有两个fn, delay的参数
let fn2 = ()=>{        //声明fn2
if(fn2.timer){return} //如果fn2.timer存在,就return fn()及之后的语句 
fn()                 //执行fn()
fn2.timer = setTimeout(()=>{ //fn2.timer等于'等一会执行的'null
fn2.timer = null    //null赋值与fn2.timer
},delay)  //delay是'等一会执行的时间确定'
}  return fn2 //上面所有代码运行完后,函数t(),return出fn2
}
let f = t(()=>{console.log('火球术')},5000)
  • 问:上面的代码,每一行都可以看懂,为什么合到一起就不行了???
    • 因为缺少抽象能力

抽象能力到底是什么?

不变应万变变

Java.js.Python.PHP这些编程语言真正共有的到底是什么?

  1. 声明
  2. if...while..
  3. while循环,for循环
  4. 函数
  5. 对象
  • 上面这些是所有语言的共有的
  • 这些意味着学习编程首先就是要理解这些语言的不变之处
  • 不变应万变
  • 不必过分深究细节

编程世界中什么东西到底是亘古不变的呢?

1.对编程的由衷热爱

  • 拥有自律的习惯
    • 写博客及时总结
    • 定目标边写边学
  • 简洁之美
    • 用简单的代码实现多种问题
    • 构建自己的编程世界

2. 逻辑

  • 三段论逻辑

     语句1:JS的函数有Function构造的
    语句2:JS中Object.Array.Function是函数
    推论:JS中Object.Array.Function都是由Function构造的 
    
    • 逻辑是要学习的,有时候逻辑是反直觉
      • 代码是可以表示逻辑的
  • if...else..代码表示逻辑

    • 比较两个数大小:如果第1个数大于第2个数,就输出第1个数,否则输出第2个数
    • 伪代码↓
       a = [12,32]
       if a.get[0]>a.get.[1] //a获取的第0个元素与a获取的第一个元素想比较
       print a.get[0]
       else
       print a.get[1]
    
  • for循环表示逻辑

    • 输出N个数中最大的一个数
    • 第一找到第1、2个数字中较大的那一个,存入max
    • 第二找到max和第3个数字中较大的那个,存入max
    • 第三找到max和第n个数比较,存入max
    • max就是最大的数
      • 伪代码↓
     a = [23,12,45,78,25,65] 
     max = a[0]  //从a中拿第0个元素'23'
     for i from 1 to a.length()-1   //数组下标从1开始变至数组的结尾
     //因为前面已经拿了第0个元素了,所以要减1
     //所以要拿1和0元素比较
     if a.get(i)>max then max = a.get(i) // 比较开始然后重复循环
     print max //存入最大的数
    

    流程图如下:↓

    iShot2020-05-2016.28.01

  • 从上图中可以看出代码可以表示逻辑(注意上图中的代码全部都是伪代码)

    • 问:那么表示逻辑需要多少种语句呢?

      • 顺序执行语句

          语句1  //执行1
          语句2  //然后执行2
        
      • 条件判断语句

          if... then ... else ...
           if... else if ... else
      
    • 循环语句

        if... then ... else ...
        if... else if ... else
      
    • 伪代码和流程图

      • 在上面例子中我们用了伪代码表示逻辑
        • 下面我们将用流程图来表示一下逻辑
          iShot2020-05-2014.52.19.jpg
          iShot2020-05-2014.57.02.jpg

          iShot2020-05-2014.59.47.jpg
    • 伪代码:用自己编的语言写出来,不必是真实的语言

    • 使用伪代码和流程图的好处?

      • 锻炼你的大脑
      • 你必须自己画出来不能运行在计算机里
      • 整理你的思路
      • 思路乱,则图乱
      • 伪代码都写不好,则代码更写不好

3. 数据结构

  • 数据结构就是:数据与数据之间的关系(非常抽象)
    • 想要精准的了解数据结构那么必须了解八大算法
如何表示两个数据
  • 如果顺序有意义
    • [x, y]表示第一个是x,第二个是y
    • [y,x]表示第一个是y,第二个是x
    • 比如坐标就是这样的数据
    • 要提供first和last操作
  • 如果顺序无意义
    • (x, y)和(y, x)一样
    • 比如血压值(120, 80)和(80, 120)没区别不需要提供first和last操作
如何表示N个数据
  • 如果顺序有意义
    • 数组表示[a1, a2,... aN]
    • 要提供索引操作get(i)
    • 要提供add/indexOf / delete操作
  • 如果顺序没有意义
    • 集合表示fa1, a2, ...aN]
    • 今天所有的代码都跟JS无关要提供add / delete / has操作
如何表示N对N数据
  • 比如学号
  • 用「哈希表」表示
  • ash={1001->小方,1002->'小红}}
面试题
  • 有一段英文对白,里面只会出现a-zA-Z、标点符号和空格,请告诉我每个字符出现的次数
    • 例如Hi, I'm Frank
    • 输出a出现1次, F出现1次, H出现1次...
  • 答:用哈希表做
    • 伪代码↓
str = `HI,I'm Frank` //声明这个字符串

hash = { }  // 建立一个空对象

for i from 0 to str.length-1  //下标从0至字符长度减1
key = str.get(i)     
value = hash.get(key,0)+1 //因为第一次是空的,所以伪代码规定空加1为1
hash.set(key,value)

for key,value from hash
print `${key}出现了${value}次`

  • 数据结构=数据形式+操作

    • 不同形式的数据暴露不同的操作
  • 数据结构的作用

    • 提前记住一些结构
      • 这些结构很常见
      • 这些结构能让你很快理清思路这些结构面试经常问 、
    • 锻炼你的抽象能力
      • 一种数据结构往往能解决很多类似的问题
      • 如果你选错了数据结构,你根本就想不出思路牛逼的程序员更重视数据结构,而不是算法

总结

  1. 逻辑很重要
  2. 用三种语句表达逻辑
  3. 用图和伪代码表示三种语句
  4. 数据结构一定要经常使用