JS数据结构与算法

28 阅读2分钟

时间复杂度:定性描述程序运行时间,和输入的规模有关

栈:

    先进后出的数据结构,JS没有,但可以用Array实现。java有

    应用场景:十进制转二进制,有效的括号,函数调用堆栈(JS解释器用栈) (理解:后进先出)

    常用操作:push、pop

队列:

    先进先出,JS没有,但可以用Array实现。

    应用场景:JS异步中的任务队列、计算最近请求次数(旧请求出队)

    常用操作:push,shift,

链表:

    多个元素连接,内存不连续;JS没有,但可以用Object模拟。

    vs数组:数组增删非尾部元素需移动,链表只需改指针next

    遍历:let p = a 定义一个指针,指向一个对象(节点),插入,删除,都是改指针

    前端与链表:原型链本质是链表,结点是各种原型对象prototype,通过_proto_属性连接(相当于指针)。A instanceof B本质:B.prototype在A的原型链上;

    前端与链表:使用指针获取JSON节点值(p=p[k],逐层进入)

    常用操作:修改next,遍历

集合:

    无序且唯一的数据结构,Set

    常用操作:去重、判断in、求交集:

new Set([...set1].filer(item=>set2.has(item)))

    方法:add(),has(),delete()

    特点:可迭代对象(for of);keys(),values()是一样的

    转换成数组:[...set];Array.from(set);new Set([])

字典:

    也存储唯一值,但形式是键值对;Map,映射的意思

    方法:增删改查,get(key)得到value;delete(key);clear()清空键值对;set(key,value)新增/修改

    用map做交集:

    arr1.forEach(i=>map.set(i,true) //数字做下标

    arr2.forEach(i=>{if(map.get(i){ans.push(i);map.delete(i);}})

树:

    一种分层数据的抽象,比如DOM,级联选择,树形控件。JS中没有树,用Object和Array构建。

    const tree={val:'a',children:[{val:'b',children:[]},...]}

    常用操作:BFS,DFS,先中后序遍历

    DFS:往下一层级走,递归;BFS:往同层级走,队列

    二叉树的先中后序遍历

    二叉树:树的每个节点最多两个子节点,JS用Object模拟:const binaryTree={val:,left:{},right:{}}递归结构

    先序遍历:根-左-右;中序遍历:左-根-右;后序遍历:左-右-根。就是递归,顺序区别

    非递归版(难一点): 用栈模拟。递归本质就是栈,这个版本不过是演示出来,复杂度不变。先序遍历:因为栈是FILO,如果先到左分支,那么右分支先入栈。中序遍历:根先入栈,然后换右边。注意最左边的叶子:n.right也是空,会直接pop(),也就是根。