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

第一章 算法概述

  • 时间复杂度比大小,用代入法,代入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.rhkb.cn/news/234411.html

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

相关文章

Influxdb2修改管理员密码

通过恢复管理员令牌来重置InfluxDB2管理员的密码 1.找到数据库的配置文件 一般为config.json 2.配置文件的的blod文件配置 3.在这个混合文本和二进制json文件中搜索已知的用户名或token之类的字符串。 例如&#xff1a; "id":"0bd73badf2941000","…

WEB 3D技术 three.js 线框几何体

本文 我们说一下 线框几何体 想将一个几何体 以线框形式展现 threeJS中 有两种类可以实现 第一种 WireframeGeometry 这种几何体 其实就类似于 将材质中的 wireframe 开启 这种方法 之前我们也用过 还有一种 就是 EdgesGeometry 边缘几何体 我们先将代码写成这样 import .…

关于kthread_stop的疑问(linux3.16)

线程一旦启动起来后&#xff0c;会一直运行&#xff0c;除非该线程主动调用do_exit函数&#xff0c;或者其他的进程调用kthread_stop函数&#xff0c;结束线程的运行。 之前找销毁内核线程的接口时&#xff0c;发现了kthread_stop这个接口。网上说这个函数能够销毁一个内核线程…

Java中的IO流

在Java中&#xff0c;I/O&#xff08;输入/输出&#xff09;流用于处理与输入和输出相关的操作。Java的I/O流按照数据处理的不同方式分为两大类&#xff1a;字节流和字符流。每个类别又分为输入流和输出流。以下是Java中常用的I/O流及其继承关系&#xff1a; 字节流&#xff0…

批量剪辑方法:掌握视频剪辑技巧,按指定时长轻松分割视频

在视频制作和编辑过程中&#xff0c;经常要批量处理和剪辑大量的视频片段。学会批量剪辑方法可以提高工作效率&#xff0c;还可以使视频编辑更加准确和高效。下面来看下云炫AI智剪如何按指定时长轻松分割视频的批量剪辑方法。 分割后的视频文件效果&#xff0c;已分割分段的视…

业界首款PCIe 4.0/5.0多通道融合接口SSD技术解读

之前小编写过一篇文章劝大家不要碰PCIe 5.0 SSD&#xff0c;详细内容&#xff0c;可以再回顾下&#xff1a; 扩展阅读&#xff1a;当下最好不要入坑PCIe 5.0 SSD 如果想要进一步了解PCIe 6.0&#xff0c;欢迎点击阅读&#xff1a; 浅析PCIe 6.0功能更新与实现的挑战 PCIe 6.…

云卷云舒:【实战篇】云主机/虚拟机迁移

1. 简介 用户原有业务通过不同版本型号、不同操作系统的主机承载&#xff0c;形式上包括物理服务器、虚拟机、公有云主机等。随着业务不断扩张&#xff0c;需要将其业务云化转型&#xff0c;必须保证上云过程数据完整&#xff0c;业务平滑过度。 如果将所有业务系统都重新部署…

教你如何将本地虚拟机变成服务器,供其它电脑访问

场景&#xff1a;最近在做数据仓库的作业&#xff0c;需要团队协作&#xff0c;买不起阿里云服务器&#xff0c;所以想到能不能将我本地机上的虚拟机变成服务器&#xff0c;供其它同学的电脑访问。在虚拟机上安装hadoop和hive&#xff0c;然后同学机子上安装kettle进行连接。最…

Java 反射(一)

反射 1.反射的介绍 1.反射机制允话程序在执行期间借助于Refelction API取得任何类的信息&#xff08;比如成员变量&#xff0c;构造器&#xff0c;成员方法等&#xff09;并能操作对象的属性及方法&#xff0c;反射在设计模式和框架底层都会用到 2.加载完类之后&#xff0c;在…

可狱可囚的爬虫系列课程 08:新闻数据爬取实战

前言 本篇文章中我带大家针对前面所学 Requests 和 BeautifulSoup4 进行一个实操检验。 相信大家平时或多或少都有看新闻的习惯&#xff0c;那么我们今天所要爬取的网站便是新闻类型的&#xff1a;中国新闻网&#xff0c;我们先来使用爬虫爬取一些具有明显规则或规律的信息&am…

【Redis-04】Redis命令在客户端与服务器之间的执行流程

Redis本质上是一个数据结构服务器&#xff0c;支持键值对类型存储的内存管理系统&#xff0c;可以用作数据库、缓存和消息中间件&#xff0c;在我日常的开发中&#xff0c;基本上使用redis作为缓存中间件。 在Redis中有两个重要的角色&#xff0c;一个是服务器server&#xff0…

Adding Conditional Control to Text-to-Image Diffusion Models——【论文笔记】

本文发表于ICCV2023 论文地址&#xff1a;ICCV 2023 Open Access Repository (thecvf.com) 官方实现代码&#xff1a;lllyasviel/ControlNet: Let us control diffusion models! (github.com) Abstract 论文提出了一种神经网络架构ControlNet,可以将空间条件控制添加到大型…

性能分析与调优: Linux 监测工具的数据来源

目录 一、实验 1.环境 2. proc目录 3. sys目录 4.netlink 5.tracepoint 6.kprobes 7. uprobes 二、问题 1.systemd如何查看启动时间 2.CentOS与Ubuntu如何安装bpftrace 3.snap有哪些常用的命令 4.snap如何安装store 5.如何列出使用bpftrace的OpenJDK USDT探针 一…

显示管理磁盘分区 fdisk

显示管理磁盘分区 fdisk fdisk是用于检查一个磁盘上分区信息最通用的命令。 fdisk可以显示分区信息及一些细节信息&#xff0c;比如文件系统类型等。 设备的名称通常是/dev/sda、/dev/sdb 等。 对于以前的设备有可能还存在设备名为 /dev/hd* (IDE)的设备&#xff0c;这个设…

回顾2023编程之旅

一、前言 看在给了我一个博客专家的份上就继续写写博客&#xff0c;实事求是的讲如果是工作之余去总结csdn写写技术博客&#xff0c;还想混个专家什么的&#xff0c;真的是精力不够。因为里面的灌水的实在太多&#xff0c;比不过的&#xff0c;写这个玩意必须得淡泊名利才能悠然…

【PostgreSQL在线创建索引(CIC)功能的锁分析以及使用注意】

前一篇文章提到了普通创建索引会阻塞DML操作 PostgreSQL创建索引的锁分析和使用注意 而PostgreSQL里可以使用create index concurrently 在线创建索引(CIC)功能&#xff0c;降低创建索引在表上申请的锁的级别&#xff0c;ShareUpdateExclusiveLock级别的锁和RowExclusiveLock…

烟花燃放如何管控?智能分析网关V4烟火检测保障烟火安全

一、方案背景 随着元旦佳节的热潮退去&#xff0c;春节也即将来临&#xff0c;在众多传统的中国节日里&#xff0c;烟花与烧纸祭祀都是必不可少的&#xff0c;一方面表达了人们对节日的庆祝的期许&#xff0c;另一方面也是一种对故者思念的寄托。烟花爆竹的燃放不仅存在着巨大的…

Git将本地项目上传到Gitee仓库

1.右键点击文件&#xff0c;点击Git Bash Here,进入git窗口 2.初始化本地仓库 git init3.将本地仓库与远程仓库建立连接 git remote add origin 远程仓库地址远程仓库地址在gitee仓库复制即可 4.将远程仓库的文件拉到本地仓库中 git pull origin master5.将本地文件全部上传…

多模态推荐系统综述:二、特征交互 Fusion

二、Fusion 融合不同的多模态信息&#xff0c;与bridge相比&#xff0c;融合更关注项目之间的多模态内部关系。 它可以灵活地融合不同权重和焦点的多模态信息。 注意机制是应用最为广泛的特征融合。 2.1 粗粒度注意力。 一些模型应用注意力机制在粗粒度级别融合来自多种模式…

使用openssl 生成pfx格式证书时报错:unable to load certificates

问题现象包如下&#xff1a; 之前在centos上使用openssl部署证书服务器以及颁发证书的时候遇到的问题&#xff0c;在进行个人证书生成之后需要形成pfx格式证书&#xff0c;结果过程中报错了。网上类似资料比较少&#xff0c;做个记录。 生成pfx格式证书的命令&#xff1a; o…