算法设计期末复习

文章目录

      • 1. 什么是算法,算法有哪些特征,算法设计的基本步骤,算法的时间复杂度的确定
      • 2. 什么是算法分析,算法分析的主要内容是什么?怎么确定算法的时间复杂度?
      • 3. 什么是分治算法,分治算法通常用哪些步骤来实现?常用什么数据结构和对应的算法
      • 4. 什么是蛮力法,有哪些应用,能解决什么问题,要写出对应策略、算法
      • 5. 什么是回溯法,有哪些应用,能解决什么问题,要写出对应策略、算法
      • 6. 什么是分枝限界法,有哪些应用,能解决什么问题,要写出对应策略、算法
      • 7. 分枝限界法和回溯的区别?
      • 8. 01背包问题的各种解决方案
      • 9. 最优装载问题方案及相关算法
      • 10. 最优活动安排方案及相关算法
      • 11. 动态规划问题的完成最短路径及路径长度
      • 12. 什么是概率算法、有哪些分类

1. 什么是算法,算法有哪些特征,算法设计的基本步骤,算法的时间复杂度的确定

什么是算法?
算法:求解问题的一系列计算步骤,用来将输入数据转换成输出结果。

算法的特征:

  • 有穷性:算法必须在有限步骤内结束。
  • 确定性:每一步骤都有明确的定义,不会产生歧义。
  • 输入:算法有零个或多个输入。
  • 输出:算法有一个或多个输出。
  • 可行性:算法中的每一步骤都可以通过基本操作实现。

算法设计的基本步骤:

  1. 理解问题。
  2. 确定输入和输出。
  3. 设计解决问题的步骤。
  4. 验证算法的正确性。
  5. 分析算法的时间和空间复杂度。
  6. 优化算法(如果需要)。

算法的时间复杂度的确定:
时间复杂度是算法运行时间的增长率,通常用大O符号表示。它反映了算法执行时间随输入规模增长的变化趋势。例如:

  • 常数时间:O(1)
  • 线性时间:O(n)
  • 对数时间:O(log n)
  • 平方时间:O(n²)

2. 什么是算法分析,算法分析的主要内容是什么?怎么确定算法的时间复杂度?

什么是算法分析?
算法分析是对算法的时间复杂度、空间复杂度以及正确性进行评估的过程。

算法分析的主要内容:

  1. 时间复杂度:算法执行所需的时间。
  2. 空间复杂度:算法执行所需的内存空间。
  3. 正确性:算法是否能正确解决问题。
  4. 优化性:算法是否高效。

怎么确定算法的时间复杂度?

  1. 分析算法中每一步的基本操作次数。
  2. 找出最坏情况下的操作次数。
  3. 用大O符号表示时间复杂度。

例如,对于一个简单的循环:

for (int i = 0; i < n; i++) {
    cout << i << endl;
}

时间复杂度为O(n)。


3. 什么是分治算法,分治算法通常用哪些步骤来实现?常用什么数据结构和对应的算法

什么是分治算法?
分治算法是一种将问题分解为若干个子问题,分别解决后再合并结果的算法。

分治算法的步骤:

  1. 分解:将问题分解为若干个子问题。
  2. 解决:递归地解决子问题。
  3. 合并:将子问题的解合并为原问题的解。

常用的数据结构和算法:

  • 归并排序:将数组分成两部分,分别排序后再合并。
  • 快速排序:选择一个基准元素,将数组分为两部分,分别排序。
  • 二分查找:在有序数组中查找元素。

4. 什么是蛮力法,有哪些应用,能解决什么问题,要写出对应策略、算法

什么是蛮力法?
蛮力法是一种直接解决问题的方法,通常通过穷举所有可能的解来找到答案。

应用:

  • 排序(如选择排序、冒泡排序)。
  • 查找(如线性查找)。
  • 字符串匹配(如朴素字符串匹配算法)。

能解决的问题:

  • 简单问题或规模较小的问题。
  • 需要找到所有可能解的问题。

策略和算法:

  • 选择排序:
void selection_sort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int min_idx = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[min_idx]) {
                min_idx = j;
            }
        }
        swap(arr[i], arr[min_idx]);
    }
}

5. 什么是回溯法,有哪些应用,能解决什么问题,要写出对应策略、算法

什么是回溯法?
回溯法是一种通过尝试所有可能的解来解决问题的算法,当发现当前解不可行时,回退并尝试其他路径。

应用:

  • 八皇后问题。
  • 数独问题。
  • 图的遍历。

能解决的问题:

  • 组合优化问题。
  • 路径搜索问题。

策略和算法:

  • 八皇后问题:
#include <vector>
#include <string>
using namespace std;

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> result;
        vector<string> board(n, string(n, '.'));
        backtrack(result, board, 0, n);
        return result;
    }

    void backtrack(vector<vector<string>>& result, vector<string>& board, int row, int n) {
        if (row == n) {
            result.push_back(board);
            return;
        }
        for (int col = 0; col < n; col++) {
            if (is_safe(board, row, col, n)) {
                board[row][col] = 'Q';
                backtrack(result, board, row + 1, n);
                board[row][col] = '.';
            }
        }
    }

    bool is_safe(vector<string>& board, int row, int col, int n) {
        for (int i = 0; i < row; i++) {
            if (board[i][col] == 'Q') {
                return false;
            }
        }
        return true;
    }
};

6. 什么是分枝限界法,有哪些应用,能解决什么问题,要写出对应策略、算法

什么是分枝限界法?
分枝限界法是一种通过剪枝来减少搜索空间的算法,通常用于解决组合优化问题。

应用:

  • 旅行商问题。
  • 0/1背包问题。
  • 图的最短路径问题。

能解决的问题:

  • 需要找到最优解的问题。
  • 组合优化问题。

策略和算法:

  • 0/1背包问题:
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

struct Node {
    int level;
    int profit;
    int weight;
};

struct Item {
    int value;
    int weight;
};

int bound(Node node, int capacity, vector<Item>& items) {
    if (node.weight >= capacity) {
        return 0;
    }
    int profit_bound = node.profit;
    int j = node.level + 1;
    int totweight = node.weight;
    while (j < items.size() && totweight + items[j].weight <= capacity) {
        totweight += items[j].weight;
        profit_bound += items[j].value;
        j++;
    }
    if (j < items.size()) {
        profit_bound += (capacity - totweight) * items[j].value / items[j].weight;
    }
    return profit_bound;
}

int branch_and_bound(vector<Item>& items, int capacity) {
    queue<Node> q;
    Node root = {-1, 0, 0};
    q.push(root);
    int max_profit = 0;
    while (!q.empty()) {
        Node node = q.front();
        q.pop();
        if (node.level == items.size() - 1) {
            continue;
        }
        Node next_node = {node.level + 1, node.profit + items[node.level + 1].value, node.weight + items[node.level + 1].weight};
        if (next_node.weight <= capacity && next_node.profit > max_profit) {
            max_profit = next_node.profit;
        }
        if (bound(next_node, capacity, items) > max_profit) {
            q.push(next_node);
        }
        next_node = {node.level + 1, node.profit, node.weight};
        if (bound(next_node, capacity, items) > max_profit) {
            q.push(next_node);
        }
    }
    return max_profit;
}

7. 分枝限界法和回溯的区别?

  • 回溯法:通过尝试所有可能的解来解决问题,当发现当前解不可行时,回退并尝试其他路径。
  • 分枝限界法:通过剪枝来减少搜索空间,通常用于解决需要找到最优解的问题。

8. 01背包问题的各种解决方案

  • 蛮力法:穷举所有可能的组合。
  • 动态规划:
#include <vector>
#include <algorithm>
using namespace std;

int knapsack(vector<int>& weights, vector<int>& values, int capacity) {
    int n = weights.size();
    vector<vector<int>> dp(n + 1, vector<int>(capacity + 1, 0));
    for (int i = 1; i <= n; i++) {
        for (int w = 1; w <= capacity; w++) {
            if (weights[i - 1] <= w) {
                dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1]);
            } else {
                dp[i][w] = dp[i - 1][w];
            }
        }
    }
    return dp[n][capacity];
}

9. 最优装载问题方案及相关算法

  • 贪心算法:
#include <vector>
#include <algorithm>
using namespace std;

int optimal_loading(vector<int>& weights, int capacity) {
    sort(weights.begin(), weights.end());
    int total_weight = 0;
    int count = 0;
    for (int weight : weights) {
        if (total_weight + weight <= capacity) {
            total_weight += weight;
            count++;
        }
    }
    return count;
}

10. 最优活动安排方案及相关算法

  • 贪心算法:
#include <vector>
#include <algorithm>
using namespace std;

vector<pair<int, int>> activity_selection(vector<int>& start, vector<int>& finish) {
    vector<pair<int, int>> activities;
    for (int i = 0; i < start.size(); i++) {
        activities.push_back({start[i], finish[i]});
    }
    sort(activities.begin(), activities.end(), [](pair<int, int>& a, pair<int, int>& b) {
        return a.second < b.second;
    });
    vector<pair<int, int>> selected = {activities[0]};
    for (int i = 1; i < activities.size(); i++) {
        if (activities[i].first >= selected.back().second) {
            selected.push_back(activities[i]);
        }
    }
    return selected;
}

11. 动态规划问题的完成最短路径及路径长度

  • Floyd-Warshall算法:
#include <vector>
#include <algorithm>
using namespace std;

vector<vector<int>> floyd_warshall(vector<vector<int>>& graph) {
    int n = graph.size();
    vector<vector<int>> dist = graph;
    for (int k = 0; k < n; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (dist[i][k] != INT_MAX && dist[k][j] != INT_MAX) {
                    dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
                }
            }
        }
    }
    return dist;
}

12. 什么是概率算法、有哪些分类

什么是概率算法?
概率算法是一种利用随机性来解决问题的算法。

分类:

  1. 蒙特卡洛算法:可能得到错误解,但错误概率可控。
  2. 拉斯维加斯算法:不会得到错误解,但可能无法在有限时间内完成。
  3. 舍伍德算法:通过随机化来消除算法的确定性。

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

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

相关文章

单片机上电后程序不运行怎么排查问题?

1.电源检查。使用电压表测量单片机的电源电压是否正常&#xff0c;确保电压在规定的范围内&#xff0c;如常见的5V。 2.复位检查。检查复位引脚的电压是否正常&#xff0c;在单片机接通电源时&#xff0c;复位引脚通常会有一个高电平&#xff0c;按下复位按钮时&#xff0c;复位…

Linux快速入门-Linux的常用命令

Linux的常用命令 1. Linux的终端与工作区1.1 终端概述1.2 切换终端 2. Shell语言解释器2.1 Shell概述 3. 用户登录与身份切换3.1 su 命令3.2 sudo 命令 4. 文件、目录操作命令4.1 pwd 命令4.2 cd 命令4.3 ls 命令4.3.1 ls 指令叠加使用 4.4 mkdir 命令4.5 rmdir 命令4.6 cp 命令…

一区牛顿-拉夫逊算法+分解+深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测

一区牛顿-拉夫逊算法分解深度学习&#xff01;VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测 目录 一区牛顿-拉夫逊算法分解深度学习&#xff01;VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院一区…

机器学习04-为什么Relu函数

机器学习0-为什么Relu函数 文章目录 机器学习0-为什么Relu函数 [toc]1-手搓神经网络步骤总结2-为什么要用Relu函数3-进行L1正则化修改后的代码解释 4-进行L2正则化解释注意事项 5-Relu激活函数多有夸张1-细数Relu函数的5宗罪2-Relu函数5宗罪详述 6-那为什么要用这个Relu函数7-文…

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线&#xff08;易忘&#xff09; 2.打开摄像头前面的盖子&#xff08;易忘&#xff09; 3.接上直流电源&#xff0c;红线为正&#xff0c;黑线为负 4.直流电源设置电压为14v&#xff0c;电流为3.15A&#xff0c; 通…

STM32之GPIO输出与输出

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 一.GPIO输入1.1GPIP简介1.2GPIO基本结构1.3GPIO位结构1.4GPIO的八种模式1.4.1浮空/上拉/下拉输入1.4.2 模拟输入1.4.3 推挽输出\开漏输出 二.GPIO输入2.1.按键介绍2.2传感器模块介绍2.3按键电路 一.G…

动手学深度学习-多层感知机-10预测房价

目录 下载和缓存数据集 Kaggle 访问和读取数据集 数据预处理 训练 K折交叉验证 模型选择 提交Kaggle预测 小结 之前几节我们学习了一些训练深度网络的基本工具和网络正则化的技术&#xff08;如权重衰减、暂退法等&#xff09;。 本节我们将通过Kaggle比赛&#xff0c…

左神算法基础巩固--1

文章目录 时间复杂度常数时间的操作时间复杂度的定义时间复杂度的作用剖析递归行为和递归行为时间复杂度的估算 排序选择排序冒泡排序插入排序归并排序小和问题问题描述解题思路 快速排序荷兰国旗问题问题描述 堆排序堆结构大根堆小根堆 桶排序 二分二分搜索 ^的运用不用额外空…

【C++读写.xlsx文件】OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-12-17 …

汽车电子零部件(15):AVM全景影像系统

概述: 使用ADAS全景监控(AVM)精确停车和操纵。这项先进技术采用多个摄像头,提供车辆周围环境的鸟瞰图。 360度全景监控系统: 360 AVM系统可以帮助驾驶员360度查看车辆周围的情况,避免发生碰撞。360 AVM系统由一个电子控制单元(ECU)和四个摄像头组成。ECU将处理四个摄…

C语言习题2.0

C语言习题1.0 C语言习题-CSDN博客 目录 C语言习题1.0 C语言习题-CSDN博客 找一个数字的连续因子 求N个分数的和 正整数AB 函数 预处理 文件处理 操作符 找一个数字的连续因子 //找连续因子,及其个数 int main() {int a;scanf("%d", &a);int num 0; …

flask flask-socketio创建一个网页聊天应用

应用所需环境&#xff1a; python 3.11.11 其他 只需要通过这个命令即可 pip install flask3.1.0 Flask-SocketIO5.4.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 最好是用conda创建一个新的虚拟环境来验证 完整的pip list如下 Package Version ----…

重拾设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

正则表达式优化之算法和效率优化

正则表达式优化之算法和效率优化 前言 正则表达式是处理文本匹配的强大工具&#xff0c;但在实际应用中&#xff0c;如果不加以优化&#xff0c;可能会导致性能问题或匹配结果不精确。 本文将分三篇从表达式结构、算法效率和实际应用场景三个方面. 深入探讨如何优化正则表达…

workman服务端开发模式-应用开发-gateway长链接端工作原理

一、长链接的工作原理 Register类其实也是基于基础的Worker开发的。Gateway进程和BusinessWorker进程启动后分别向Register进程注册自己的通讯地址&#xff0c;Gateway进程和BusinessWorker通过Register进程得到通讯地址后&#xff0c;就可以建立起连接并通讯了。而Gateway进程…

排序算法 (插入,选择,冒泡,希尔,快速,归并,堆排序)

排序:经常在算法题中作为一个前置操作,为了之后的贪心or else做个铺垫,虽然我们经常都只是调用个sort,但是了解一些排序算法可以扩充下知识库 排序的分类: 从存储设备角度&#xff1a; ✓ 内排序&#xff1a;在排序过程中所有数据元素都在内存中&#xff1b; ✓ 外排序&a…

云途领航:现代应用架构助力企业转型新篇

在数字化转型的浪潮中&#xff0c;现代应用架构为企业带来了灵活性、效率和创新能力。各类服务模型相继出现&#xff0c;为企业提供了强有力的支持&#xff0c;助力其顺利转型。随着技术的快速发展&#xff0c;企业面临的挑战和机遇也在不断演变&#xff0c;这促使它们必须重新…

【IMU:视觉惯性SLAM系统】

视觉惯性SLAM系统简介 相机&#xff08;单目/双目/RGBD)与IMU结合起来就是视觉惯性&#xff0c;通常以单目/双目IMU为主。 IMU里面有个小芯片可以测量角速度与加速度&#xff0c;可分为6轴(6个自由度)和9轴&#xff08;9个自由度&#xff09;IMU&#xff0c;具体的关于IMU的介…

面试题整理3----nc命令的常见用法

面试题整理3----nc命令的常见用法 1. NC是什么2. NC的常用参数2.1 开启指定端口TCP监听(-l小写的L)2.2 测试端口是否能访问(-v)2.3 开启指定端口UDP监听(-u)2.4 端口扫描(-z)2.5 指定超时时间(-w)2.6 指定本地端口号连接(-p)2.7 指定的命令(-e) 1. NC是什么 nc&#xff08;Net…

ubuntu 如何重装你的apt【apt-get报错: symbol lookup error/undefined symbol】

副标题:解决error:apt-get: symbol lookup error: /lib/x86_64-linux-gnu/libapt-private.so.0.0: undefined symbol: _ZNK13pkgTagSection7FindULLENS_3KeyERKy, version APTPKG_6.0 文章目录 问题描述报错分析解决方案:重装你的apt1、查看你的ubuntu版本2、下载适配你的ap…