考虑一个包含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)
答案 0 :(得分:1)
你错过了那里的日志N细节。
此外,OrderedDict似乎与您的需求非常接近。
在我们分配了N个条目之后,分配是O(1),只要N在此之后永远不会增长。但是,对于创建新条目的每个分配,它会分摊O(log N)。 Python每次超出时都会将分配加倍。如果要在不增加N的情况下继续添加和删除,则分配将为O(1)。
addTicker()
可以有条件地del
,然后无条件地执行最后两个陈述,因为它们在任何一种情况下都是相同的。
O(N)注释应为O(N log N),因为排序需要多长时间,并且没有理由相信所有条目已经按排序顺序排列。< / p>