在我的LinkedList中,head_pop()和append()需要同一时间吗?

时间:2017-11-21 00:26:55

标签: python data-structures linked-list

我想测试是否快速删除LinkList的head元素而不是向LinkList的末尾添加元素。

这是我的LinkList的主要代码:

class LNode:
    def __init__(self,elem,next_=None):
        self.elem=elem
        self.next=next_

class LinkList:
    def __init__(self):
        self.__head=None

    #delete head element
    def head_pop(self):
        if self.__head is None:
            raise LinkedListUnderflow("in pop")
        e=self.__head.elem
        self.__head=self.__head.next
        return e

    #add an element at end
    def append(self,elem):
        if self.__head is None:
            self.__head=LNode(elem)
            return
        p=self.__head
        while p.next is not None:
            p=p.next
        p.next=LNode(elem)

import time

#test time
def timetest(f):
    start=time.clock()
    for a in range(0,1000000):
        f
    end=time.clock()
    print("times:"+str(end-start))

然后,我试试这个:

llist=LinkList()

def append():
    llist.append(666)

def head_pop():
    llist.head_pop()

timetest(append())
timetest(head_pop())

输出:

times:0.029582597002445254
times:0.03032071299821837

正如您所看到的,他们花费的时间相同。

但我认为它应该是O(n):O(1)。

1 个答案:

答案 0 :(得分:0)

您正在做的是将append()的结果传递给您的时间测试函数,而您想要传递函数本身!

更改时间测试以调用f功能:

def timetest(f):
    start=time.clock()
    for a in range(0,1000000):
        f() # <- note the () here
    end=time.clock()
    print("times:"+str(end-start))

然后用它来测试:

timetest(append)
timetest(head_pop)

正如你所看到的,我们传入了要调用的函数的函数,而不是函数的结果(被调用一次!)