算法分析与设计考前冲刺 阅读

news2024/12/27 0:23:35

拜读我胡哥的精品复习资料 @acmack
在这里插入图片描述

胡哥发表重要讲话,强调算法的重要性,我等深受触动。

Map:底层是红黑树,按照key自动进行排序

list: 线性链表
我一直单纯的觉得list是列表,这不仅说明了胡哥与我的技术上的差距,还深刻的展现了胡哥与我在思想上的差距。
在这里插入图片描述
有几人你能够在学了一天后还能够写文章,我只能说胡哥牛逼。
胡哥就是技术上的“冬泳怪鸽”,你以为你胡哥沉寂了,不,他在等属于他的高光。
不知你有没有听说过acmack仅仅用了一个月的时间就将acm金奖捧回来,slowly,静待一个月,古月将拿下属于他的第一块金牌。当大家为古月大人欢呼时,他用食指抵住嘴唇,全场寂静,只听他说,火车是向前开的。

优先队列:最大的元素位于队首 ,最大的元素优先出队,同样,自动排序
也不一定是最大的元素在队首,可以进行修改,将最小的元素放在队头
就像说sort排序是不稳定一样,只需要简单修改,就能够将sort排序变成稳定的

分治步骤: 分解 解决 合并
在分解成小问题的时候就将小问题解决,最后再合并成原(大)问题

Fab数列用的递推,有水平

二分加了个左闭右开的例子,其实左闭右闭的区间我见过的比较少,我也不是很懂,算挖个坑。一般用的非左闭右闭(左闭右开/左开右闭)用的很多,甚至还有“男左女右”的口诀。

int BinarySearch(Type a[],const Type& x,int n)
{
    int left=0; 
    int right=n; 
    while(left<right)//左闭右开
        {
        int middle=(left+right)>>1;
        if (x==a[middle]) return middle; 
        if (x>a[middle]) left=middle+1; //middle已经判断不是了
        else right=middle; //不-1 因为是左闭右开 
        }
return -1; //如果循环结束后仍然没有找到目标元素
}

太强了,胡直接讲明白了,我也明白了,威武!

动态规划:将问题分解若干个子问题,但这些子问题并不独立,它们犬牙参差,交相辉映,它们虽身处各地,但它们仍是一个整体,星星之火,可以燎原!
以自底向上的方式计算出最优值
性质: 最优子结构 重叠子问题
0-1背包:
解法一:

#include<iostream>
#include<algorithm>
using namespace std;
const int M=1010;
int w[M],v[M];
int dp[M][M];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){  //两层循环都正序遍历 因为dp[i][j] 是由上面的元素和左上方得到的
            dp[i][j]=dp[i-1][j];//表示不选择第i键物品
            if (j>=v[i]){//当背包容量大于物品体积的时候取最大值
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
            }
        }

    }
    cout<<dp[n][m]<<endl;
    return 0;
}

解法二:

#include<iostream>
#include<algorithm>
#include <cstdio>
using namespace std;
const int M=1010;
const int N=1e6+10;
int w[M],v[M];
int dp[M];

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=m;j>=v[i];j--){//倒序遍历不然会存在覆盖的问题
                dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
        }
    }
    cout<<dp[m]<<endl;
    return 0;
}

第一解法,胡从数据表的角度解释,太精彩了
第二种解法,可能很多向我一样的蒟蒻可能不懂为什么倒序,你想啊,要是正序的话,你肯定会更新前面的数据,但前面的数据你不会再用,也就是说既没保证数据的稳定性,也没有充分的利用更新后的数据,所以你只能倒序,你妹的选啊,靓仔。而你倒序的话,能充分的比较在这个容量的所有的数据都比较了一遍,你才能得到性价比最高的选择

贪心:将原问题化成一个更小的与原问题具有相同形式的子问题
很多向我一样的蒟蒻不知道动态规划和贪心的区别,
贪心算法通常不会回溯,也不会重新考虑已经做出的选择。
动态规划则通过分解子问题、使用递归或迭代的方式自底向上求解子问题,保存子问题的解,并结合状态转移方程,逐步构建全局最优解。
解决问题的范围:
贪心算法:贪心算法通常适用于求解最小生成树、最短路径、区间调度等问题,对于某些问题无法得到全局最优解。
动态规划:动态规划算法可以应用于更广泛的问题,如背包问题、序列比对、图的最短路径等,能够求解更复杂的优化问题。
贪心不能求最优很难受,不要以为求出解就完了,有时候他求出来的解就很偏,虽然对,也能想明白,但和普通的逻辑不太一样,很怪。不过话又说回来,做题的话,只要解出来就好了。
选硬币:
现有面值分别为1角,5分,1分的硬币,请给出找1角5分钱的最佳方案。

#include <iostream>
#include <vector>

std::vector<int> findChange(int amount) {
    std::vector<int> coins = {10, 5, 1}; // 按面值从大到小排序的硬币面值
    std::vector<int> result(coins.size(), 0); // 用于存储每种硬币的数量

    for (int i = 0; i < coins.size(); i++) {
        int numCoins = amount / coins[i]; // 计算当前硬币面值的数量
        result[i] = numCoins; // 存储数量

        amount -= numCoins * coins[i]; // 更新剩余金额
    }
    return result;
}

int main() {
    int amount = 15; // 需要找零的金额,单位为分
    std::vector<int> change = findChange(amount);

    std::cout << "找零方案为:" << std::endl;
    std::cout << "1角1分硬币数量:" << change[0] << std::endl;
    std::cout << "5分硬币数量:" << change[1] << std::endl;
    std::cout << "1分硬币数量:" << change[2] << std::endl;
    
    return 0;
}

胡哥把我们想的太菜了,这是很简单的事情,不需要多想。就是很简单的求整除数。
背包问题:
下面是贪心做法:
//形参n是物品的数量,c是背包的容量M,数组a是按物品的性价比降序排序

double knapsack(int n, bag a[], double c)
{
    double cleft = c; //背包的剩余容量
    int i = 0;//下标
    double b = 0; //获得的价值
    //当背包还能完全装入物品i
        while(i	<n && a[i].w<cleft) //这里的a[i]是一个结构体数组 元素包括重量、价值即(v,w,性价比)
        {
        cleft -= a[i].w;
        b += a[i].v;
        i++;
        }
        // 物品可拆分   a[i].v/a[i].w 是i物品的单位价值
        if (i<n) b += 1.0*a[i].v*cleft/a[i].w;//凑满背包
return b;
} 

背包问题贪心贪在,优先按照性价比降序排列,每次优先考虑价值最高的物品
胡哥总结的太好了,就像金子般闪闪发光,尤其是物品可拆分的情况,太香了

回溯:
回溯算法是一种通过递归的方式尝试所有可能的解空间的算法。其核心思想是通过不断地尝试所有的选择,当发现当前选择无法达到目标时,回溯到上一步进行其他选择,直到找到符合要求的解或遍历完所有可能的选择。
回溯算法通常适用于以下情况:
组合问题:需要从一组候选元素中找出所有可能的组合,如组合总和、子集、排列等问题。
搜索问题:需要在一个状态空间中找到满足特定约束条件的解,如图的遍历、八皇后问题等。
优化问题:需要找到满足特定条件下的最优解,如旅行商问题、背包问题等。
我还不太会,但我会学,相信我,one day 我将用自己的思想渗透这些伟大的定理公式
素数环问题:
素数环,从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。

//判断质数
bool pd(int x,int y){
 int k=2,i=x+y;
 while (k<=sqrt(i)&&i%k!=0) k++; //
 if (k>sqrt(i)) return true;//遍历半圈没有找到
 else return false;//前面能被整除 
}
void search(int t){ 
 int i;
 for (i=1;i<=20;i++) 
     if (pd(a[t-1],i)&&(!b[i])){ //判断当前数和前一位的和是不是素数同时 当前元素没有出现过
     a[t]=i; //放入
     b[i]=1; //出现一次
     if (t==20) { 
         if (pd(a[20],a[1])) print(); }//注意边界 最后一个和第一个是连着的
     else 
         search(t+1); //递归寻找下一个数字
     b[i]=0;//回溯
 }
}
int print(){
 total++;
 cout<<"<"<<total<<">";
 for (int j=1;j<=20;j++)
 cout<<a[j]<<" ";
 cout<<endl; 
 }

search函数太优雅了,就是时间复杂度太高了,但不影响代码的思想,可惜了,受算力限制,没办法将所有的思想平等的对待,下课!

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

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

相关文章

C++标准模板(STL)- 类型支持 (属性查询,获取类型的对齐要求)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

CentOS to KeyarchOS 系统迁移体验

1. KOS(KeyarchOS)——云峦操作系统简介 KeyarchOS 即云峦操作系统(简称 KOS)是浪潮信息基于 Linux 内核、龙蜥等开源技术自主研发的一款服务器操作系统&#xff0c;支持x86、ARM 等主流架构处理器&#xff0c;广泛兼容传统 CentOS 生态产品和创新技术产品&#xff0c;可为用户…

一个前端非侵入式骨架屏自动生成方案

目录 背景 现有方案调研 侵入业务式手写代码 非侵入业务式手写代码 非侵入式骨架屏代码自动生成 技术方案 设计原则 架构图 骨架屏生成 骨架屏注入 优化点 部分技术细节解析 puppeteer 文本块处理 图片块处理 a 标签处理 自定义属性处理 首屏HTML处理 首屏样…

用照片预测人的年龄【图像回归】

在图像分类任务中&#xff0c;卷积神经网络 (CNN) 是非常强大的神经网络架构。 然而&#xff0c;鲜为人知的是&#xff0c;它们同样能够执行图像回归任务。 图像分类和图像回归任务之间的基本区别在于分类任务中的目标变量&#xff08;我们试图预测的东西&#xff09;不是连续…

WireGuard 组网教程:快速构建安全高效的私密网络并实现内网穿透

文章目录 1 引言1.1 什么是WireGuard1.2 WireGuard可以用来做什么1.3 WireGuard原理1.4 WireGuard安装 2 WireGuard组网实现内网穿透2.1 前提条件2.2 网络拓扑结构2.3 具体步骤2.3.1 中继服务器配置2.3.2 其他peer2.3.3 测试 2.4 WireGuard配置文件说明 3 WireGuard工具3.1 wg-…

智慧环保:科技驱动下的环境保护新篇章

智慧环保&#xff1a;科技驱动下的环境保护新篇章 环境保护已经成为当今社会的重要议题&#xff0c;而科技的飞速发展为我们开启了智慧环保的新篇章。在这篇文章中&#xff0c;我们将介绍智慧环保所带来的机会和创新&#xff0c;以及科技在环境保护中的重要作用。 智慧环保的理…

Topaz Video AI:引领视频质量革命,让您的内容焕发新生

随着数字媒体的日益普及&#xff0c;视频质量的重要性日益凸显。无论是个人用户还是专业团队&#xff0c;都需要确保他们的视频内容具有最佳的质量。但是&#xff0c;由于各种原因&#xff0c;如设备限制、环境干扰等&#xff0c;往往导致视频质量不尽如人意。这时&#xff0c;…

基于SSM的员工信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

[Android]创建TabBar

创建一个包含“首页”、“分类”和“我的”选项卡的TabBar并实现切换功能&#xff0c;通常可以通过使用TabLayout结合ViewPager或ViewPager2来完成。以下是一个基本的示例&#xff0c;展示了如何使用Kotlin和XML来实现这个功能。 1.添加依赖项到build.gradle dependencies {/…

linux 网络 cat /proc/net/dev 查看测试网络丢包情况

可以通过 cat /proc/net/dev 查看测试网络丢包情况&#xff0c;drop关键字&#xff0c;查看所有网卡的丢包情况 还可以看其他数据&#xff0c; /proc/net/下面有如下文件

德迅云安全为您介绍关于抗D盾的一些事

抗D盾概述&#xff1a; 抗D盾是新一代的智能分布式云接入系统&#xff0c;接入节点采用多机房集群部署模式&#xff0c;隐藏真实服务器IP&#xff0c;类似于网站CDN的节点接入&#xff0c;但是“抗D盾”是比CDN应用范围更广的接入方式&#xff0c;适合任何TCP 端类应用包括&am…

kubernetes--资源调度

目录 一、自动调度 1. Pod 启动创建过程&#xff1a; 2. 调度过程&#xff1a; 2.1 调度分为几个部分&#xff1a; 2.2 常见的预算策略&#xff08; Predicate &#xff09;&#xff1a; 2.3 常见的优选策略&#xff08;priorities&#xff09;&#xff1a; 二、定向调度&…

【Vue】内置指令

hello&#xff0c;我是小索奇&#xff0c;本章带大家掌握核心的内置指令&#xff0c;一起study吧 内置指令 v-text v-text用于将一个变量的值渲染为元素的文本内容 注意v-text只能接受字符串类型的值,对于对象类型,会调用toString()方法 与插值表达式区别就是它会替换标签中…

wpf devexpress 排序、分组、过滤数据

这个教程示范在GridControl如何排序数据&#xff0c;分组数据给一个行创建一个过滤。这个教程基于前一个教程。 排序数据 可以使用GridControl 排序数据。这个例子如下过滤数据对于Order Date 和 Customer Id 行&#xff1a; 1、对于Order Date 和 Customer Id 行指定Colum…

11_聚类算法

文章目录 1 聚类1.1 什么是聚类1.2 相似度/距离公式1.3 聚类的思想 2 K-means算法2.1 K-means算法步骤2.2 K-means算法思考2.3 K-means算法优缺点 3 解决K-Means算法对初始簇心比较敏感的问题3.1 二分K-Means算法3.2 K-Means算法3.3 K-Means||算法3.4 Canopy算法3.4.1 Canopy算…

ElasticSearch 安装(单机版本)

文章目录 ElasticSearch 安装&#xff08;单机版本&#xff09;环境配置下载安装包调整系统参数安装启动并验证 ElasticSearch 安装&#xff08;单机版本&#xff09; 此文档演示 ElasticSearch 的单机版本在 CentOS 7 环境下的安装方式以及相关的配置。 环境配置 Linux 主机一…

【电路】MOS管开关电路

目录 简介&#xff1a; MOS管导通特性 应用实例&#xff1a; MOS管的作用-开关 更好的理解方式&#xff1a; 仿真&#xff1a; 简介&#xff1a; MOS管也就是常说的场效应管&#xff08;FET&#xff09;&#xff0c;有结型场效应管、绝缘栅型场效应管&#xff08;又分为…

JVM jstat 查看内存新生代老年代回收情况,排查oom

jstat 命令 jstat - [-t] [-h] [ []] option&#xff1a;我们经常使用的选项有gc、gcutil vmid&#xff1a;java进程id interval&#xff1a;间隔时间&#xff0c;单位为毫秒 count&#xff1a;打印次数 每秒打印一次 jstat -gc 9162 1000S0C:年轻代第一个survivor的容量…

Django(七、模型层)

文章目录 模型层模型层前期准备使用django ORM要注意 代码演示&#xff1a;切换MySQL数据库如何查看django ORM 底层原理&#xff1f; 单表操作模型层之ORM常见关键字基础的增删改查常用的关键字 常见的十几种查询基于双下滑线的查询 模型层 模型层前期准备 使用django ORM要…

【汇编】mov和add指令、确定物理地址的方法、内存分段表示法

文章目录 前言一、学习汇编指令——用中学1.1 汇编指令分析汇编输出分析 二、确定物理地址的方法2.1 什么叫做物理地址2.2 8086中的物理地址2.3 8086CPU给出物理地址的方法2.4 “段地址16偏移地址物理地址”的本质含义 三、内存分段表示法3.1 用分段的方式管理内存3.2 同一段内…