基于js的数据结构总结

  • 1.线性表
    线性表:有0个或多个数据元素组成的有序序列。
    性质:除了第一个和最后一个都是有且只有一个前驱和一个后继
    有直接一个前驱和一个直接后继
    数据类型:指的是一组性质相同的集合及定义集合上一些操作的总称

  • 数据类型的分类:
    1.原子类型 不可分解

    2.结构类型 是可以在分解的

  • 抽象数据类型:
    Data:除了第一个和最后一个都是有且只有一个前驱和一个后继,一对一的关系
    opration:
    InitList(l):建立空的线性表
    ListEmpty(l)
    ListInsert(
    l,i,e):在线性L的第i个位置插入元素e
    ListtDelete(*l,i,e):在线性L的第i个位置删除元素e

  • 并集:A+B
    listLength(l);
    GetElement(l,i,e);//l是操作的线性表,i,索引的位置,e存放的数据
    locateElem(l,e);
    listInsert(l,i,e)

  • 线性表的存储结构:
    顺序存储结构:依次按照顺序存储的数形式
    一个元素存储占有n个字节
    位置关系:loc(ai)=loc(a1)+(i-1)*c
    链式存储结构:

  • 2 js数据结构之数组
    1.concat:连接两个或多个数组,并返回结果
    2.foreach:对数组中的每一项运行给定函数,这个方法没有返回值

      <script>
      var arr=[1,2,3]
        arr.forEach(function (x) {
      console.log(x % 2 == 0,'---');
         })
        </script>
    

    3.join:将数组中的元素链接成一个字符串
    4.indexOf:返回数组中每一个元素的索引,没有返回值-1;
    5.lastIndexOf:返回在数组中搜索到的与给定参数相等的元素的索引的最大值
    6.map:对数组中的每一项应用给定函数,返回每次函数调用的结果并返回数组

          <script>
       var isEven=function (x) {
      console.log(x);
      return (x%2==0);
           }
         var arr=[2,5,8,9];
        console.log(arr.map(isEven));//map;返回的结果组成数组
            console.log(arr.filter(isEven));//filter;返回的结果组成新数组
      </script>
    

    7.reverse:翻转数组的顺序
    8.slice:传入索引值,将数组里对应的索引范围内的元素作为新数组
    9.some:对数组中的每一项运行给定函数,如果任一项返回true,则返回true;
    10.every:对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true;
    <script>
    var isEven=function (x) {
    console.log(x);
    return (x%2==0)?true:false;
    }
    var arr=[2,5,8,9];
    console.log(arr.every(isEven));//每一项都是为true
    console.log(arr.some(isEven));//找到返回true的那一项为止

      </script>
    

11.filter:对数组中的每一项运行给定函数,则返回函数为true项组成的数组
12.sort:按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数(当做字符串比较)
13.toString:将数组当做字符串返回
14.valueOf:将数组当做字符串返回
15.reduce:迭代累加

 <script>
  var arr=[3,6,9,10];
  var res=arr.reduce(function (pre,curr,index) {
    return pre+curr;
  })
  console.log(res);

</script>
  • 搜索和排序
    排序的方法:
    1.reverse
    2.sort(function(a,b){return a-b})

  • 搜索的方法:
    indexof()
    lastindexxof() 返回索引

  • 输出数组返回字符串的方法:
    toString
    join
    栈和队列
    栈:先进后出的有序集合(新元素在栈顶,旧元素在栈底)
    栈的方法:
    1.push(element):添加一个或者多个元素到栈顶
    2.pop():移除栈顶的元素,并返回新的元素
    3.peek();返回栈顶的元素(不做任何的修改)
    4.isEmpty():判断栈是否为空,没有为true,否则false
    5.clear():移除栈里的所有元素
    6.size();返回栈的元素个数

    队列:先进先出的序列集合
    1.enqueue(element):向队列尾部添加一个或多个新的项
    2.dequeue():移除队列的第一个元素,并返回该元素
    3.front():返回队列中的第一个元素(不对队列做修改)
    4.isEmpty():判断队列是否包含元素
    5.size():返回队列的元素的个数、
    队列;
    1.优先队列
    2.循环队列

       <script>
           //    栈的方法
          function Stack() {
      var items=[];
      this.push=function (element) {
          items.push(element);
      };
      this.pop=function () {
          items.pop()
      };
      this.peek=function () {
          return items[items.length-1];
      };
      this.isEmpty=function () {
          return items.length==0;
      }
      this.size=function () {
          return items.length;
      }
      this.clear=function () {
          items=[];
      };
      this.print=function () {
          console.log(items.toString());
      }
           }
    </script>
    <script>
     //    队列的创建
      function Queue() {
       var items=[];
    
        }
     </script>
    

5.链表
数组是链表的一种,但是数组的缺点是大小固定,从数组中插入或删除一个元素代价较高
链表的元素在内存中并不是连续的,每一个链表元素都有节点本身和指针组成(链表查找元素要从头开始)

     <script>
       function Linkedlist() {
        var Node=function (element) {//要添加的项
      this.element=element;
      this.next=null;
  }
     var length=0;
       var head=null;
       this.append=function (element) {
//             向列表中添加元素
       var node=new Node(element),
         current;
       if(head==null){
           head=node;//列表最后一个节点的下一个元素为null
       }else{
           current=head;
   //               循环列表知道找到最后一项
           while(current.next){
               current=current.next;
           }
    //               找到最后一项,将其next赋值为node,建立连接
           current.next=node;
       }
       length++;
   };
   this.insert=function (position,element) {};
   this.removeAt=function (position) {
    //           检查是否越界
       if()
   };
   this.move=function (element) {};
   this.indexOf=function (element) {};
   this.isEmpty=function (element) {
    this.size=function () {};
    this.toString=function () {};
    this.print=function () {}
   }
}
     </script>
  • 散列表:
    • hashTable类
      散列算法的作用就是尽可能快的在数据结构中找到一个值
      散列函数的作用是给定一个值,然后返回在表中的地址

         <script>
       function HashTable() {
         var table=[];
          this.put=function (key,value) {//添加新的项
      
           };
             this.remove=function (key) {//从键值中移除值
      
            };
            this.get=function (key) {//返回键值检索到的特定值
      
           }
         }
      </script>
      
  • 树(非顺序结构)
    位于树顶部的节点叫做根节点
    节点分为内部节点和外部节点

节点有深度,节点的深度取决于祖先节点的数量
树的高度取决于所有节点深度的最大值

二叉树和二叉搜索树
二叉树的节点最多只有两个子节点,一个是左侧子节点,另一有右侧子节点

二叉搜索树:
左侧存储的节点比父节点小的值
右侧存储比父节点大或者相等的值

边:表示的是节点之间的关系
在双向链表中,每个节点有两个指针,一个指向下一个节点,一个指向上一个节点
同样在树中,每个节点也有两个指针,一个指向左侧子节点,一个指向右侧子节点
树中的方法:
insert(key):向树中插入新的键
search(key):在树中查找一个键,如果存在则返回true,否则返回false
inOrderTraverse():通过中序遍历的方式遍历所有的节点
PreOrderTraverse():通过先序遍历的方式遍历所有的节点
postOrderTraverse():通过后序的方式遍历所有的节点。
min():返回树中最小的键
max();返回树中最大的键
remove(key):从树中删除某个键

  <script>
        function BinarySearchTree() {
    var Node=function (key) {//表示树的每一个节点
        this.key=key;
        this.left=null;
        this.right=null;

    };
    //        var root=null;
    var insertNode=function (node,newNode) {//实现插入节点的位置
        if(newNode.key<node.key){
            if(node.left==null){
                node.left=newNode;
            }else{
                insertNode(node.left,newNode);
            }
        }else{
            if(node.right==null){
                node.right=newNode;
            }else{
                insertNode(node.right,newNode);
            }
        }
    };
    var inOrderTraverseNode=function (node,callback) {
        if(node!==null){
            inOrderTraverseNode(node.left,callback);
            callback(node.key);
            inOrderTraverseNode(node.right,callback);//中序遍历从大到小的顺序排列的
        }
    };
    var preOrderTraverseNode=function (node,callback) {
        if(node!==null){
            callback(node.key);
            preOrderTraverseNode(node.left,callback);
            preOrderTraverseNode(node.right,callback);//优先于后代排列的方式
        }
    };
    var postOrderTraverseNode=function (node,callback) {
        if(node!==null){
            callback(node.key);
            postOrderTraverseNode(node.left,callback);
            postOrderTraverseNode(node.right,callback);
            callback(node.key);
        }
    };
      this.insert=function (key) {
          var newNode=new Node(key);//创建节点
          if(root==null){//判断是否特殊情况的第一个节点
              root=newNode;
          }else{
              insertNode(root,newNode);//把节点加入非根节点的位置
          }
      }
      this.inOrderTraverse=function (callback) {
          inOrderTraverseNode(root,callback);
      };
    this.preOrderTraverse=function (callback) {
        preOrderTraverseNode(root,callback);
    }
    this.postOrderTraverse=function (callback) {
        postOrderTraverseNode(root,callback);
    }
}
   </script>
  • 树的遍历:指的是树中的每一个节点都进行某种操作
    访问树的节点的三种方法:中序,先序和后续
    中序遍历是上行的遍历方式:也就是从小到大的遍历所有节点
    先序遍历是父节点优先于后代节点的方式,也就是从根节点开始
    后序遍历是后代节点优先于父节点的方式,从子节点开始访问的
    在树中:有三种经常执行的搜索类型
    最大值
    最小值
    搜索特定值

  • 非线性数据结构--图。
    图是网络结构的抽象模型。图是有边链接的节点(主要表示的是二元关系的)
    有一条边链接的顶点叫做相邻顶点
    一个顶点的度是相邻顶点的数量
    如果图中不存在环,怎称该图是无环的,如果图中每两个顶点之间存在路径,则该图是连通的

有向图和无向图
强连通:如果图中的每个顶点都是双向连通的
1用邻接矩阵表示常见的图(arr[i][j]==1相邻 arr[i][j]==0不相邻)
2.使用邻接表表示图
3.使用关联矩阵表示图(边数比顶点多的情况)
图的遍历:可以寻找特定顶点或者寻找两个顶点之间的路径(思想:必须每个第一次访问的顶点)
1.广度优先(BFS) (队列)(先宽后深访问形式)
2.深度优先 (DFS) (栈) (先深度后广度的形式)
两种方法的不同点在于带访问顶点的数据结构不同

  • 排序和搜索算法

    排序算法:

        <script>
         function ArrayList() {
      var array=[];
      this.insert=function (item) {
          array.push(item);
      };
      this.toString=function () {
          return array.join();
      }
    
      }
    
    
    
    </script>
    <script>
     //    1.冒泡排序
      function bubbleSort(array) {
      for(var i=0;i<array.length;i++){
          for(var j=0;j<array.length-i-1;j++){
              if(array[j]>array[j+1]){
                  var temp=array[j];
                     array[j]=array[j+1];
                     array[j+1]=temp;
              }
          }
      }
      return array;
     }
     var array=[1,4,9,6,3],
      res=bubbleSort(array);
     console.log(res);
     //    选择排序(思想:是找到最小的元素放在第一位置,接着找第二小的数,以此类推)
     function selectionSort(array) {
         var indexMin;
         for(var i=0;i<array.length;i++){
             indexMin=i;
             for(var j=i;j<array.length;j++){
              if(array[indexMin]>array[j]){
                  indexMin=j;
              }
          }
          if(i!==indexMin){
              var temp=array[i];
              array[i]=array[indexMin];
              array[indexMin]=temp;
          }
      }
      return array;
    }
    
     console.log(selectionSort(array));
    
     //    插入排序:是每次排一个数组项
    function insertSort(array) {
    var j,temp;
    for(var i=0;i<array.length;i++){
        j=i;
        temp=array[i];
        while(j>0&&array[j-1]>temp){
            array[j]=array[j-1];
            j--;
        }
        array[j]=temp;
    }
    return array;
        }
    
     console.log(insertSort(array));
    
    
    </script>
    
    • 归并排序:思想:将原始数组切分成较小的数组,知道每一小数组只有一个位置,接着将小数组
      归并为一个大数组,知道最后只有一个排序完毕的大数组

       <script>
      var mergeSortRec=function (array) {
        if(array.length==1){
        return array;
      }
       var mid=Math.floor(array.length/2),
       left=array.slice(0,mid),
       right=array.slice(mid,array.length);
        return (mergeSortRec(left),mergeSortRec(right))
        };
      var merge=function (left,right) {
        var res=[],i_1=0;
        var i_r=0;
        while (i_1<left.length&&i_r<right.length){
      
        }
       }
        function mergeSort(array) {
        mergeSortRec(array);
       }
      var array=[1,5,0,4,9,3];
      var res=mergeSort(array);
      console.log(res);
      </script>
      

      顺序搜索

                <script>
            function sequentSearch(item,array) {
               for(var i=0;i<array.length;i++){
                 if(item==array[i]){
                   return i;
                 }
               }
            return -1;
         }
         </script>
         </body>
         </html>
      
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,601评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,367评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,249评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,539评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,967评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,929评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,098评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,825评论 0 207
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,609评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,796评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,282评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,603评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,277评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,159评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,959评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,079评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,874评论 2 277

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,628评论 2 17
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,574评论 0 6
  • 原创转载请注明出处有误请指出 一、前言 叶金荣老师分享了一篇文章如下:https://mp.weixin.qq.c...
    重庆八怪阅读 823评论 0 5
  • #快乐妈妈时间管理#打卡第18天 临近清明节,爸妈要回老家扫墓,怕我忙不过来,说把小元元一起带走,我想我总的适应自...
    格格猫_真阅读 150评论 0 0
  • “微笑,因为你笑能让其他人也快乐,关键是微笑要是真正的笑。” “享受生活,生命可能短暂也可能漫长,无论如何都要确保...
    旅顺小Lang阅读 252评论 0 0