2017-06-20 18 views
0

配列ベースの両端キューを作成する際に、できるだけ効率的になるようにしようとしています。だから、配列はサイズ1から始まり、新しい値を両端キューに押し込むときに配列の大きさが十分でない場合は、 "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メソッドを呼び出すと、私の質問が出ます。私は、2つのポジティブな議論を「成長」させているというエラーを続けていますが、どこで、どのように起きているのか分かりません。誰かがこれを改善する方法に関するアイデアを持っているので、ポジティブな引数が1つしかないでしょうか?また、成長方法で再インデックスするための私の推論は、プッシュフロントメソッドのための私の推論と同様に意味を成していますか?

+0

最初に私が提案したいのは、長さ( 'self .__ capacity = 1')を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 

だからDeque.__grow(self, self.__capacity)になってますself.__grow(self.__capacity)を呼び出すとき。ただし、__growメソッドはselfしか使用できません。

関連する問題