【发布时间】:2018-07-31 10:10:40
【问题描述】:
计算整数序列的后缀最大值的推荐方法是什么?
以下是蛮力方法 (O(n**2)time),基于问题定义:
>>> A
[9, 9, 4, 3, 6]
>>> [max(A[i:]) for i in range(len(A))]
[9, 9, 6, 6, 6]
使用itertools.accumulate() 的一个O(n) 方法如下,它使用两个列表构造函数:
>>> A
[9, 9, 4, 3, 6]
>>> list(reversed(list(itertools.accumulate(reversed(A), max))))
[9, 9, 6, 6, 6]
有没有更 Pythonic 的方式来做到这一点?
【问题讨论】:
-
如果您将
max应用于越来越多的数字,我认为这不是O(n)。 -
它没有 - 它只是重复最多两个数字。一些快速测试证实了
O(n)的估计。 -
@ReutSharabani 是的,
itertools.accumulate的工作方式与 reduce 类似,因为它需要一个二元运算符,但它不是将 reducing 变为单个数字,而是累积所有中间结果。无论如何,我认为您的itertools.accumualte解决方案非常pythonic。但即使是等效的 for 循环也可以。 -
@juanpa.arrivillaga 知道了
标签: python python-3.x algorithm data-structures itertools