期末一天一本换时间段方案
开始决定写一些比较理论的东西,现在觉得还是写一些比较实例化的东西比较好。
算法概述
算法与程序
算法是由若干条指令组成的有穷序列
性质:
- 输入:零个或多个 由外部提供的量作为输入
- 输出:至少产生一个量作为输出
- 确定性:指令清晰无歧义
- 有限性:每条指令执行次数、时间有限
算法复杂性分析
算法所需要的计算机资源(处理器资源、存储器资源)
空间复杂性和时间复杂性
- C:复杂性 C=F(N,I,A) 简化写法 C=F(N,I)
- T:时间复杂性 T=F(N,I)(主要讨论目标)
- S:空间复杂性 S=F(N,I)
- N:问题规模
- I : 输入
- A:算法
时间复杂性的具体化
- 令元计算:O1,O2,O3,…Ok
- -执行时间分别为:t1,t2,t3,…tk
- 假设给定一个算法A,执行Oi的次数为ei,那么,T(N,I)=
NP完全性理论
NP类问题:非确定性多项式问题
非确定性算法将问题的求解分为两个阶段:
- 猜测
猜测阶段是非确定性的,给出问题的一个猜测
- 验证
算法的验证阶段是确定性的,验证猜测阶段给出的解的正确性
给定一个算法A,A是解一个判定问题Q的非确定性算法, 如果A的验证阶段可以在多项式时间内完成,称A是一个多项式时间非确定性算法,称Q是非确定性多项式时间可解的。
P类问题:多项式问题
递归与分治策略
递归的概念
递归算法: 直接或间接调用自身的算法
递归函数: 用函数自身给出定义的函数
分治法的基本思想
将一个规模为n的问题分解为k个规模较小的子问题,这些问题互相独立且与原问题相同。递归解问题,然后将子问题合并得到解。
二分搜索技术
动态规划
0-1背包问题
贪心算法
散装背包问题
区别于0-1背包问题,这个是可以切开放的。假如说有5个物品
质量(kg) | 3 | 6 | 8 | 12 | 1 |
---|---|---|---|---|---|
价格 | 6 | 3 | 24 | 3 | 8 |
单位价格 | 2 | 0.5 | 3 | 0.25 | 8 |
首先算一下单位价格,也就是相对来说放进去最值的,因为是可以拆开的,所以尽管挑单位价值最大的放,先放8的再放3的,再放2的,一直放到背包满为止。
删数问题
给定一个数,删除掉指定个数个数字之后组成新数,求解使得所得数最小的方案:
以178435为例,删除四个数字,使得到的新数最小。这里用眼直接看都可以得出是13最小。
这里需要清楚,我们需要删除的数字并不一定是最大的,比如给定879,删除一个数字,删除最大的9得到87,并不如删除8得到的79小。这里需要拐一个弯,就是从高位往低位数,如果高位的数字比低位的大,就删掉高位的。为什么要这样呢?
还是拿178435,我们先删除掉一位,那么剩下的只有5位,如果我们删掉1,那么7将会变成最高位,这显然是不划算的。如果删掉7,那么8将会变成次高位,同一位置显然小一些更加好,所以我们删掉8。
当然你会发现,最佳结果是13,也就是7到最后还是会被删除掉。我们先删除8只是一个贪心的做法,并不影响最终的结果。如果我没记错,这应该叫做贪心选择性。每一次删除一个数字时候都选择最佳方案删应该就是最优化子结构。