Structure Of Computation
Last updated
Last updated
Reduce:将问题转化成你熟悉的数据结构及算法
Design:根据计算图设计某种递归/迭代算法。不同计算图所采用的解法不同,解法可以分为以下几个类别:Brute Force、Decrease & Conquer、Divide & Conquer、Dynamic Programming 和 Greedy / Incremental
Problem:给定一个包含 n 个整数的数组 A,判断它是否包含整数 v
Example:
input:
output: true
Problem: 给定一个长度为 n 的整数数组 A,找到和最大的子数组
Example:
output: 16
遍历所有可能的子数组:
最大子数组有三种可能:整体位于左半边、整体位于右半边,横跨左右半边
计算图为树形
现在问题变得更容易了,图 B 中只有 n 个节点,且是一个有向无环图(DAG),恰好该图的拓扑排序正好是从 0 到 n,因此可以得到如下算法:
Input:
长度 = 1 的子数组 ,长度 > 1 的子数组 ,总数为
对长度为 k 的子数组求和,时间复杂度为
总体时间复杂度为
如果 表示 A 中以第 k 个元素结尾的子数组,以下简称 ,问题就按如下方式解决:
但 MSS_EA 的时间复杂度为 ,总体时间复杂度就与暴力解法如出一辙。但我们仔细思考,可以发现该过程中存在着重复计算:
如图 1 所示,在计算和最大的子数组过程中,重复计算了 n 次 ,n-1 次 ,...重新整理一下计算图,可以得到: