我对这两个函数进行了基准测试(它们将成对解压缩回源列表,来自这里):
n = 10**7
a = list(range(n))
b = list(range(n))
pairs = list(zip(a, b))
def f1(a, b, pairs):
a[:], b[:] = zip(*pairs)
def f2(a, b, pairs):
for i, (a[i], b[i]) in enumerate(pairs):
pass
Run Code Online (Sandbox Code Playgroud)
结果timeit.timeit(五轮,数字为秒):
f1 1.06 f2 1.57
f1 0.96 f2 1.69
f1 1.00 f2 1.85
f1 1.11 f2 1.64
f1 0.95 f2 1.63
Run Code Online (Sandbox Code Playgroud)
显然f1比 快很多f2,对吧?
但后来我也测量了timeit.default_timer并得到了完全不同的图片:
f1 7.28 f2 1.92
f1 5.34 f2 1.66
f1 6.46 f2 1.70
f1 …Run Code Online (Sandbox Code Playgroud) 我有一个 n 元素数组。除了4?n它们之外的所有元素都被排序。我们不知道这些错位元素的位置。对此列表进行排序的最有效方法是什么?
有没有 O(n) 的方法来做到这一点?
更新 1:
的时间复杂度?对于几乎排序的数据,插入排序是 O(n)(在最坏的情况下是真的吗?)?
假设我有三个列表:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1]
Z = [ 5, 2, 3, 1, 4, 9, 6, 0, 7]
Run Code Online (Sandbox Code Playgroud)
我可以很容易地根据 Y 对 X 进行排序:
XY_sort = [x for _,x in sorted(zip(Y,X))]
print(XY_sort) # ["a", "d", "h", "b", "c", "e", "i", "f", "g"]
Run Code Online (Sandbox Code Playgroud)
当我想根据产生 XY_sort 的排序对列表 Z 进行排序时,就会出现疑问。理想情况下,我想结束:
Z_sort = [5, 1, 0, 2, 3, 4, 7, 9, 6]
Run Code Online (Sandbox Code Playgroud)
我猜最好的方法是在 X 被排序到 XY_sort 时以某种方式存储它的排序索引,然后使用它们对 …
例子:
(0, 0, 1, 1) => True (becomes 1 and remains 1)
(0, 0, 0) => False (never becomes 1)
(0, 1, 1, 0, 1) => False (becomes 1 but goes back to 0)
(1, 1, 1) => True (ok to become 1 right away)
Run Code Online (Sandbox Code Playgroud)
我有一个有限生成器,它0为“未完成”和1“完成”提供信号值。它应该达到“完成”,然后保持“完成”。我想检查一下。
这是一个示例生成器(带有硬编码值)以及我想如何使用它:
def signal():
yield from (0, 0, 1, 1)
>>> check(signal())
True
Run Code Online (Sandbox Code Playgroud)
我有一个解决方案,但它看起来又长又复杂。一定会有更好的办法!欢迎任何和所有想法。
def check(s):
done = False
for x in s:
if x:
done = True
break
if not …Run Code Online (Sandbox Code Playgroud)