ADT:Abstrack Datatypepython
在python裏面一切都是對象
數據結構
示例:app
l = list() #定義列表 l.append(3) #調用append方法 l.remove(3) #調用remove方法
上面示例中的列表就是一種抽象數據類型,經過組合一些現有的數據跟操做來造成一種新的數據結構。ide
用python的class實現抽象數據類型(ADT)函數
data (數據)
測試
class對象
method(操做方法)utf-8
這裏實現一個bag來作一個示例:rem
data:要用容器去存儲
it
bag
method:add、remove、len、iter
代碼以下:
#-*- condig:utf-8 -*- class Bag(object): def __init__(self, maxsize=10): #初始化,maxsize定義最大容量 self.maxsize = maxsize #屬性,表示最大容量 self._items = list() #容器類型,這裏用列表 def add(self, item): #定義add操做 if len(self) > self.maxsize: #若是當前長度大於最大定義容量 raise Exception ('Bag is Full') #拋出異常 self._items.append(item) #不然添加到列表中 def remove(self, item): #定義刪除操做 self._items.remove(item) def __len__(self): #魔術方法 return len(self._items) #數據列表的長度 def __iter__(self): #實現迭代器 for item in self._items: yield item #測試用例 def test_bag(): bag = Bag() bag.add(1) bag.add(2) bag.add(3) assert len(bag) == 3 bag.remove(3) assert len(bag) == 2 for i in bag: print (i) # # test_bag() #調用測試函數
執行腳本:
# python bag_adt.py
實現一個ADT要注意的幾個問題:
(1)數據成員,好比:items,應該選用什麼樣的數據結構?
(2)選用數據結構,可否知足定義ADT的操做要求?
好比add,remove這些操做可否知足要求;
(3)選用數據結構能支持高效的操做,它的效率如何?
例如上例中容器選用list來做爲他的底層存儲,實際上他的add和remove操做效率,
不如選用set來做爲容器效率更高,上例中的 remove 的操做來刪除中間的一個元素,
它的時間複雜度就是O(n)。
【O(n)能夠簡單理解爲刪除一個元素,須要執行多少個步驟。】