【发布时间】:2016-05-07 09:14:28
【问题描述】:
我有一个算法遇到以下情况;我想知道是否有可能进行一些改进(我认为不可能,但我可能错了)。
我有一个L 的对象列表。我有两个不同的(且独立的)键用于对它们进行排序:mykey1 和 mykey2。实际上,我可以在算法开始时以两种方式对列表进行排序,而无需花费大量成本;因此,我有两个列表:
A = sorted(L, key=mykey1)
B = sorted(L, key=mykey2)
(Python 语法,但我认为任何人都可以理解)。只要复杂度保持在 O(n log n) 以下,我就可以在这个阶段完美地做更多的事情(初始化新变量)。
我需要提取A的许多个子列表;出于显而易见的原因,我想在算法的主循环中使用索引(开始和结束),而不是实际复制子列表。
现在,对于A 的任意子列表(由两个索引已知),是否有一些棘手的方法可以根据B 中的相应顺序(相同对象的)迭代其对象?
这是一个快速而肮脏的例子:
L = [(7,2), (4,3), (5,9), (1,8)]
mykey1 = lambda e: e[0]
mykey2 = lambda e: e[1]
A = sorted(L, key=mykey1) # A = [(1,8), (4,3), (5,9), (7,2)]
B = sorted(L, key=mykey2) # B = [(7,2), (4,3), (1,8), (5,9)]
在处理由A[0:2](即[(1,8), (4,3)])组成的子列表时,是否有一些棘手的方法来迭代[(4,3), (1,8)](因为根据键mykey2,对象(4,3) 位于对象(1,8) 之前. 为了达到这个目的,我想避免迭代除实际属于 A[0:2] 的对象之外的任何其他对象?
我可以通过遍历整个 B 并检查对象是否在子列表中(通过向对象在A) 中给出其位置;我能做得更好吗?
【问题讨论】:
标签: algorithm sorting iteration sublist