在Python

时间:2017-09-25 15:03:59

标签: python algorithm dictionary

考虑一个包含4个字符串的大型列表。

例如:[' P0BH',' LF3J',' MA1Y',' STSM',' 8Y74&#39 ;,' JWBD']

我想以下面的精确方式添加一个新字符串:

如果新字符串已存在于给定列表中,请从列表中删除旧值,并将新字符串添加到列表前面。例如,如果字符串' MA1Y'添加,然后输出列表将如下所示: [' MA1Y',' P0BH',' LF3J',' STSM',' 8Y74',' JWBD&#39]。如果列表中不存在新字符串,则只需将新字符串添加到前面。例如,如果字符串' FSH7'添加,然后输出列表将如下所示:[' FSH7',' P0BH',' LF3J',' MA1Y',& #39; STSM',' 8Y74',' JWBD']。

另外还有一个警告:算法必须以恒定的时间复杂度运行。我并不关心空间复杂性。

当然,我已经实施了一个解决方案,如下所示。我认为它的运行时间复杂,但我希望我们改进它或重新设计更好的东西。我的理解是地图有不断的时间删除,成员资格测试和分配。 **

我的tickerMap类中的addTicker方法是否以恒定时间运行?

class tickersMap:
    def __init__(self, tickersList):
        self.Map = {t:i for i, t in enumerate(tickersList)}
        self.firstIndex = 0

    def addTicker(self, newTicker):
        if newTicker in self.Map:
            print('exists')
            del self.Map[newTicker]
            self.Map[newTicker] = self.firstIndex - 1
            self.firstIndex -= 1
        else:
            self.Map[newTicker] = self.firstIndex - 1
            self.firstIndex -= 1

    def listTickers(self):
        # This is O(nlog(n)) but is only required for printing 
        return sorted(self.Map, key=self.Map.get)

1 个答案:

答案 0 :(得分:1)

你错过了那里的日志N细节。

此外,OrderedDict似乎与您的需求非常接近。

在我们分配了N个条目之后,分配是O(1),只要N在此之后永远不会增长。但是,对于创建新条目的每个分配,它会分摊O(log N)。 Python每次超出时都会将分配加倍。如果要在不增加N的情况下继续添加和删除,则分配将为O(1)。

addTicker()可以有条件地del,然后无条件地执行最后两个陈述,因为它们在任何一种情况下都是相同的。

O(N)注释应为O(N log N),因为排序需要多长时间,并且没有理由相信所有条目已经按排序顺序排列。< / p>