2017-06-20 73 views
0

我試圖在創建基於數組的雙端隊列時儘可能高效地使用空間。所以,數組從第一個開始,如果數組不夠大時,我會調用一個名爲「grow」的函數,當我向deque(兩端)推送新值時。然後,我修改以保留雙層車的前部和後部。這裏是我迄今爲止所做的一個樣本:增加數組雙向隊列的大小

def __init__(self): 
# capacity starts at 1; we will grow on demand. 
    self.__capacity = 1 
    self.__contents = [None] * self.__capacity 
    self.__front = 1 
    self.__back = 1 
    self.__size = 1 

def __grow(self): 
    old_list = self.__contents 
    walk = self.__front 
    for k in range(self.__capacity): 
    self.__contents[k] = old_list[walk] 
    walk = (1 + walk) % len(old_list) 
    self.__front = 0 
    self.__capacity = self.__capacity * 2 

def push_front(self, val): 
    if self.__size == len(self.__contents): 
    self.__grow(self.__capacity) 
    self.__front = (self.__front - 1) % len(self.__contents) 
    self.__contents[self.__front] = val 
    self.__size += 1 

當我調用grow方法時,我的問題就出現了。我不斷收到我給出的'增長'兩個位置參數的錯誤,但我不知道發生了什麼或發生了什麼。如果有人對如何改善這個問題有任何想法,以便它只有一個立場論點?另外,我的推理是否適合在增長方法中重新編制索引,以及推理方法的推理是否合理?

+0

我想建議的第一件事是,不要以一個開始長度('self .__ capacity = 1')! –

回答

0

您需要添加一個參數__grow如果你要傳遞參數給它,即:

def __grow(self, size): 

目前,它只有一個自我的說法,但你也傳遞自._​​_容量時你叫它。不過,我覺得你真的打算叫成長過程中沒有參數:

if self.__size == len(self.__contents): 
    self.__grow() 
0

在類的所有實例方法治療調用實例作爲他們的第一個參數,除非你使用類調用的方法在這種情況下,你必須提供作爲第一個參數的實例。

class A: 
    def __init__(self): 
     pass 

    def f(self, x): 
     print(self, x) 

a = A() 
a.f(1) # <A object at 0x7fa9a067da90> 1 
A.f(a, 2) # <A object at 0x7fa9a067da90> 2 

所以,當你調用self.__grow(self.__capacity),這被變成Deque.__grow(self, self.__capacity)。但您的__grow方法只需要self