如何在常量时间内比较列表中的两个元素

时间:2011-02-17 23:13:30

标签: performance list language-agnostic comparison

假设我有一个像[5, 3, 1, 2, 4]这样的元素列表,我想按位置比较两个元素。无论哪个列表中的第一个都是更大的,或true。所以:

compare(5, 3) # true
compare(2, 1) # false
compare(3, 4) # true

我怎样才能在不变的时间内完成这项工作?我想到这样做的一种方法是使用地图,其中键是元素,值是列表中的位置:

order = {5: 0, 3: 1, 1: 2, 2: 3, 4: 4}

然后我们分摊了O(1)时间,但这将是O(N)空间。有没有人有更优雅的解决方案?

2 个答案:

答案 0 :(得分:1)

你的地图想法看起来很不错。映射为内存的O(N)这一事实应该不是问题,因为除非使用压缩技术(列表也是O(N)),否则不能小于O(N)。

此外,由于地图存储了每个元素的索引,您可能会忘记原始列表,只需使用地图即可。也就是说,除非您出于某种原因需要列表。即使您需要在中间插入一个元素(例如在位置3),您也可以通过迭代元素并递增必要的索引来以线性时间更新地图。

因此,地图看起来与基本操作列表一样有效,并且增加了O(1)比较功能的强大功能。至于优雅,地图很难被击败,因为它不需要超出此处描述的任何额外工作。

答案 1 :(得分:0)

如果您必须从列表开始并且您只进行了几次操作,请使用:

def compare(ls, n1, n2):
    return ls.index(n1) > ls.index(n2)

如果您可以预先选择表示,或者您需要使用相同的列表多次执行此操作,请执行您对字典所做的操作。

还要记住该列表使用O(N)空间,因此添加字典的O(N)空间没什么大不了的。

更正:上面的比较函数需要O(1)时间,因为python中的访问需要O(1)时间,请参阅http://wiki.python.org/moin/TimeComplexity