1. 程式人生 > >資料結構(五)和順序表有關的常用概念

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

什麼是資料結構?

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

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

如:

列表和字典都可以儲存一個班的學生資訊,但是想要在列表中獲取一名同學的資訊時,就要遍歷這個列表,其時間複雜度為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不變,採用分離式實現技術。