算法设计与分析阶段考总结

news2024/11/25 2:40:07

前言:基本是为了我自己看的一些我容易忘记的东西,为考试作准备把

第一章

算法中的基本概念

程序设计=数据结构+算法

算法特性

1.有穷性

2.确定性

3.可行性

4.输出

5.输入

算法复杂性分析

算法复杂性依赖于:问题规模N,输入I,算法本身A

时间复杂性T和空间复杂性S

时间复杂度

1.Master定理

求解T(n)=aT(n/b)+f(n)型方程,

第二章

递归算法:直接或者间接调用自身的算法称为递归算法

分治法的基本步骤如下:

  1. 分解:将原问题分解为若干个规模较小的子问题,这些子问题相互独立且与原问题形式相同。
  2. 解决:递归地解决各个子问题。如果子问题的规模足够小,则直接解决。
  3. 合并:将各个子问题的解合并起来,构成原问题的解。

Strassen矩阵乘法:

  1. 问题描述:给定两个n*n的矩阵A B,求C=A*B;

改进:

第三章

动态规划通常用于解决具有重叠子问题和最优子结构的问题。

动态规划的基本步骤如下:

  1. 定义状态:定义一个状态数组,用于存储子问题的解。
  2. 状态转移方程:定义状态转移方程,用于描述如何从一个状态转移到另一个状态。
  3. 初始化:初始化状态数组中的某些值。
  4. 计算结果:根据状态转移方程和初始值,计算状态数组中的所有值,最终得到原问题的解。

备忘录方法        自顶向下的递归方式

动态规划算法        以自底向上

贪心算法以自顶向下的方式进行

第四章

贪心法是一种解决问题的方法,它在每一步都选择当前看起来最优的解,希望最终得到全局最优解。贪心法通常用于解决具有贪心选择性质和最优子结构的问题。

贪心法的基本步骤如下:

  1. 定义目标函数:定义一个目标函数,用于衡量解的优劣。
  2. 贪心选择:在每一步中,选择当前看起来最优的解。
  3. 证明正确性:证明贪心选择能够得到全局最优解。

贪心选择性        最优子结构

贪心法的适用范围

贪心策略适用的前提是:局部最优策略能导致产生全局最优解。

选择题填空题

程序设计=数据结构+算法

算法分析

 大整数乘法:

  1. 问题描述:n位10进制整数X和Y,输出X和Y的乘积;

棋盘覆盖问题:

  1. 问题描述:在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在 棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格, 且任何2个L型骨牌不得重叠覆盖。

具体思想就是将一个大棋盘分割成4个小棋盘,有3个小棋盘中没有特殊方格,用一个L型的骨牌覆盖3个小棋盘的汇合处。按照左上、右上、左下、右下的方法递归覆盖。

合并排序

改进 

 

循环赛日程表:

 

矩阵连乘

最长公共子序列问题

思路 

 追踪

 

0-1背包

 

活动安排问题

 

 

程序设计

汉诺塔问题

问题描述:Hanoi问题起源于一个类似传说故事,在Hanoi这个地方有一个寺庙,这里有3根柱子和64个大小不同的金碟子。每个碟子有一个孔可以穿过。所有的碟子都放在第一个柱子上,而且按照从上到下碟子的大小依次增大的顺序摆设。如下图所示。现在,假定寺庙里的僧侣要移动这些碟子,将它们从柱子a移动到柱子b上。不过移动的规则如下:    1.每次只能从一个柱子的最上面移动一个碟子到另外一个柱子上。    2.不能将大碟子放到小碟子的上面。    按照前面这个规则,我们该怎么去移动这些碟子呢?

void hanoi(int n,char a,char b,char c)//将n个碟子从a移到b
 { 
    if(n==0) 
    return; 
    else 
     { 
        hanoi(n-1,a,c,b); 
        move(a,b); 
        hanoi(n-1,c,b,a);
     }
}
  • 移动方法是从a->b->c->a,在移动圆盘的时候,若是奇数次移动,则将最小的圆盘移动到顺时针方向的下一个塔座上,若是偶数次移动,则在其他两个塔座之间,将较小的圆盘移动到另一个塔座上去;

全排序

void Perm(int list[], int k, int m)
{
      if(k==m)
       {   for(int i=0;i<=m;i++)   cout<<list[i];
            cout<<endl;
        }
        else
         for(int i=k;i<=m;i++)
          {  
              swap(list[k],list[i]);
              Perm(list, k+1,m);
               swap(list[k],list[i]);
            } }

快速排序

#include<algorithm>

#include<cstdio>



using namespace std;



const int N=1e5+5;

int q[N];

void quick_sort(int *q,int l,int r)

{

    if(l>=r)return;

    int i=l-1,j=r+1,x=q[l+r+1>>1];

    while(i<j)

    {

        do i++;while(q[i]<x);

        do j--;while(q[j]>x);

        if(i<j)swap(q[i],q[j]);

    }

    quick_sort(q,l,i - 1),quick_sort(q,i,r);

}



int main()

{

    int n=0,x;

    while(~scanf("%d",&x)&&x)q[++n]=x;

    quick_sort(q,1,n);

    for(int i=1;i<=n;i++)printf("%d ",q[i]);

}

合并排序

void MergeSort(Type a[], int left, int  right)
   {
      if (left<right) {//至少有2个元素
         int i=(left+right)/2;  //取中点
         MergeSort(a, left, i);
         MergeSort(a, i+1, right);
        Merge(a, b, left, i, right);  //合并到数组b
       copy(a, b, left, right);    //复制回数组a
      }
   }

最大子段和问题

// 动态规划求解最大子段和问题
// n:数组a的元素个数
// a:待求最大子段和的数组
// c:保存子段和的起点
// d:返回最大子段和的终点
int MaxSum(int n, int *a, int *c, int *d) {
    int *b, sum; // b数组保存以i结尾的最大子段和,sum保存当前找到的最大子段和
    sum = 0;
    b[0] = 0; // 初始化b[0]为0
    for(i = 1; i <= n; i++) {
        if(b[i-1] > 0) {
            b[i] = b[i-1] + a[i]; // 如果前一个最大子段和是正数,则加上当前元素能获得更大的子段和
            c[i] = 1; // 标记当前元素在前一个最大子段和中
        } else {
            b[i] = a[i]; // 如果前一个最大子段和是负数,则当前元素就是新的最大子段和的开头
            c[i] = 0; // 标记当前元素为新的最大子段和的开头
        }
        if(b[i] > sum) { // 如果当前最大子段和比已知的最大子段和更大
            sum = b[i]; // 更新最大子段和
            (*d) = i; // 记录当前最大子段和的结束位置
        }
    }
    return sum; // 返回最大子段和
}

 0-1背包

​​#include<bits/stdc++.h>
 
using namespace std;
 
const int MAXN = 1005;
int v[MAXN];    // 体积
int w[MAXN];    // 价值
int f[MAXN][MAXN];  // f[i][j], j体积下前i个物品的最大价值
 
int main()
{
    int n, m;
    cin >> m >> n;
    for(int i = 1; i <= n; i++)
        cin >> v[i] >> w[i];
 
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            //  当前背包容量装不进第i个物品,则价值等于前i-1个物品
            if(j < v[i])
                f[i][j] = f[i - 1][j];
            // 能装,需进行决策是否选择第i个物品
            else
                f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
        }
 
    cout << f[n][m] << endl;
 
    return 0;
}
 

最优装载

#include <iostream>
#include <algorithm>
using namespace std;
 
const int MAXN = 10005;
int w[MAXN];
 
bool cmp(int a, int b) {
    return a > b;
}
 
int main() {
    int n, c;
    cin >> n >> c;
    for (int i = 1; i <= n; i++) {
        cin >> w[i];
    }
    sort(w + 1, w + n + 1, cmp);
    int sum = 0, cnt = 0;
    for (int i = 1; i <= n; i++) {
        if (sum + w[i] <= c) {
            sum += w[i];
            cnt++;
        } else {
            break;
        }
    }
    cout << cnt << endl;
    return 0;
}

活动安排

#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n,t;
int s[N],f[N];
void solve() {
	if(f[1] > t)return;
	cout <<"choose: 1 ";
	int j = 1;
	for(int i = 2; i <= n; ++i) {
		if(s[i] >= f[j]) {
			cout << i << " ";
			j = i;
		}
	}
}

int main() {
	cin >> n >> t;
	for(int i = 1; i <=n ; ++i) {
		cin >> s[i] >> f[i];
	}
	solve();
	return 0;
}

/*输入
10 11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
*/

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

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

相关文章

TCP 的可靠传输

目录 可靠传输有啥用确认应答超时重传总结 可靠传输有啥用 我们知道相比于 UDP, TCP 的传输是可靠的, 啥意思呢? 就是 UDP 发送的数据, 它自己不知道发送的数据对方是否接收到. 而 TCP 发送的数据, 它知道对方是否接收到, 也就是说对方会给个应答. 假设一个场景 : 甲要付款给…

全网最详细,Jmeter性能测试-性能基础详解,接口关联与编写Java脚本(三)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 接口关联 接口关联…

Vector - CAPL - CAN x 总线信息获取(续1)

继续.... 目录 OverLoadFrameCount -- 过载帧数量 代码示例 OverLoadFrameRate -- 过载帧速率 代码示例 StandardFrameCount -- 标准帧数量 代码示例 StandardFrameRate -- 标准帧速率 代码示例 StandardRemoteFrameCount -- 标准远程帧数量 代码示例 StandardRemote…

Java注解编译期处理AbstractProcessor详解

文章目录概述注解处理器注解处理流程AbstractProcessorgetSupportedOptions()getSupportedAnnotationTypesgetSupportedSourceVersioninit初始化process 处理方法如何注册注解处理器如何调试编译期代码Maven相关配置(指定生效的Processor)注意事项自定义注解处理器范例范例一&a…

多线程小知识

多线程 多线程环境使用哈希表HashMapHashtableConcurrentHashMap 死锁死锁是什么两者之间的死锁多人之间的死锁 死锁产生的四个必要条件:互斥使用不可抢占请求和保持循环等待 不同的锁ReentrantLockSynchronized和ReentrantLock之间的区别:具体选择Synchronized加锁工作过程偏向…

using namespace std 是什么意思——C++命名空间

目录 namespace命名空间局部域和全局域namespace展开命名空间指定命名空间 命名空间的嵌套不同文件中的同名命名空间 using namespace std 是什么意思 我们先看一段C代码&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 0;int main() {printf(&quo…

6.2 统计量与抽样分布

学习目标&#xff1a; 我的理解: 统计量是从一个样本中计算得到的数值&#xff0c;用于描述样本的某种特征或性质。统计量可以用来推断总体的特征或性质&#xff0c;因为样本是总体的一部分。 通常&#xff0c;统计量是通过对样本中的数据进行计算得到的&#xff0c;例如平均…

3年轻人20万开店日营业额79.2元,年轻人开店还能赚到钱吗?

最近&#xff0c;河南郑州的蔡先生和2个朋友合伙开一家汉堡店&#xff0c;生意很惨淡&#xff0c;日营业额79.2元。 蔡先生表示&#xff0c;他们开店失败的最大原因就是没有做好前期准备工作&#xff0c;产品没有吸引人的特色&#xff0c;导致正式营业后吸引不到客户。 蔡先生用…

Python 实现海康机器人工业相机 MV-CU060-10GM 的实时显示视频流及拍照功能

一、背景介绍 1、最近项目中需要给客户对接海康机器人工业相机 MV-CU060-10GM&#xff1b; 2、客户要求通过部署的管理平台&#xff0c;可以在页面上实现如下功能&#xff1a; 1&#xff09;相机视频流开始预览&#xff1b; 2&#xff09;相机视频流停止预览&#xff1b; 3&am…

三月份跳槽了,历经阿里测开岗4轮面试,不出意外,被刷了...

大多数情况下&#xff0c;测试员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 前几天&#xff0c;我看到有朋友留言说&#xff0c;他在面试阿里的测试开发工程师的时候&#xff0c;灵魂拷问三小…

NIO非阻塞式网络通信实例

一、概述 1、NIO有三大核心部分&#xff1a;Channel(通道)&#xff0c;Buufer(缓存区)&#xff0c;Selector(选择器) Buffer缓存区 缓冲区本质上是一块可以写入数据&#xff0c;然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象&#xff0c;并提供了 一组方法&am…

❤Linux文件、目录与磁盘格式总结❤

文章目录 Linux文件、目录与磁盘格式总结Linux文件权限chgrpchmodchown文件种类Linux文件扩展名 Linux文件与目录管理常用的目录解释目录树绝对路径与相对路径cd(切换目录)pwd(显示当前目录)mkdir(建立一个新目录)rmdir(删除空目录)执行文件路径变量$PATHls(文件与目录的查看)c…

青藤首提“业安融合”理念,正式发布先进云安全方案CNAPP

4月18日&#xff0c;以“云时代&#xff0c;安全变了”为主题的2023年云安全高峰论坛在北京举行。会上&#xff0c;青藤首次提出“业安融合”理念&#xff0c;正式发布先进云安全方案CNAPP。 中国全面进入云和数字化时代 当前&#xff0c;全球已进入数字经济时代&#xff0c;…

物联感知产品如何助力企业实现智能化转型?

如果您的企业想要实现设备全生命周期管理、设备信息管理、设备监控和数据处理等功能&#xff0c;想要进行智能化数字转型&#xff0c;不妨了解一下物联感知。 物联感知产品是利用物联网技术&#xff0c;实现对物理世界的感知、联接和智能化。物联感知产品一般由四个部分组成&a…

python中的pyc文件了解一下?

基本说明 pyc 文件是 Python 编译过的字节码文件。当你运行一个 Python 程序时&#xff0c;Python 解释器首先将源代码&#xff08;通常是 .py 文件&#xff09;编译成字节码。这个字节码是一种低级的、与平台无关的代码&#xff0c;它可以被 Python 虚拟机&#xff08;Python…

TCP的连接管理机制(三次握手与四次挥手)

目录为啥要三次握手与四次挥手三次握手syn 与 ack三次握手具体流程四次挥手注意为啥要三次握手与四次挥手 相比于UDP, TCP是有连接的, 这个连接就体现在这了. 三次握手就是TCP建立连接, 四次挥手就是TCP断开连接. 三次握手 握手是指通信双方进行网络交互. 三次握手就相当于…

记录上传文件异常 /tmp/tomcat... (No space left on device)

一&#xff0c;问题描述 用postman调用上传接口&#xff0c;基本每两次调用会有一次报错&#xff0c;如下 {"timestamp": "2023-04-11T03:00:15.4690000","status": 500,"error": "Internal Server Error","exceptio…

【活动】想对大学的自己说……

写在前面&#xff1a; 时间过得真的很快&#xff0c;眨眼间我们已经走过了这么多年的大学时光。回想起来&#xff0c;我们曾经有过无数的欢笑和泪水&#xff0c;有过无数的成功和挫败&#xff0c;但是这些经历都让我们变得更加坚强和成熟。如果现在有机会回到大学时光&#xff…

【LInux】进程间通信 -- 匿名管道

前言 我们在学习进程管理&#xff0c;进程替换时&#xff0c;都强调了进程的独立性&#xff0c;那进程间通信是什么&#xff1f;这好像和进程的独立性相矛盾吧&#xff1f; 那么今天&#xff0c;我们就来学习进程间通信&#xff0c;和第一种通信方式 – 管道 文章目录 前言一. …

高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

目录 前言一、nohup命令详解1-1、nohup命令介绍1-2、语法格式1-2-1、基础语法介绍1-2-2、执行脚本文件1-2-3、执行python文件1-2-4、拓展延申&#xff1a;在服务器上运行后台进程1-2-5、nohup和&的区别 二、进程查看2-1、jobs命令&#xff08;基本不用&#xff09;2-2、ps命…