前端数据结构与算法总复习

1.常见的数据结构

     栈,队列,链表

     集合,字典

     树,堆,图

2.常见的算法

     链表:遍历链表,删除链表节点

     树,图:深度/广度优先遍历

     数组:冒泡,选择,归并,插入,快速排序,顺序/二分搜索

3.数据结构之栈

     特点:先进后出

     有效括号

var isValid=function(s){
   let length=s.length;
   if(length%1===1) return false;
   let stack=[];
   let myMap=new Map();
   myMap.set("(",")");
   myMap.set('{','}');
   myMap.set('[',']');
   for(let i=0;i<n;i++){
    let n=s[i];
    if(myMap.has(n)){
      stack.push(n);}
    else{
      let t=stack[stack.length-1];
      if(myMap.get(t)===n){stack.pop();}
      else{
       return false}
}
}
  return stack.length===0
}

4.数据结构之队列

特点:先进后出 

5.数据结构之链表

1.数组VS链表

数组在增删非首尾元素时,常常需要移动元素

而链表在增删非首尾元素时,不需要移动元素,仅仅只需要更改next指向即可

在js当中并没有链表这种数据结构,可以使用对象来模拟链表

2.反转链表

var reverseList=function(head){
  let curr=head;
  let pre=null;
  while(curr){
  let next=curr.next;
  curr.next=pre;
  pre=curr;
  curr=next;
}
  return pre
}

6.数据结构之集合

集合

1.集合是一种无序且唯一的数据结构

2.在ES6当中提供了集合这种数据结构,用Set来表示

3.集合的常用操作:去重,判断某元素是否在集合中,求交集

7.数据结构之字典

1.与集合类似,字典也是一种存储唯一值的数据结构,但是它是以键值对的形式来存储的。

2.Es6中有字典,名为Map

3.字典的常用操作时键值对的增删改查

const m=New Map();
//增
m.set("a","aa");
m.set("b","bb");
//删
m.delete('a');
//改
m.set('a','aaaaa');
//查
m.get('a');

两数之和

var twoSum=function(nums,target){
   let length=nums.length;
   let myMap=new Map();
   for(let i=1;i<length;i++){
      let n1=nums[i];
      let n2=target-n1;
      if(myMap.has(n2)){
         return [myMap.get(n2),i]
     }
       else{
               myMap.set(n1,i);
     }  
   }
}

8.数据结构之树

1.树是一种分层数据的抽象模型

2.js当中没有树这种数据结构,可以用对象来进行模拟

树的常用操作包括:深度,广度优先遍历,先中后序遍历

//深度优先遍历
const dfs=function(root){
   console.log(root.val);
   root.childern.forEach((child)=>{ dfs(child);});
}
//广度优先遍历
const bfs=function(root){
   let  q=[root];
   while(q.length>0){
   let n=q.shift();
   console.log(n.val);
   n.children.forEach((child)=>{
       q.push(child);});
}
  
}
//二叉树的前中后序遍历

//前序遍历
1.递归写法
const preOrder=function(tree){
   if(!tree){ return }
   console.log(tree.val);
   preOrder(tree.left);
   preOrder(tree.right);
}
2.非递归写法
const preOrder=function(tree){
   if(!tree){return }
   let stack=[tree];
   while(stack.length){
    let n=stack.pop();
    if(n.right){stack.push(n.right);
    if(n.left){stack.push(n.left)}}

}
//中序遍历(递归)
 const inOrder=function(tree){
    if(!tree){return }
    inOrder(tree.left);
    console.log(tree.val);
    inOrder(tree.right);
}
//后序遍历
const  postOrder=function(tree){
    if(!tree){ return }
    postOrder(tree.left);
    postOrder(tree.right);
    console.log(tree.val);
}
//二叉树层序遍历
const  levelOrder=function(tree){
    if(!tree){ return }
    let q=[tree,0];
    let res=[];
    while(q.length){
      let [n,l]=q.shift();
      if(!res[l]){res.push([n.val]);}
      else{res[l].push(n.val);}
    if(n.left){q.push([n.left,l+1]);}
    if(n.right){q.push([n.right,l+1]);} 
}
     return res
}

9.数据结构之图

概念

图是一种网络结构的抽象模型,是一组由边连接的节点

图可以表示任何二元关系,比如道路,航班

JS当中没有图,但是可以用object和Array来构建图

10.数据结构之堆

概念

堆是一种特殊的完全二叉树,所有节点都大于等于(最大堆)它的子节点或者小于等于(最小堆)它的子节点

11.排序和搜素算法

1、冒泡排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值