數據結構(五)和順序表有關的常用概念

什麼是數據結構?

數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。

我們爲了解決問題,需要將數據保存下來,然後根據數據的存儲方式來設計算法實現進行處理,那麼數據的存儲方式不同就會導致需要不同的算法進行處理。我們希望算法解決問題的效率越快越好,於是我們就需要考慮數據究竟如何保存的問題,這就是數據結構。

如:

列表和字典都可以存儲一個班的學生信息,但是想要在列表中獲取一名同學的信息時,就要遍歷這個列表,其時間複雜度爲O(n),而使用字典存儲時,可將學生姓名作爲字典的鍵,學生信息作爲值,進而查詢時不需要遍歷便可快速獲取到學生信息,其時間複雜度爲O(1)。

什麼是線性表?

線性表是某類元素的一個集合,還記錄着元素之間的一種順序關係。線性表是最基本的數據結構之一,在實際程序中應用非常廣泛,它還經常被用作更復雜的數據結構的實現基礎。

根據線性表的實際存儲方式,分爲兩種實現模型:順序表和鏈表(鏈表:1單向鏈表,2雙向鏈表,3單向循環鏈表

什麼是順序表?

將元素順序地存放在一塊連續的存儲區裏,元素間的順序關係由它們的存儲順序自然表示。

順序表與單鏈表的區別?

  • 順序表可以實現下標的快速訪問,單鏈表則不可以,單鏈表必須從頭依次遍歷查找;
  • 順序表在中間或者頭部插入節點時必須依次挪動後面節點的位置,而單鏈表卻不用,單鏈表插入、刪除節點比較方便;
  • 順序表每次增容固定大小的空間有可能會造成空間浪費,但不用每次插入時都動態開闢空間,單鏈表每次插入節點時都必須動態開闢空間、刪除節點時必須釋放掉動態開闢的空間。

元素外置原理?

元素存儲的物理地址(實際內存地址)可以通過存儲區的起始地址Loc (e0)加上邏輯地址(第i個元素)與存儲單元大小(c)的乘積計算而得:Loc(ei) = Loc(e0) + c*i

順序表中各單元位置保存對應元素的地址信息(即鏈接),實際數據元素另行存儲。由於每個鏈接所需的存儲量相同,通過上述公式,可以計算出元素鏈接的存儲位置,而後順着鏈接找到實際存儲的數據元素。注意,圖中的c不再是數據元素的大小,而是存儲一個鏈接地址所需的存儲量,這個量通常很小。

順序表的兩種基本實現方式?

圖a爲一體式結構,存儲表信息的單元與元素存儲區以連續的方式安排在一塊存儲區裏,兩部分數據的整體形成一個完整的順序表對象。

一體式結構整體性強,易於管理。但是由於數據元素存儲區域是表對象的一部分,順序表創建後,元素存儲區就固定了。

圖b爲分離式結構,表對象裏只保存與整個表有關的信息(即容量和元素個數),實際數據元素存放在另一個獨立的元素存儲區裏,通過鏈接與基本表對象關聯。

Python中的list和tuple的底層實現

Python中的list和tuple兩種類型採用了順序表的實現技術,具有順序表的所有性質。

tuple是不可變類型,即不變的順序表,因此不支持改變其內部狀態的任何操作,而其他方面,則與list的性質類似。

Python標準類型list就是一種元素個數可變的線性表,可以加入和刪除元素,並在各種操作中維持已有元素的順序(即保序),而且還具有以下行爲特徵:

  • 基於下標(位置)的高效元素訪問和更新,時間複雜度應該是O(1);
  • 爲滿足該特徵,應該採用順序表技術,表中元素保存在一塊連續的存儲區中。
  • 允許任意加入元素,而且在不斷加入元素的過程中,表對象的標識(函數id得到的值)不變。
  • 能更換元素存儲區,並且爲保證更換存儲區時list對象的標識id不變,採用分離式實現技術。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章