增加数组deque

时间:2017-06-20 18:05:10

标签: python-3.x arraydeque

在创建基于数组的deque时,我试图尽可能高效地利用空间。因此,数组从第一个开始,我将调用一个名为" 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

当我调用grow方法时,我的问题出现了。我一直在接受我正在给予的错误'成长'两个位置论点,但我不知道发生在哪里或如何发生。如果有人对如何改进这个有任何想法,那么它只有一个位置参数?另外,我推测在grow方法中重新索引的理由是否合理以及推送前端方法的推理?

2 个答案:

答案 0 :(得分:0)

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

addEventListener()

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

'load'

答案 1 :(得分: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