算法:动态规划,贪心算法和NP完全性

动态规划

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。

动态规划基本步骤

找出最优解的性质,并刻划其结构特征。

递归地定义最优值。

以自底向上的方式计算出最优值。

根据计算最优值时得到的信息,构造最优解

矩阵连乘问题

将矩阵连乘积A_iA_i+1...A_j,简记为A[i:j] ,这里i≤j

考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵A_k和A_k+1之间将矩阵链断开,i≤k<j,则其相应完全加括号方式为(A_iA_i+1...A_k)(A_k+1A_k+2...A_j)

计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上A[i:k]和A[k+1:j]相乘的计算量

矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。

动态规划算法的基本要素

一、最优子结构

二、重叠子问题

三、备忘录方法

最优二叉搜索树

在表示S的二叉搜索树T中,设存储元素x_i的节点深度为c_i;叶节点(x_j,x_j+1)的节点深度为d_j,则

打不出来

表示在二叉搜索树中进行以此搜索需要的平均比较次数,又称为T的平均路长

最优二叉搜索树问题是指对于S及其存取概率分布(a_0,b_1,a_1,⋯,b_n,a_n),在所有表示S的二叉搜索树中找出一棵具有最小平均路长的二叉搜索树。


贪心算法

贪心算法的设计思想:

(1) 从某一个初始状态出发

依据当前局部的最优决策,而不是全局的最优决策

以满足约束方程为条件,以使得目标函数的值增加最慢或者最快为准则,选择一个最快达到要求的输入元素

贪心法的优势:

算法简单,时间和空间复杂性低.

适于用贪心算法求解的条件

1)贪婪选择性质:所求问题的全局最优解,可以通过一系列局部最优的选择来达到

2)最优子结构:问题的最优解,包含它的子问题的最优解

的选择来达到

例子:

例:从 10 张 10 元、10 张 5 元、10 张 1 元、10 张 5角、10 张 2 角、10 张 1 角的货币中兑付 57 元 8 角。 用集合P={p_1,p_2,⋯,p_60}表示出纳手中的货币,而集合中的元素分别顺序表示货币手中的10张10元,10张5元,...

向量X=(x_1,x_2,⋯,x_60)表示支付给客户的货币

为了尽快付清57元8角,第一步挑出的货币集合为S_1={p_1},局部解为Y_1=(1,0,⋯)

问题简化为:在集合 P_1={p_2,⋯,p_60}中挑选货币,支付47 元 8 角

在以后的步骤中,可以用同样的方法进行挑选,并能得到问题的全局最优解

付给客户的货币集合的最优解是

S_n={p_1,p_2,p_3,p_4,p_5,p_11,p_21,p_22,p_31,p_41,p_51}

第一步所简化了的子问题的最优解是

S_n−1={p_2,p_3,p_4,p_5,p_11,p_21,p_22,p_31,p_41,p_51}

所以,出纳员付钱问题具有最优子结构性质

S_n−1⊂  S_n

S_n−1∪{p_1}=S_n


NP完全性

----就是易解的问题与难解的问题

如果存在函数 f :N®N使得, 对任意的规模为 n的实例 I, 算法 A对 I 的运算在 f(n)步内停止, 则称算法 A的时间复杂度为 f(n).

多项式时间算法: 以多项式为时间复杂度.

易解的问题: 有多项式时间算法.

难解的问题: 不存在多项式时间算法.

易解的问题. 如排序、最小生成树、单源最短路径等

已证明的难解问题.

一类是不可计算的, 即根本不存在求解算法, 如希尔伯特第十问题¾¾丢番图方程是否有整数解.

另一类是有算法, 但至少需要指数时间, 或指数空间, 甚至更多的时间或更大的空间. 如带幂运算的正则表达式的全体性, 即任给字母表 A上的带幂运算的正则表达式 R, 问: áRñ=A*? 这个问题至少需要指数空间.

既没有找到多项式时间算法、又没能证明是难解的问题. 如哈密顿回路问题、货郎问题、背包问题等

判定问题

所有多项式时间可解的问题组成的问题类称作 P类.

设判定问题 P = < D,Y >, 如果存在两个输入变量的多项式时间算法 A和多项式 p, 对每一个实例 IÎD, IÎY 当且仅当存在 t, | t |£ p(|I|), 且 A对输入 I 和 t 输出"Yes", 则称P 是多项式时间可验证的, A是P 的多项式时间验证算法, 而当 IÎY 时, 称 t 是 IÎY 的证据.

由所有多项式时间可验证的判定问题组成的问题类称作NP类.

NP 完全问题是 NP 中最难的问题.

合式公式 是由变元, 逻辑运算符以及圆括号按照一定的规则组成的表达式. 变元和它的否定称作文字. 有限个文字的析取称作简单析取式. 有限个简单析取式的合取称作合取范式. 给定每一个变元的真假值称作一个赋值. 如果赋值 t 使得合式公式 F 为真, 则称 t 是 F 的成真赋值. 如果 F 存在成真赋值, 则称 F 是可满足的.

相关推荐
luthane2 小时前
python 实现average mean平均数算法
开发语言·python·算法
静心问道2 小时前
WGAN算法
深度学习·算法·机器学习
杰九3 小时前
【算法题】46. 全排列-力扣(LeetCode)
算法·leetcode·深度优先·剪枝
manba_3 小时前
leetcode-560. 和为 K 的子数组
数据结构·算法·leetcode
liuyang-neu3 小时前
力扣 11.盛最多水的容器
算法·leetcode·职场和发展
忍界英雄3 小时前
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
算法·leetcode·机器人
Kenneth風车3 小时前
【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·数据分析
C7211BA3 小时前
使用knn算法对iris数据集进行分类
算法·分类·数据挖掘
Tisfy4 小时前
LeetCode 2398.预算内的最多机器人数目:滑动窗口+单调队列——思路清晰的一篇题解
算法·leetcode·机器人·题解·滑动窗口
程序猿练习生4 小时前
C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
c++·算法·leetcode