时间复杂度,贪心算法解最大团问题,回溯算法解0-1背包问题(仅步骤)
一:算法时间复杂性
1.写出下列非递归程序的时间复杂性
(1)
for(i=2;i<=n;++i)
for(j=2;j<=i-1;++j)
{ ++x;
a[i,j]=x;
}
上述程序的时间复杂性为:O(n^2)
(2)
int i,j x=0;
for (i=1;i<n;++i)
{
for (j=i+1;j<=n;++j)
{++x}
}
上述程序的时间复杂性为: O(n^2)
(3)
int i=1;
while(i<=n)
i=i*2;
上述程序的时间复杂性为: O(logn)
- 写出下列递归程序的时间复杂性
int f(int n)
{
if (n==1)
{return 1;}
else
{
return f(n-1)+f(n-2);
}
}
上述递归程序的时间复杂性为:O(2^n)
求解过程:
以f(6)为例:斐波那契数列到第六个数停止
为了计算简便,把第5层fib(1)和fib(2)放在第4层最右边,不影响时间复杂度的计算
可知F(6)有4层,即推得F(n)有n-2层
亦得第n层节点个数:2^n 个
所以,前n层节点个数:1+2+4+……+2^n = (2 ^ n) – 1
二叉树的高度是 n - 2,也就是递归过程函数调用的次数,所以时间复杂度为 O(2^n)。
二:贪心算法设计题
写出求解最大团问题的贪心算法的步骤。
最大团问题简介:一个无向图 G=(V,E),V 是点集,E 是边集。取 V 的一个子集 U,若对于 U 中任意两个点 u 和 v,有边 (u,v)∈E,那么称 U 是 G 的一个完全子图。 U 是一个团当且仅当 U 不被包含在一个更大的完全子图中。G的最大团指的是定点数最多的一个团。
解: 1.随机从点集V中选择一个点v1,v1自身构成一个完全子图U,标记为flag。
2.遍历v1的相邻边,枚举与其相连接的点(不在U中),若无邻接点,重复步骤1,否则执行步骤3。
3.选择第一个与v1相连的点v2,判断其与完全子图U中任意点是否均相连,若均相连,则将v2加入U中,否则继续遍历枚举其他点直至遍历结束,执行步骤4.
4.从U中选择一个未标记为flag的点u作为遍历中心,重复步骤2,待U中所有点均标记为flag时结束,此时的U是G的最大团。
三:回溯算法设计题
- 写出求解0-1背包问题的回溯算法的步骤
0-1背包问题简介::给定n 种物品和一背包。物品 i 的重量为 wi,其价值为 pi,背包的容量为 c。问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?
解:
使用子集树表示0-1背包问题的解空间。
计算右子树中解的上界的时将剩余物品依其单位重量价值排序,然后依次装入物品,直至装不下时,再装入物品的一部分而装满背包。由此得到的价值是右子树中解的上界。
而进入左子树时不需要计算上界,因为其上界与其父节点上界相同。
以下是动态规划转移方程和计算步骤
dp[n][wi]=max(dp[n-1][w(i-1)-wi]+pi,dp[n-1][wi])
1.计算每种物品单位重量的价值si=pi/wi=[6,5,4,3]
2.依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。
3.若将这种物品全部装入背包后,背包内的物品总重量未超过c,则选择单位重量价值次高的物品并尽可能多地装入背包。
4.依此策略一直地进行下去,直到背包装满为止
2.画出求解下面0-1背包问题的二叉树
n = 4,(wi) = (30, 40, 30, 10),(pi) = (180, 200, 120, 30),c = 95。
其中n为物品个数,wi为物品的重量,pi为物品的价值,c为背包总重量限制。
解:
时间复杂度,贪心算法解最大团问题,回溯算法解0-1背包问题(仅步骤)相关推荐
- 算法 64式 4、回溯算法整理__第1部分_1到13题
1算法思想 回溯 1.1含义 以深度优先方式搜索问题解的算法称为回溯法. 1.2思想 按照深度优先搜索策略,从根节点出发搜索解空间树,如果某结点不包含问题解,则逐层向祖先结点回溯:否则进入子树. 1. ...
- 算法基础(Java)--回溯算法
1. 什么是回溯算法? 回溯法是一种系统搜索问题解空间的方法.为了实现回溯,需要给问题定义一个解空间. 说到底它是一种搜索算法.只是这里的搜索是在一个叫做解空间的地方搜索. 而往往所谓的dfs,bfs ...
- c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...
目录: 分而治之算法 动态规划 回溯算法 分而治之算法 分而治之算法是算法设计的一种方式,它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将解决方式合并以解决原来的问题(例如快速排序,二分 ...
- 高效 遍历 算法_一文学会回溯算法解题技巧
(给算法爱好者加星标,修炼编程内功) 来源:码海 前言 上文我们学习了深度优先搜索和广度优先搜索,相信大家对这两者的算法有了比较清楚的认识,值得一提的,深度优先算法用到了回溯的算法思想,这个算法虽然相 ...
- 回溯 皇后 算法笔记_什么叫回溯算法,一看就会,一写就废
什么叫回溯算法 对于回溯算法的定义,百度百科上是这样描述的:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回, ...
- 数据结构与算法_04_回头是岸依好汉(回溯算法)
数据结构与算法,系列文章传送地址,请点击本链接. 目录 一.怎么理解回溯算法 二.经典应用 1.0-1 背包问题 2.正则表达式 3.八皇后问题 一.怎么理解回溯算法 回溯算法的理解:回溯算法,顾名思 ...
- c语言backtrack算法6,一个关于数组回溯算法(backtrack)的通用模式
今天在LeetCode看到一篇非常有价值的讨论,列举了一系列列数组的回溯算法的通用模式,自己动手一个个完成后,感觉对理解回溯算法的原理有很大帮助. 其实回溯就是按顺序的一种穷举,但是它会设定停止条件和 ...
- 回溯法 —— 求解0/1背包问题(剪枝)
0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...
- [人工智能]回溯算法解数独
今天在AI课上学了CSP,然后学了回溯算法.所以就用回溯算法来解数独吧. 数独问题可以把九九八十一个格简化为81个变量,每一个变量可以取1-9的值,当然,一开始初始化的值是不可以改变的.然后呢,对于这 ...
- 理解回溯算法——回溯算法的初学者指南
0 前言 最近做了不少关于回溯法的算法题,积累了一些心得,这篇博文算是对回溯法的一个小总结. 1 回溯法简介 回溯法简单来说就是按照深度优先的顺序,穷举所有可能性的算法,但是回溯算法比暴力穷举法更高明 ...
最新文章
- 电脑主板线路连接图解_电工速学手册:306页现场电工全能图解,实用技术精选大合集!...
- python之路--嵌套函数、匿名函数、高阶函数。函数的递归
- Linux 系统时间和硬件时间
- anything, if you have made a choice
- 线程池什么时候调用shutdown方法_ThreadPoolExecutor.shutdown()?
- ios获得通讯录中联系人的所有属性
- java 加上天数_java日期时间加上天数
- java中怎么声明常量_如何在Java中声明一个常量
- 深入理解 Java 中 protected 修饰符
- 解析卷积神经网络学习笔记——魏秀参
- 详解什么是运营商大数据?
- 什么软件可以测试手机硬件6,手机硬件检测的方法
- 北京网友加拨河北保定区号电话抢票引争议
- 用java求1000之内的素数_java求1000以内的素数
- Python上使用及安装tesseract
- 【商业数据分析】—— 用户价值RFM模型详解(小仙女搬运工)
- 机器学习之决策树实现隐形眼镜预测
- 笔记本使用GPRS上网教程
- Python爬虫——爬取Bing壁纸
- php 微信支付 退款接口,php实现微信支付之退款功能
热门文章
- LeetCode—4.滑动窗口
- LeetCode刷题——除数博弈
- “替代Linux”?!全球技术海啸来临
- 声纹技术:让智能语音助手真正“认得”自己
- 电子工业出版社博文视点图书在微软VS2010全球发布会上受追捧
- Hive报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
- 随机森林(Random Forest)通俗教程
- 学习Hadoop需要哪些预备知识?Java是否必须会?
- 有趣的算法(五):一文读懂二叉搜索树的插入、删除
- 【ffmpeg】overlay带有透明通道的视频