基于js的數(shù)據(jù)結(jié)構(gòu)總結(jié)

  • 1.線性表
    線性表:有0個或多個數(shù)據(jù)元素組成的有序序列麸折。
    性質(zhì):除了第一個和最后一個都是有且只有一個前驅(qū)和一個后繼
    有直接一個前驅(qū)和一個直接后繼
    數(shù)據(jù)類型:指的是一組性質(zhì)相同的集合及定義集合上一些操作的總稱

  • 數(shù)據(jù)類型的分類:
    1.原子類型 不可分解

    2.結(jié)構(gòu)類型 是可以在分解的

  • 抽象數(shù)據(jù)類型:
    Data:除了第一個和最后一個都是有且只有一個前驅(qū)和一個后繼,一對一的關(guān)系
    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存放的數(shù)據(jù)
    locateElem(l,e);
    listInsert(l,i,e)

  • 線性表的存儲結(jié)構(gòu):
    順序存儲結(jié)構(gòu):依次按照順序存儲的數(shù)形式
    一個元素存儲占有n個字節(jié)
    位置關(guān)系:loc(ai)=loc(a1)+(i-1)*c
    鏈?zhǔn)酱鎯Y(jié)構(gòu):

  • 2 js數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組
    1.concat:連接兩個或多個數(shù)組矮湘,并返回結(jié)果
    2.foreach:對數(shù)組中的每一項運行給定函數(shù)褐着,這個方法沒有返回值

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

    3.join:將數(shù)組中的元素鏈接成一個字符串
    4.indexOf:返回數(shù)組中每一個元素的索引逃顶,沒有返回值-1脾歧;
    5.lastIndexOf:返回在數(shù)組中搜索到的與給定參數(shù)相等的元素的索引的最大值
    6.map:對數(shù)組中的每一項應(yīng)用給定函數(shù)甲捏,返回每次函數(shù)調(diào)用的結(jié)果并返回數(shù)組

          <script>
       var isEven=function (x) {
      console.log(x);
      return (x%2==0);
           }
         var arr=[2,5,8,9];
        console.log(arr.map(isEven));//map;返回的結(jié)果組成數(shù)組
            console.log(arr.filter(isEven));//filter鞭执;返回的結(jié)果組成新數(shù)組
      </script>
    

    7.reverse:翻轉(zhuǎn)數(shù)組的順序
    8.slice:傳入索引值司顿,將數(shù)組里對應(yīng)的索引范圍內(nèi)的元素作為新數(shù)組
    9.some:對數(shù)組中的每一項運行給定函數(shù),如果任一項返回true兄纺,則返回true;
    10.every:對數(shù)組中的每一項運行給定函數(shù)大溜,如果該函數(shù)對每一項都返回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:對數(shù)組中的每一項運行給定函數(shù),則返回函數(shù)為true項組成的數(shù)組
12.sort:按照字母順序?qū)?shù)組排序估脆,支持傳入指定排序方法的函數(shù)作為參數(shù)(當(dāng)做字符串比較)
13.toString:將數(shù)組當(dāng)做字符串返回
14.valueOf:將數(shù)組當(dāng)做字符串返回
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() 返回索引

  • 輸出數(shù)組返回字符串的方法:
    toString
    join
    棧和隊列
    棧:先進(jìn)后出的有序集合(新元素在棧頂钦奋,舊元素在棧底)
    棧的方法:
    1.push(element):添加一個或者多個元素到棧頂
    2.pop():移除棧頂?shù)脑兀⒎祷匦碌脑?br> 3.peek();返回棧頂?shù)脑兀ú蛔鋈魏蔚男薷模?br> 4.isEmpty():判斷棧是否為空付材,沒有為true,否則false
    5.clear():移除棧里的所有元素
    6.size()朦拖;返回棧的元素個數(shù)

    隊列:先進(jìn)先出的序列集合
    1.enqueue(element):向隊列尾部添加一個或多個新的項
    2.dequeue():移除隊列的第一個元素,并返回該元素
    3.front():返回隊列中的第一個元素(不對隊列做修改)
    4.isEmpty():判斷隊列是否包含元素
    5.size():返回隊列的元素的個數(shù)厌衔、
    隊列;
    1.優(yōu)先隊列
    2.循環(huán)隊列

       <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>
     //    隊列的創(chuàng)建
      function Queue() {
       var items=[];
    
        }
     </script>
    

5.鏈表
數(shù)組是鏈表的一種璧帝,但是數(shù)組的缺點是大小固定,從數(shù)組中插入或刪除一個元素代價較高
鏈表的元素在內(nèi)存中并不是連續(xù)的富寿,每一個鏈表元素都有節(jié)點本身和指針組成(鏈表查找元素要從頭開始)

     <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;//列表最后一個節(jié)點的下一個元素為null
       }else{
           current=head;
   //               循環(huán)列表知道找到最后一項
           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類
      散列算法的作用就是盡可能快的在數(shù)據(jù)結(jié)構(gòu)中找到一個值
      散列函數(shù)的作用是給定一個值,然后返回在表中的地址

         <script>
       function HashTable() {
         var table=[];
          this.put=function (key,value) {//添加新的項
      
           };
             this.remove=function (key) {//從鍵值中移除值
      
            };
            this.get=function (key) {//返回鍵值檢索到的特定值
      
           }
         }
      </script>
      
  • 樹(非順序結(jié)構(gòu))
    位于樹頂部的節(jié)點叫做根節(jié)點
    節(jié)點分為內(nèi)部節(jié)點和外部節(jié)點

節(jié)點有深度页徐,節(jié)點的深度取決于祖先節(jié)點的數(shù)量
樹的高度取決于所有節(jié)點深度的最大值

二叉樹和二叉搜索樹
二叉樹的節(jié)點最多只有兩個子節(jié)點理疙,一個是左側(cè)子節(jié)點,另一有右側(cè)子節(jié)點

二叉搜索樹:
左側(cè)存儲的節(jié)點比父節(jié)點小的值
右側(cè)存儲比父節(jié)點大或者相等的值

邊:表示的是節(jié)點之間的關(guān)系
在雙向鏈表中泞坦,每個節(jié)點有兩個指針窖贤,一個指向下一個節(jié)點,一個指向上一個節(jié)點
同樣在樹中贰锁,每個節(jié)點也有兩個指針赃梧,一個指向左側(cè)子節(jié)點,一個指向右側(cè)子節(jié)點
樹中的方法:
insert(key):向樹中插入新的鍵
search(key):在樹中查找一個鍵豌熄,如果存在則返回true,否則返回false
inOrderTraverse():通過中序遍歷的方式遍歷所有的節(jié)點
PreOrderTraverse():通過先序遍歷的方式遍歷所有的節(jié)點
postOrderTraverse():通過后序的方式遍歷所有的節(jié)點授嘀。
min():返回樹中最小的鍵
max();返回樹中最大的鍵
remove(key):從樹中刪除某個鍵

  <script>
        function BinarySearchTree() {
    var Node=function (key) {//表示樹的每一個節(jié)點
        this.key=key;
        this.left=null;
        this.right=null;

    };
    //        var root=null;
    var insertNode=function (node,newNode) {//實現(xiàn)插入節(jié)點的位置
        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);//優(yōu)先于后代排列的方式
        }
    };
    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);//創(chuàng)建節(jié)點
          if(root==null){//判斷是否特殊情況的第一個節(jié)點
              root=newNode;
          }else{
              insertNode(root,newNode);//把節(jié)點加入非根節(jié)點的位置
          }
      }
      this.inOrderTraverse=function (callback) {
          inOrderTraverseNode(root,callback);
      };
    this.preOrderTraverse=function (callback) {
        preOrderTraverseNode(root,callback);
    }
    this.postOrderTraverse=function (callback) {
        postOrderTraverseNode(root,callback);
    }
}
   </script>
  • 樹的遍歷:指的是樹中的每一個節(jié)點都進(jìn)行某種操作
    訪問樹的節(jié)點的三種方法:中序锣险,先序和后續(xù)
    中序遍歷是上行的遍歷方式:也就是從小到大的遍歷所有節(jié)點
    先序遍歷是父節(jié)點優(yōu)先于后代節(jié)點的方式蹄皱,也就是從根節(jié)點開始
    后序遍歷是后代節(jié)點優(yōu)先于父節(jié)點的方式,從子節(jié)點開始訪問的
    在樹中:有三種經(jīng)常執(zhí)行的搜索類型
    最大值
    最小值
    搜索特定值

  • 非線性數(shù)據(jù)結(jié)構(gòu)--圖芯肤。
    圖是網(wǎng)絡(luò)結(jié)構(gòu)的抽象模型巷折。圖是有邊鏈接的節(jié)點(主要表示的是二元關(guān)系的)
    有一條邊鏈接的頂點叫做相鄰頂點
    一個頂點的度是相鄰頂點的數(shù)量
    如果圖中不存在環(huán),怎稱該圖是無環(huán)的崖咨,如果圖中每兩個頂點之間存在路徑锻拘,則該圖是連通的

有向圖和無向圖
強連通:如果圖中的每個頂點都是雙向連通的
1用鄰接矩陣表示常見的圖(arr[i][j]==1相鄰 arr[i][j]==0不相鄰)
2.使用鄰接表表示圖
3.使用關(guān)聯(lián)矩陣表示圖(邊數(shù)比頂點多的情況)
圖的遍歷:可以尋找特定頂點或者尋找兩個頂點之間的路徑(思想:必須每個第一次訪問的頂點)
1.廣度優(yōu)先(BFS) (隊列)(先寬后深訪問形式)
2.深度優(yōu)先 (DFS) (棧) (先深度后廣度的形式)
兩種方法的不同點在于帶訪問頂點的數(shù)據(jù)結(jié)構(gòu)不同

  • 排序和搜索算法

    排序算法:

        <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);
     //    選擇排序(思想:是找到最小的元素放在第一位置,接著找第二小的數(shù)击蹲,以此類推)
     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));
    
     //    插入排序:是每次排一個數(shù)組項
    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>
    
    • 歸并排序:思想:將原始數(shù)組切分成較小的數(shù)組署拟,知道每一小數(shù)組只有一個位置,接著將小數(shù)組
      歸并為一個大數(shù)組歌豺,知道最后只有一個排序完畢的大數(shù)組

       <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>
      
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末推穷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子类咧,更是在濱河造成了極大的恐慌馒铃,老刑警劉巖谴咸,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骗露,居然都是意外死亡岭佳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門萧锉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珊随,“玉大人,你說我怎么就攤上這事柿隙∫抖矗” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵禀崖,是天一觀的道長衩辟。 經(jīng)常有香客問我,道長波附,這世上最難降的妖魔是什么艺晴? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮掸屡,結(jié)果婚禮上封寞,老公的妹妹穿的比我還像新娘。我一直安慰自己仅财,他們只是感情好狈究,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盏求,像睡著了一般抖锥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碎罚,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天磅废,我揣著相機與錄音,去河邊找鬼魂莫。 笑死还蹲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耙考。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼潭兽,長吁一口氣:“原來是場噩夢啊……” “哼倦始!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起山卦,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤鞋邑,失蹤者是張志新(化名)和其女友劉穎诵次,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枚碗,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡逾一,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肮雨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遵堵。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怨规,靈堂內(nèi)的尸體忽然破棺而出陌宿,到底是詐尸還是另有隱情,我是刑警寧澤波丰,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布壳坪,位于F島的核電站,受9級特大地震影響掰烟,放射性物質(zhì)發(fā)生泄漏爽蝴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一纫骑、第九天 我趴在偏房一處隱蔽的房頂上張望霜瘪。 院中可真熱鬧,春花似錦惧磺、人聲如沸颖对。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缤底。三九已至,卻和暖如春番捂,著一層夾襖步出監(jiān)牢的瞬間个唧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工设预, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留徙歼,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓鳖枕,卻偏偏與公主長得像魄梯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宾符,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品酿秸,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式魏烫。簡單...
    舟漁行舟閱讀 7,781評論 2 17
  • 第一章: JS簡介 從當(dāng)初簡單的語言辣苏,變成了現(xiàn)在能夠處理復(fù)雜計算和交互肝箱,擁有閉包、匿名函數(shù)稀蟋, 甚至元編程等...
    LaBaby_閱讀 1,679評論 0 6
  • 原創(chuàng)轉(zhuǎn)載請注明出處有誤請指出 一煌张、前言 葉金榮老師分享了一篇文章如下:https://mp.weixin.qq.c...
    重慶八怪閱讀 865評論 0 5
  • #快樂媽媽時間管理#打卡第18天 臨近清明節(jié),爸媽要回老家掃墓退客,怕我忙不過來骏融,說把小元元一起帶走,我想我總的適應(yīng)自...
    格格貓_真閱讀 168評論 0 0
  • “微笑井辜,因為你笑能讓其他人也快樂绎谦,關(guān)鍵是微笑要是真正的笑≈嘟牛” “享受生活窃肠,生命可能短暫也可能漫長,無論如何都要確保...
    旅順小Lang閱讀 278評論 0 0