一:算法时间复杂性

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)

  1. 写出下列递归程序的时间复杂性
    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的最大团。

三:回溯算法设计题

  1. 写出求解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背包问题(仅步骤)相关推荐

  1. 算法 64式 4、回溯算法整理__第1部分_1到13题

    1算法思想 回溯 1.1含义 以深度优先方式搜索问题解的算法称为回溯法. 1.2思想 按照深度优先搜索策略,从根节点出发搜索解空间树,如果某结点不包含问题解,则逐层向祖先结点回溯:否则进入子树. 1. ...

  2. 算法基础(Java)--回溯算法

    1. 什么是回溯算法? 回溯法是一种系统搜索问题解空间的方法.为了实现回溯,需要给问题定义一个解空间. 说到底它是一种搜索算法.只是这里的搜索是在一个叫做解空间的地方搜索. 而往往所谓的dfs,bfs ...

  3. c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...

    目录: 分而治之算法 动态规划 回溯算法 分而治之算法 分而治之算法是算法设计的一种方式,它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将解决方式合并以解决原来的问题(例如快速排序,二分 ...

  4. 高效 遍历 算法_一文学会回溯算法解题技巧

    (给算法爱好者加星标,修炼编程内功) 来源:码海 前言 上文我们学习了深度优先搜索和广度优先搜索,相信大家对这两者的算法有了比较清楚的认识,值得一提的,深度优先算法用到了回溯的算法思想,这个算法虽然相 ...

  5. 回溯 皇后 算法笔记_什么叫回溯算法,一看就会,一写就废

    什么叫回溯算法 对于回溯算法的定义,百度百科上是这样描述的:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回, ...

  6. 数据结构与算法_04_回头是岸依好汉(回溯算法)

    数据结构与算法,系列文章传送地址,请点击本链接. 目录 一.怎么理解回溯算法 二.经典应用 1.0-1 背包问题 2.正则表达式 3.八皇后问题 一.怎么理解回溯算法 回溯算法的理解:回溯算法,顾名思 ...

  7. c语言backtrack算法6,一个关于数组回溯算法(backtrack)的通用模式

    今天在LeetCode看到一篇非常有价值的讨论,列举了一系列列数组的回溯算法的通用模式,自己动手一个个完成后,感觉对理解回溯算法的原理有很大帮助. 其实回溯就是按顺序的一种穷举,但是它会设定停止条件和 ...

  8. 回溯法 —— 求解0/1背包问题(剪枝)

    0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...

  9. [人工智能]回溯算法解数独

    今天在AI课上学了CSP,然后学了回溯算法.所以就用回溯算法来解数独吧. 数独问题可以把九九八十一个格简化为81个变量,每一个变量可以取1-9的值,当然,一开始初始化的值是不可以改变的.然后呢,对于这 ...

  10. 理解回溯算法——回溯算法的初学者指南

    0 前言 最近做了不少关于回溯法的算法题,积累了一些心得,这篇博文算是对回溯法的一个小总结. 1 回溯法简介 回溯法简单来说就是按照深度优先的顺序,穷举所有可能性的算法,但是回溯算法比暴力穷举法更高明 ...

最新文章

  1. 电脑主板线路连接图解_电工速学手册:306页现场电工全能图解,实用技术精选大合集!...
  2. python之路--嵌套函数、匿名函数、高阶函数。函数的递归
  3. Linux 系统时间和硬件时间
  4. anything, if you have made a choice
  5. 线程池什么时候调用shutdown方法_ThreadPoolExecutor.shutdown()?
  6. ios获得通讯录中联系人的所有属性
  7. java 加上天数_java日期时间加上天数
  8. java中怎么声明常量_如何在Java中声明一个常量
  9. 深入理解 Java 中 protected 修饰符
  10. 解析卷积神经网络学习笔记——魏秀参
  11. 详解什么是运营商大数据?
  12. 什么软件可以测试手机硬件6,手机硬件检测的方法
  13. 北京网友加拨河北保定区号电话抢票引争议
  14. 用java求1000之内的素数_java求1000以内的素数
  15. Python上使用及安装tesseract
  16. 【商业数据分析】—— 用户价值RFM模型详解(小仙女搬运工)
  17. 机器学习之决策树实现隐形眼镜预测
  18. 笔记本使用GPRS上网教程
  19. Python爬虫——爬取Bing壁纸
  20. php 微信支付 退款接口,php实现微信支付之退款功能

热门文章

  1. LeetCode—4.滑动窗口
  2. LeetCode刷题——除数博弈
  3. “替代Linux”?!全球技术海啸来临
  4. 声纹技术:让智能语音助手真正“认得”自己
  5. 电子工业出版社博文视点图书在微软VS2010全球发布会上受追捧
  6. Hive报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
  7. 随机森林(Random Forest)通俗教程
  8. 学习Hadoop需要哪些预备知识?Java是否必须会?
  9. 有趣的算法(五):一文读懂二叉搜索树的插入、删除
  10. 【ffmpeg】overlay带有透明通道的视频