數據結構-第一階段學習線性表的總結

前言

爲了五月底的學位考,瘋狂複習(學習)。都怪自己網課不認真聽(有部分根本沒聽),少壯不努力,考試徒傷悲。文中涉及到的代碼使用語言爲JavaScript ,數據結構線性表的完成代碼見 傳送門
在這裏插入圖片描述

線性表

線性表包含順序存儲和鏈式存儲兩種存儲方式,如下圖:
在這裏插入圖片描述
區別如下圖:
在這裏插入圖片描述
從時間複雜性來說:
1、當需要進行頻繁的查找檢索操作時,建議使用順序表存儲。因爲順序表可以使用下標很方便的進行查找,而鏈表需要循環遍歷整個鏈表,直至找到目標。
2、當需要進行頻繁的插入刪除操作時,建議使用鏈表存儲。因爲鏈表插入刪除操作只需要改變指針的指向即可,而順序表插入刪除時,目標位置後的其他元素都要進行移動

從空間複雜性來說:
1、當線性表的元素個數變化較大或不確定時,建議使用鏈表。
2、當線性表的元素個數明確時,建議使用順序存儲

總結:
此處關於數組擴容的說法基於C#,原文 傳送門
而JS有其獨特的機制見 傳送門
聯想到實現順序表時,用到了Array,那爲什麼數組在聲明時,既可以聲明大小,又可以不聲明呢,查閱大佬博客之後發現,如果不聲明數組大小的話,Array的默認大小是4,那麼當添加第5個元素時,數組就會自動擴容。Array的自動擴容分以下步驟:

1、分配一個新數組,長度是原來長度加1

2、將原數組的數據copy到新數組中。

3、將新數組地址賦值給舊數組的引用,生成一個新的數組。

這麼看來,Array的自動擴容其實也不簡單,數據量小的時候你可能感覺不到延時,當數組中存儲了1個G的數據的時候,這個時候再擴容,那這個時間上的消耗就大了。所以這就要求我們在聲明Array時儘量爲其定義好大小。
總結之後看起來,順序表和鏈表其實各有優缺點,那麼有沒有一個完美的存儲方式,插入刪除和查詢都很快呢,那就是Hash表,想想還很激動呢,後面就要學到了(其實樹和圖我能不能搞懂我都不知道)。

棧和隊列

棧和隊列屬於特殊的線性表,他們各自限制了插入和刪除點。

如下圖,棧是先入後出的,可以把棧想象成彈夾,裝彈的時候把子彈一個一個從彈夾頂部壓入,子彈擊發的時候從彈夾的頂部擊發,直到彈夾打完。
在這裏插入圖片描述
如下圖,隊列是先進先出的,我們可以把隊列想象成早上去網紅小吃店吃東西,由於人很多要排隊,從店門口開始排,每當有人來就排在後面,不予許插隊情況出現。而且也只能由隊伍開頭依次進店消費,然後前面的人消費完離開,後面的人依次輪流。
在這裏插入圖片描述
循環隊列:
在一個普通隊列裏,一旦一個隊列滿了,我們就不能插入下一個元素,即使在隊列前面仍有空間。但是使用循環隊列,我們能使用這些空間去存儲新的值。
在這裏插入圖片描述
循環隊列是把普通隊列首尾相連,把存儲隊列元素的表從邏輯上看成一個環,成爲循環隊列。
隊列爲空是 front = rear = 0

// 隊頭的計算方式
 this.front= (this.front+ 1) % this.length

// 隊尾的計算方式
 this.rear = (this.rear + 1) % this.length

// 入隊操作
 enQueue(value: any) {
 		  // count指的是當前隊列已入隊數量,length爲隊列總長度
          if (this.count === this.length) {
              throw new Error('The queue is full!');
          }
          this.data[this.rear] = value;
          this.rear = (this.rear + 1) % this.length;
          this.count++;
        }
 // 出隊操作
 deQueue() {
            if (this.count === 0) {
                throw new Error('The queue is empty!');
            }
            this.front = (this.front + 1) % this.length;
            this.count--;
        }

如下圖,隊列長度爲8,隊列已滿,現在出隊一個元素,front指向1。
如果是之前的普通隊列,這時不允許做如入隊操作,隊列內的空間已經滿了(因爲即使0已經移除了,但是已經爲他分配了空間)
但是按照循環隊列的邏輯,入隊操作
this.rear = (this.rear + 1) % this.length
也就是 rear = (7+1)%8 = 0
再做入隊操作就是 this.data[0] = xxx;這時就不會再造成空間浪費
在這裏插入圖片描述
終於整理完了。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章