0

我试图在创建基于数组的双端队列时尽可能高效地利用空间。因此,数组从大小 1 开始,如果当我将新值推送到双端队列(在任一端)时数组不够大,我将调用一个名为“grow”的函数。然后我修改以保留双端队列的正面和背面。这是我到目前为止所做的一个示例:

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

当我调用增长方法时,我的问题就来了。我不断收到错误,即我给出了“增长”两个位置参数,但我不知道这是在哪里或如何发生的。如果有人对如何改进这一点有任何想法,以便它只有一个位置论据?另外,我对在增长方法中重新索引的推理以及我对前推方法的推理是否有意义?

4

2 回答 2

0

如果要将参数传递给它,则需要向 __grow 添加一个参数,即:

def __grow(self, size):

目前,它只有一个 self 参数,但是当你调用它时你也在传递 self.__capacity 。但是,我认为您真的打算在没有参数的情况下调用增长:

if self.__size == len(self.__contents):
  self.__grow()
于 2017-06-20T18:07:56.607 回答
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.

于 2017-06-20T18:15:06.287 回答