【算法】算法设计与分析 期末复习总结

第一章 算法概述

  • 时间复杂度比大小,用代入法,代入2即可。
  • 求渐进表达式,就是求极限,以极限为O的括号;
  • O是指上界,Ω是指下界,θ是指上下界相等,在这里,可以这样理解:
  1. f(n) = O(g(n)) 意味着 g(n) 在 n 趋近于无穷大时比 f(n) 大;
  2. f(n) = Ω(g(n)) 意味着 g(n) 在 n 趋近于无穷大时比 f(n) 小;
  3. f(n) = θ(g(n)) 意味着 g(n) 在 n 趋近于无穷大时和 f(n) 同阶;

第二章 递归与分治

主定理要掌握,选择题必考:

填空有一道二分搜索,掌握简单版和改进版即可:

#include<bits/stdc++.h>
using namespace std;const int N = 1e6 + 10;
int n, m, a[N], x;int bisearch(int x, int a[], int left, int right) {if (left > right)return -1;int middle = (left + right) / 2;if (a[middle] == x)return middle;else if (a[middle] < x)return bisearch(x, a, left, middle - 1);elsereturn bisearch(x, a, middle + 1, right);
}int main() {cin >> n >> m;for (int i = 0; i < n; i++)cin >> a[i];while (m--) {cin >> x;cout << bisearch(x, a, 0, n - 1) <<endl;}return 0;
}
#include<bits/stdc++.h>
using namespace std;const int N = 1e6 + 10;
int n, m, a[N], x;pair<int, int> bs(int x, int a[], int left, int right) {if (left > right) {pair<int, int> p(right, left);return p;}int middle = (left + right) / 2;if (a[middle] == x) {pair<int, int> p(middle, middle);return p;}else if (a[middle] < x)return bs(x, a, middle + 1, right);elsereturn bs(x, a, left, middle - 1);
} int main() {cin >> n >> m;for (int i = 0; i < n; i++)cin >> a[i];while (m--) {cin >> x;pair<int, int> p = bs(x, a, 0, n - 1);cout << p.first << " " << p.second << endl;}return 0;
}

接着是排序,快速排序和归并排序的平均时间复杂度都为O(n logn),快排在最坏情况下的时间复杂度是O(n^2)。

知道中位数概念,一组个数为n的数中,当下标k = (n + 1) / 2时,称为找中位数。

归并的趟数是 logn ,归并的复杂度是 O(n logn)。

第三章 动态规划

两个特征,最优子结构和重叠子问题,后者是动态规划和分治法的区别,分治法的子问题是相互独立的,而动态规划的子问题是有重叠的。

0-1背包问题

题目

给定n(n<=100)种物品和一个背包。物品i的重量是wi(wi<=100),价值为vi(vi<=100),背包的容量为C(C<=1000)。
应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。

输入格式:

共有n+1行输入:
第一行为n值和c值,表示n件物品和背包容量c;
接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。

输出格式:

输出装入背包中物品的最大总价值。

输入样例:

在这里给出一组输入。例如:

5 10
2 6
2 3
6 5
5 4
4 6
输出样例:

在这里给出相应的输出。例如:

15
思路

假如现在有五个物品要选,这五个按顺序排下来,从第一个到第五个的最佳选择方案,相当于下面两种的择优选择:

  1. 不选第一个+后四个的最佳选择方案;
  2. 选第一个+后四个的最佳选择方案;

所以我们发现这是一个具有最优子结构性质的题目,同时也有重合子问题,于是我们可以用动态规划的方法来做。

作为动态规划,我们要严格按照三步走的格式来做:

首先,状态表示,我们设置一个二维数组m[i][j],作为从第i个到最后一个的最佳选择,同时剩余容量为j;

接着,递归方程,m[i][j] = max ( m[i + 1][j] , m[i + 1][j - w[i]] + v[i] ),也就是从不加第i个的,和加了第i个的这两个方案里选一个总价值最大的;

最后,边界条件,当我们的i为最后一个时,也就是i = n,此时容量从0到最大都可以进行赋值,也就是m[n][j] 的赋值,如果最后一个的重量不比c大,那就设置为这个的价值,如果比c小,就设置为0,注意边界条件在填表时要先写。

现在我们来研究一下最佳方案要怎么打印出来,也就是输出最佳选择组合的各个物品的下标。此时因为dp表已经填完了,所以可以让i从最小开始,我们依次判断即可,怎么判断呢?

直接看物品重量是否不超过剩余重量即可,剩余重量要另起一个变量remain,外层是物品的循环,里面第一重判断是有没有超重,第二重判断是加这个物品是不是比没加要好,把上面max里面的两个照抄即可。

都满足条件,就打印出这个物品的下标,然后使得remain减去这个物品的重量。

代码
#include<bits/stdc++.h>
using namespace std;const int N = 100;int n, c;
int w[N], v[N];
int m[N][N];void dp() {for (int j = 0; j <= c; j++) {if (j >= w[n])m[n][j] = v[n];elsem[n][j] = 0;}for (int i = n; i >= 1; i--) {for (int j = 0; j <= c; j++) {if (j >= w[i])m[i][j] = max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);elsem[i][j] = m[i + 1][j];}}cout << m[1][c];
}void print() {int remain = c;for (int i = 1; i <= n; i++) {if (remain >= w[i]) {if (m[i + 1][remain] < m[i + 1][remain - w[i]] + v[i]) {cout << i << ' ';remain -= w[i];}}}cout << endl;
}int main() {cin >> n >> c;for (int i = 1; i <= n; i++)cin >> w[i] >> v[i];dp();print();return 0;
} 

第四章 贪心算法

选择当前看来最好的方案,这个的题目实在太简单了,不写思路。

题目

有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。

输入格式:

共两行,第一行为n(1≤n≤1000);第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。

输出格式:

输出为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。

输入样例:
10
56 12 1 99 1000 234 33 55 99 812
输出样例:
291.90

代码

#include<bits/stdc++.h>
using namespace std;const int N = 1010;
int n;
int t[N];int main() {cin >> n;for (int i = 1; i <= n; i++)cin >> t[i];sort(t + 1, t + n + 1);int total = 0;int wait = t[1];for (int i = 2; i <= n; i++) {total += wait;wait += t[i];}cout << fixed << setprecision(2) << 1.0 * total / n;return 0;
}

第五章 回溯法

子集和问题

题目

设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法,并输出利用回溯法在搜索树(按输入顺序建立)中找到的第一个解。

输入格式:

输入数据第1行有2个正整数n和c,n表示S的大小,c是子集和的目标值。接下来的1行中,有n个正整数,表示集合S中的元素。
是子集和的目标值。接下来的1 行中,有n个正整数,表示集合S中的元素。

输出格式:

输出利用回溯法找到的第一个解,以空格分隔,最后一个输出的后面有空格。当问题无解时,输出“No Solution!”。

输入样例:

在这里给出一组输入。例如:

5 10
2 2 6 5 4
输出样例:

在这里给出相应的输出。例如:

2 2 6

思路

这道题是在一堆数里面选择出一组加起来等于目标数的,用回溯法来做就是画出一棵二叉树,每一层树枝代表一个数字,如果选了这个数字,就顺着左子树往下走,没选就顺着右子树往下走,直到最底下,每次选择与否都要记录下来,还得记录当前的数字之和,如果走到叶子时数字之和等于目标数,就可以输出这组数了。

代码

#include<bits/stdc++.h>
using namespace std;const int N = 1000;int n, c; // 数字个数,目标数 
int a[N], x[N]; //保存数字的数组,表示数字被选与否状态的数组
int sum = 0, remain = 0; //当前已选数字之和,当前剩余数字之和void backtrack(int t) {if (t > n) {if (sum == c) {for (int i = 1; i <= n; i++) {if (x[i] == 1) cout << a[i] << " ";}cout << endl;exit(0);}return;}remain -= a[t];if (sum + a[t] <= c) {x[t] = 1;sum += a[t];backtrack(t + 1);sum -= a[t];}if (sum + remain >= c) {x[t] = 0;backtrack(t + 1);}remain += a[t];
} int main() {cin >> n >> c;for (int i = 1; i <= n; i++) {cin >> a[i];remain += a[i];}backtrack(1);cout << "No Solution!" << endl;return 0;
}

第六章 分支限界法

分支限界法和回溯法的区别:

回溯法的求解目标是找出解空间中满足约束条件的所有解,而分支限界法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数达到极大或极小的解,即在某种意义下的最优解;

回溯法以深度优先的方式搜索解空间,分支限界法则以广度优先或以最小耗费优先的方式搜索解空间,分支限界法的搜索策略是,在扩展结点处,先生成其所有子结点,再从当前的活结点表中选择下一个扩展结点。

6.1 分支限界法的基本思想

分支限界法与回溯法的主要区别在于它们对当前扩展结点所采用的扩展方式不同。

搜索方式是广度优先或最小耗费(最大效益)优先。

1. 队列式(FIFO)分支限界法

按队列的先进先出原则选取下一个结点为当前扩展结点。

2. 优先队列式分支限界法

按优先队列中规定的结点优先级选取优先级最高的下一个结点成为当前的扩展结点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作常用的英语

第一节 视频连接&#xff08;中文&#xff09;&#xff1a;在外企工作经常可以用上的英语表达【商务英语学习】_哔哩哔哩_bilibili 1、carry out 进行&#xff0c;开展&#xff0c;执行 eg. 1&#xff09;We need to carry out this work as soon as possible. 我们需要尽快…

【软件测试】软件测试工程师需要掌握的非测试知识有哪些

一个优秀的测试工程师&#xff0c;必须具备宽广的知识面&#xff0c;才能设计出有的放矢的测试用例&#xff0c;保证整个软件产品的质量。除了测试专业知识外&#xff0c;你还要掌握哪些知识&#xff0c;才能一路披荆斩棘&#xff0c;成长为一名优秀的测试工程师&#xff0c;或…

如何清除快速访问

如何清除快速访问 手动清除快速访问项打开注册表编辑器&#xff1a;按 Windows 键 R 打开运行对话框&#xff0c;输入 regedit&#xff0c;然后按 Enter。使用命令提示符 手动清除快速访问项 打开文件资源管理器&#xff1a;按 Windows 键 E。 访问快速访问&#xff1a;点击…

sqlite插入语句id自增列问题

sqlite给主键id设置AUTOINCREMENT自增在插入数据的时候报错table has x columns but x-1 values were supplied 为什么自增列要显示不提供,sqlite需要提供自增列table ResTools has 7 columns but 6 values were supplied SQL Statement:insert into ResTools values(管理系统w…

6.综合案例

1. 需求描述 1.1 显示所有员工信息 URI:emps 请求方式:GET 显示效果 1.2 添加操作- 去往添加页面 显示添加页面: URI:emp 请求方式:GET 显示效果 1.3 添加操作- 添加员工 添加员工信息: URI:emp 请求方式:POST 显示效果:完成添加, 重定向到 list 页面。 1.4…

【深度学习:Domain Adversarial Neural Networks (DANN) 】领域对抗神经网络简介

【深度学习&#xff1a;Domain Adversarial Neural Networks】领域对抗神经网络简介 前言领域对抗神经网络DANN 模型架构DANN 训练流程DANN示例 GPT示例 前言 领域适应&#xff08;DA&#xff09;指的是当不同数据集的输入分布发生变化&#xff08;这种变化通常被称为共变量变…

RT-Thread 内核基础(三)

程序内存分布 一般MCU包含的存储空间有&#xff1a;片内Flash与片内RAM&#xff0c;RAM相当于内存&#xff0c;Flash相当于硬盘。 编译器会将一个程序分类为好几个部分&#xff0c;分别存储在MCU不同的存储区。 Keil工程在编译完之后&#xff0c;会有相应的程序所占用的空间提…

Hive实战处理(二十三)hive整合phoenix

背景&#xff1a; 业务表使用hbase存储,使用hive整合phoenix&#xff0c;使用sql语句进行数据查询 &#xff08;如果可以的话使用网关API对外提供服务&#xff09;统一接口调用&#xff0c;查询上线比较高效。 1、hive整合phoenix的原理 Hive支持使用HDFS之外的存储系统作为底…

图灵日记之java奇妙历险记--抽象类和接口

目录 抽象类概念抽象类语法 接口概念规则使用特性实现多个接口接口的继承接口使用实例Clonable接口和深拷贝抽象类和接口的区别 Object类 抽象类 概念 在面向对象的概念中,所有对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够…

SD-WAN:提升连锁零售企业异地组网稳定性

连锁零售企业往往拥有众多分布在不同地区的分支机构和零售店&#xff0c;为保证企业高效运转&#xff0c;各地区之间的网络连接必须稳定可靠。但基于各地网络基础设施的不同和网络延迟、带宽等限制&#xff0c;异地组网往往并不稳定。在这背景下&#xff0c;SD-WAN成为连锁零售…

第6章-用户标签体系与用户画像

目录 标签体系 标签分类 业务指标 OSM模型 北极星指标 北极星指标拆解</

拼多多详情API开启运营比价新纪元

随着互联网的快速发展&#xff0c;电商行业正在迅速崛起&#xff0c;拼多多作为一家新兴的电商平台&#xff0c;凭借其独特的营销策略和创新的商业模式&#xff0c;成为了电商行业的一匹黑马。在拼多多的成功背后&#xff0c;其详情API接口营销起到了至关重要的作用。本文将详细…

UV贴图和展开初学者指南

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 介绍 这正是本文的主题——UV贴图——登上舞台的时候。大多数 3D 建…

在win10和Linux上配置SSH 无密码登录

文章目录 一、用途二、在本地机器上使用ssh-keygen产生公钥私钥对1&#xff09;在Linux (或macOS) 上产生SSH公私钥的方法2&#xff09;在win10上产生SSH公私钥的方法a&#xff09;检查windows 本地是否安装有sshb&#xff09;在本地生成SSH密钥对&#xff08;公钥和私钥&#…

基于Java SSM框架实现时间管理系统项目【项目源码+论文说明】

基于java的SSM框架实现时间管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于时间管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了时间管理…

SQL Server从0到1——提权

xp_cmdshell提权 xp_cmdshell在前面写webshell已经讲解过了&#xff0c;在这里不在重复 sp_oacreate提权 启用&#xff1a; EXEC sp_configure show advanced options, 1; RECONFIGURE WITH OVERRIDE; EXEC sp_configure Ole Automation Procedures, 1; RECONFIGURE WITH OV…

【设计模式之美】SOLID 原则之一:怎么才算是单一原则、如何取舍单一原则

文章目录 一. 如何判断类的职责是否足够单一&#xff1f;二. 类的职责是否设计得越单一越好&#xff1f; 开始学习一些经典的设计原则&#xff0c;其中包括&#xff0c;SOLID、KISS、YAGNI、DRY、LOD 等。 本文主要学习单一职责原则的相关内容。 单一职责原则的定义&#xff1a…

MySQL运维实战(3.1) MySQL官方客户端使用介绍

作者&#xff1a;俊达 引言 MySQL是MySQL安装包默认的客户端&#xff0c;该客户端程序通常位于二进制安装包的bin目录中&#xff0c;或者通过rpm安装包安装mysql-community-client&#xff0c;是数据库管理系统的重要组成部分。MySQL客户端不仅仅是一个简单的软件工具&#x…

程序员必知!中介者模式的实战应用与案例分析

中介者模式通过引入中介类降低对象间耦合度&#xff0c;在电商平台中&#xff0c;卖家、买家、物流公司和支付平台原本需复杂交互&#xff0c;在引入“交易中介”类后&#xff0c;各角色只需与中介交互&#xff0c;由中介协调各方操作&#xff0c;从而简化了交互流程&#xff0…

APP加固技术及其应用

文章目录 引言 APP加固的概念 APP加固的方案 APP加固在实际开发中的应用 总结 引言 在移动应用开发过程中&#xff0c;APP加固技术起到了非常重要的作用。APP加固是将apk文件进行混淆加密&#xff0c;以防止别人反编译获取我们的源码和资源文件。目前市场上主流的APP加固…