【发布时间】:2021-05-09 06:57:14
【问题描述】:
您好,我正在尝试在 python 中创建一个合并排序算法。我想尽可能地发挥功能,并尽可能避免循环和分配。现在我的功能还不够快。
有人告诉我,我必须改变我的拆分函数,因为那是让我慢下来的那个,因为它的运行时间是 O(n)
我现在无法想象如何改变它。我认为我应该摆脱所有列表以支持迭代器/生成器。但正如我现在所看到的,如果我应该从 split 函数中获得收益,我必须从根本上改变我的设计。
另外,我想知道我所有的 if else 语句是否都在考虑过多的计算机思维?
另外,我可以用柯里化改进代码吗?
def split(xs, half):
return (xs[:half], xs[half:])
def msort(xs):
length = len(xs)
if length <= 1:
yield from xs
else:
yield from merge(*(msort(x) for x in split(xs, length//2)))
def merge(xs, ys, x=None, y=None):
if not y:
y = get(ys)
if not x:
x = get(xs)
if x and y:
if x <= y:
yield x
yield from merge(xs, ys, y=y)
else:
yield y
yield from merge(xs, ys, x=x)
else:
if x:
yield x
yield from xs
if y:
yield y
yield from ys
def get(xs):
try:
return next(xs)
except StopIteration:
return None
【问题讨论】:
-
预计需要多长时间以及应该快多少?
-
全函数式编程不适用于某些算法。在这种情况下,问题是迭代,数组的修改被替换为 make |为每个合并的元素返回副本并递归,这本来就很慢,并且在大型数组上溢出堆栈。
标签: python functional-programming generator mergesort