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

拜读我胡哥的精品复习资料 @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函数太优雅了,就是时间复杂度太高了,但不影响代码的思想,可惜了,受算力限制,没办法将所有的思想平等的对待,下课!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(十一)Flask模板引擎jinja2

模板引擎Jinja2 一、简介及基本使用&#xff1a; Flask使用Jinja2作为默认的模板引擎。Jinja2是一个功能强大且易于使用的模板引擎&#xff0c;它允许我们在HTML中嵌入Python代码&#xff0c;并通过将模板和数据进行渲染来生成动态内容。 实战之在Flask中使用Jinja2模板引擎…

Python | 机器学习之逻辑回归

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《人工智能奇遇记》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 机器学习之逻辑回归概念 1.1 机器学习 1.2 逻辑回归 2. 逻辑回归 2.1 实验目的…

不可错过的10本架构师必读书籍,带你嗨翻架构师之路,三连评论送书!

书籍目录 一&#xff1a;书前开胃菜 二&#xff1a;高并发架构实战 三&#xff1a;架构师的自我修炼 四&#xff1a;中台架构与实现 五&#xff1a;分布式系统架构 六&#xff1a;流程自动化实战 七&#xff1a;分布式系统架构与开发 八&#xff1a;服务端开发 九&am…

代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题

130. 被围绕的区域 **题目&#xff1a;**给你一个 m x n 的矩阵 board &#xff0c;由若干字符 ‘X’ 和 ‘O’ &#xff0c;找到所有被 ‘X’ 围绕的区域&#xff0c;并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 题目链接&#xff1a;130. 被围绕的区域 解题思路&#xff1a…

基于springboot实现“漫画之家”系统项目【项目源码+论文说明】

基于springboot实现“漫画之家”系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&am…

FreeSWITCH案例跟踪之一,sip bye发不出去

报故障的说&#xff0c;网关呼叫fs&#xff0c;网关收不到fs的sip bye Wireshark看call-flow, 是这样的&#xff1a; INVITE里面的contact是<sip:172.23.4.109:5060;transporttcp> 于是Wireshark设置过滤条件为ip.addr 172.23.4.109 and tcp.port 5060 fs tcp连网关被…

提高生存能力的7个关键技巧!

作为一款备受热议和玩家喜爱的多人在线射击游戏&#xff0c;《绝地求生》中生存能力的提高是取得胜利的关键。在这篇实用干货分享中&#xff0c;我们将详细说明7个关键技巧&#xff0c;帮助你在游戏中提高生存能力&#xff0c;获得更多胜利。 1.选择降落点&#xff1a;选择适合…

make和makefile

一、认识make和Makefile 1、会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 2、一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译…

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

Windows10关闭系统自动更新

1.背景 2.步骤 第一步: 第二步: 完美

笔记本电脑没有声音?几招恢复声音流畅!

笔记本电脑已经成为我们日常生活和工作的重要工具&#xff0c;而其中的声音是其功能之一。然而&#xff0c;有时您可能会遇到笔记本电脑没有声音的问题&#xff0c;这可能是由多种原因引起的。在本文中&#xff0c;我们将深入探讨笔记本电脑没有声音的常见原因&#xff0c;并提…

jbase实现通用码表

没有通用码表的体系是不完美的&#xff0c;当年我用C#能实现的通用码表&#xff0c;现在在java一样的实现了&#xff0c;通用码表对提高开发效率和降低开发成本的作用巨大&#xff0c;开发可以专注写业务&#xff0c;而不必被太多的维护界面束缚。进而体现在产品竞争力上面&…

加密狗作用是什么?工作原理及使用方法

加密狗是一种用于软件保护的硬件设备&#xff0c;通常被用于防止软件被非法复制、篡改或者恶意使用。以下是加密狗的作用、工作原理及使用方法&#xff1a; 作用 加密狗的主要作用是提供软件保护&#xff0c;它能够通过加密算法对软件进行加密&#xff0c;以防止软件被非法复制…

从0开始学习JavaScript--JavaScript 类和模块详解

JavaScript的类和模块是现代Web开发中的重要组成部分&#xff0c;它们提供了一种更面向对象的编程方式和模块化的组织代码方式。本文将深入探讨JavaScript中类和模块的各个方面&#xff0c;并通过丰富的示例代码来帮助大家更好地理解和运用这些概念。 1. 类的基本概念与语法 …

Linux编译器:gcc/g++的使用

我们在学习编译器时&#xff0c;我们不仅要只会使用编译器&#xff0c;还要理解程序的编译过程。一个程序存在两个不同的环境。第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令&#xff1b;第2种是执行环境&#xff0c;它用于实际执行代码。本篇文章将…

Linux C 进程间通信

进程间通信 概述进程间通信方式管道概述管道函数无名管道 pipe有名管道 makefifo删除有名管道 rmove 有名管道实现 双人无序聊天 例子 信号信号概述信号处理过程信号函数传送信号给指定的进程 kill注册信号 signal查询或设置信号处理方式 sigaction设置信号传送闹钟 alarm 有名…

【ONE·Linux || 网络基础(三)】

总言 主要内容&#xff1a;HTTP和HTTPS工作方式简述。 文章目录 总言6、HTTP协议&#xff08;应用层二&#xff09;6.1、入门认识6.1.1、认识URL6.1.2、urlencode和urldecode 6.2、快速构建6.2.1、快速构建http请求和响应的报文格式6.2.2、http demo6.2.2.1、sock.hpp &&a…

vite环境变量相关

环境变量&#xff1a;根据环境的不同&#xff0c;灵活的自动读取相应的变量。避免了手动修改。 import path from path import postCssPxToRem from postcss-pxtorem import { defineConfig, loadEnv } from vite import createVitePlugins from ./vite/plugins import copy f…

【LeetCode刷题笔记】二叉树(三)

701. 二叉搜索树中的插入操作 解题思路: 1. 模拟 ,如果 根节点为空 ,就用 插入值创建根节点 直接返回。否则, cur 从 根节点 开始,比较 当前节点的值和插入值的大小关系 : 1)如果 插入值 < cur ,就

一张图系列 - “position_embedding”

关于位置编码&#xff0c;我感觉应该我需要知道点啥&#xff1f; 0、需要知道什么知识&#xff1f; multi head atten 计算 复数的常识 1、embedding 是什么&#xff1f; position embedding常识、概念&#xff0c;没有会怎样&#xff1f; 交换token位置&#xff0c;没有P…