1. 程式人生 > >python數據結構與算法(6)

python數據結構與算法(6)

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實現采?了如下的策略:

/*  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)