python數據結構與算法(6)
阿新 • • 發佈:2018-11-28
water 種類 出發 orm 改變 eal realloc -o text 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實現采?了如下的策略: 節點實現
Python中的list和tuple兩種類型采?了順序表的實現技術,具有前?討論的順 序表的所有性質。
tuple是不可變類型,即不變的順序表,因此不?持改變其內部狀態的任何操 作,?其他??,則與list的性質類似。
list的基本實現技術
Python標準類型list就是?種元素個數可變的線性表,可以加?和刪除元素, 並在各種操作中維持已有元素的順序(即保序),?且還具有以下?為特 征:
基於下標(位置)的?效元素訪問和更新,時間復雜度應該是O(1);
為滿?該特征,應該采?順序表技術,表中元素保存在?塊連續的存儲 區中。
允許任意加?元素,?且在不斷加?元素的過程中,表對象的標識(函 數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
python數據結構與算法(6)