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)是⼀種常⻅的基礎資料結構,是⼀種線性表,但是不像順 序表⼀樣連續儲存資料,⽽是在每⼀個節點(資料儲存單元)⾥存放下⼀個 節點的位置資訊(即地址)。
單向連結串列
單向連結串列也叫單鏈表,是連結串列中最簡單的⼀種形式,它的每個節點包含兩個 域,⼀個資訊域(元素域)和⼀個連結域。這個連結指向連結串列中的下⼀個節 點,⽽最後⼀個節點的連結域則指向⼀個空值。
表元素域elem⽤來存放具體的資料。 連結域next⽤來存放下⼀個節點的位置(python中的標識) 變數p指向連結串列的頭節點(⾸節點)的位置,從p出發能找到表中的任意 節點。
節點實現
class SingleNode(object): """單鏈表的結點""" def __init__(self,item): # item存放資料元素 self.item = item # next是下⼀個節點的標識 self.next = None