前几天刷leetcode,用动态规划讲时间复杂度降低到了O(n),但是今天看numpy的文档发现,算法还要考虑实际情况。
转
买低,卖高
这是另一个激发你胃口的例子。考虑以下经典技术面试问题:
假定一只股票的历史价格是一个序列,假设你只允许进行一次购买和一次出售,那么可以获得的最大利润是多少?例如,假设价格=(20,18,14,17,20,21,15),最大利润将是7,从14买到21卖。
(对所有金融界人士说:不,卖空是不允许的。)
存在具有n平方时间复杂度的解决方案,其包括采用两个价格的每个组合,其中第二价格“在第一个之后”并且确定最大差异。
然而,还有一个O(n)解决方案,它包括迭代序列一次,找出每个价格和运行最小值之间的差异。 它是这样的:
>>> def profit(prices):
... max_px = 0
... min_px = prices[0]
... for px in prices[1:]:
... min_px = min(min_px, px)
... max_px = max(px - min_px, max_px)
... return max_px
>>> prices = (20, 18, 14, 17, 20, 21, 15)
>>> profit(prices)
7
这可以用NumPy实现吗?行!没问题。但首先,让我们构建一个准现实的例子:
中间太长不转了,结论
虽然理论上的时间复杂性是一个重要的考虑因素,运行时机制也可以发挥很大的作用。NumPy不仅可以委托给C,而且通过一些元素操作和线性代数,它还可以利用多线程中的计算。但是这里有很多因素在起作用,包括所使用的底层库。
我也不知道我为什么要写这个对别人没用的blog,其实吧本来就没啥用。
差点忘记了这个写日记的地方。