1. 程式人生 > >python資料結構與演算法(6)

python資料結構與演算法(6)

Python中的順序表
Python中的list和tuple兩種型別採⽤了順序表的實現技術,具有前⾯討論的順 序表的所有性質。
tuple是不可變型別,即不變的順序表,因此不⽀持改變其內部狀態的任何操 作,⽽其他⽅⾯,則與list的性質類似。
list的基本實現技術
Python標準型別list就是⼀種元素個數可變的線性表,可以加⼊和刪除元素, 並在各種操作中維持已有元素的順序(即保序),⽽且還具有以下⾏為特 徵:
基於下標(位置)的⾼效元素訪問和更新,時間複雜度應該是O(1);
為滿⾜該特徵,應該採⽤順序表技術,表中元素儲存在⼀塊連續的儲存 區中。
允許任意加⼊元素,⽽且在不斷加⼊元素的過程中,表物件的標識(函 數id得到的值)不變。
為滿⾜該特徵,就必須能更換元素儲存區,並且為保證更換儲存區時list 物件的標識id不變,只能採⽤分離式實現技術。
在Python的官⽅實現中,list就是⼀種採⽤分離式技術實現的動態順序表。這 就是為什麼⽤list.append(x) (或 list.insert(len(list), x),即尾部插⼊)⽐在指 定位置插⼊元素效率⾼的原因。
在Python的官⽅實現中,list實現採⽤瞭如下的策略:

/*  This    over-allocates  proportional    to  the list    size,   mak ing room                    *   for additional  growth.     The over-allocation is  mild,   b ut    is                  *   enough  to  give    linear-time amortized   behavior    over    a   l ong                   *   sequence    of  appends()   in  the presence    of  a   poorly-perf orming                  *   system  realloc().                  *   The growth  pattern is:     0,  4,  8,  16, 25, 35, 46, 58, 7 2,    88, ...                 */              new_allocated   =   (newsize    >>    3)  +   (newsize    <    9   ?   3   :   6);[/size][/font]
[font=微軟雅黑][size=3]             /*  check   for integer overflow    */              if  (new_allocated  >    PY_SIZE_MAX -   newsize)    {                               PyErr_NoMemory();                               return  -1;             }   else    {                               new_allocated   +=  newsize;                }

連結串列
為什麼需要連結串列
順序表的構建需要預先知道資料⼤⼩來申請連續的儲存空間,⽽在進⾏擴充 時⼜需要進⾏資料的搬遷,所以使⽤起來並不是很靈活。
連結串列結構可以充分利⽤計算機記憶體空間,實現靈活的記憶體動態管理。
連結串列的定義
連結串列(Linked list)是⼀種常⻅的基礎資料結構,是⼀種線性表,但是不像順 序表⼀樣連續儲存資料,⽽是在每⼀個節點(資料儲存單元)⾥存放下⼀個 節點的位置資訊(即地址)。

python資料結構與演算法(6)
單向連結串列
單向連結串列也叫單鏈表,是連結串列中最簡單的⼀種形式,它的每個節點包含兩個 域,⼀個資訊域(元素域)和⼀個連結域。這個連結指向連結串列中的下⼀個節 點,⽽最後⼀個節點的連結域則指向⼀個空值。
python資料結構與演算法(6)

表元素域elem⽤來存放具體的資料。 連結域next⽤來存放下⼀個節點的位置(python中的標識) 變數p指向連結串列的頭節點(⾸節點)的位置,從p出發能找到表中的任意 節點。
節點實現

class   SingleNode(object):             """單鏈表的結點"""                def __init__(self,item):                                #   item存放資料元素                              self.item   =   item                                #   next是下⼀個節點的標識                               self.next   =   None