Performance 如何在固定时间内比较列表中的两个元素

Performance 如何在固定时间内比较列表中的两个元素,performance,list,language-agnostic,comparison,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)空间。有人有更优雅的解决方案吗?你的地图

假设我有一个元素列表,如
[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)空间。有人有更优雅的解决方案吗?

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

此外,由于映射存储每个元素的索引,因此您可以忽略原始列表,而只使用映射。也就是说,除非你出于某种原因需要这个列表。即使需要在中间插入一个元素(比如位置3),也可以通过迭代元素并增加必要的索引,在线性时间内更新贴图


因此,map看起来和基本操作列表一样高效,并添加了O(1)compare函数。至于优雅,地图很难被击败,因为除了这里描述的内容之外,它不需要任何额外的工作。

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

def compare(ls, n1, n2):
    return ls.index(n1) > ls.index(n2)
如果您可以事先选择表示法,或者如果您需要在同一列表中多次选择表示法,请按照使用词典所做的操作进行

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


更正:上面的compare函数需要O(1)个时间,因为python中的访问需要O(1)个时间,请参见

您能概述基本的业务问题吗?