代码随想录算法训练营第三十天 | 航班问题、二维回溯

news2024/11/15 12:00:31

回溯法小结

本周小结!(回溯算法系列三) | 代码随想录 (programmercarl.com)

性能分析

子集问题分析:

  • 时间复杂度:O(n × 2n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2n),构造每一组子集都需要填进数组,又有需要O(n),最终时间复杂度:O(n × 2^n)。
  • 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n)。

排列问题分析:

  • 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * … 1 = n!。每个叶子节点都会有一个构造全排列填进数组的操作(对应的代码:result.push_back(path)),该操作的复杂度为O(n)。所以,最终时间复杂度为:n * n!,简化为O(n!)。
  • 空间复杂度:O(n),和子集问题同理。

组合问题分析:

  • 时间复杂度:O(n × 2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。
  • 空间复杂度:O(n),和子集问题同理。

一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!

回溯算法去重问题的另一种写法

代码随想录 (programmercarl.com)

332.重新安排行程

文档讲解:代码随想录 (programmercarl.com)

视频讲解:无

状态:没做出来。

思路

这道题目有几个难点:

  1. 一个行程中,如果航班处理不好容易变成一个圈,成为死循环
  2. 有多种解法,字母序靠前排在前面,让很多同学望而退步,如何该记录映射关系呢 ?
  3. 使用回溯法(也可以说深搜) 的话,那么终止条件是什么呢?
  4. 搜索的过程中,如何遍历一个机场所对应的所有机场。

如何理解死循环

举一个有重复机场的例子:

在这里插入图片描述

所以,出发机场和到达机场也会重复的,如果在解题的过程中没有对集合元素处理好,就会死循环。

记录映射关系

题目说“有多种解法,字母序靠前排在前面”,那么,如何记录映射关系呢?

一个机场可以到达多个机场,机场之间要靠字母序排列。一个机场到达“多个机场”,可以使用unordered_map,如果让“多个机场”之间再有顺序的话,就是用map 或者multimap 或者 multiset

这样存放映射关系可以定义为

unordered_map<string, multiset> targets:unordered_map<出发机场, 到达机场的集合> targets

unordered_map<string, map<string, int>> targets:unordered_map<出发机场, map<到达机场, 航班次数>> targets

这两个结构,我选择了后者,因为如果使用unordered_map<string, multiset<string>> targets 遍历multiset的时候,不能删除元素,一旦删除元素,迭代器就失效了。

再说一下为什么一定要增删元素呢,正如开篇我给出的图中所示,出发机场和到达机场是会重复的,搜索的过程没及时删除目的机场就会死循环。

所以搜索的过程中就是要不断的删multiset里的元素,那么推荐使用unordered_map<string, map<string, int>> targets

在遍历 unordered_map<出发机场, map<到达机场, 航班次数>> targets的过程中,可以使用"航班次数"这个字段的数字做相应的增减,来标记到达机场是否使用过了。

如果“航班次数”大于零,说明目的地还可以飞,如果“航班次数”等于零说明目的地不能飞了,而不用对集合做删除元素或者增加元素的操作。相当于说我不删,我就做一个标记!

eg.以输入:[[“JFK”, “KUL”], [“JFK”, “NRT”], [“NRT”, “JFK”]为例,抽象为树形结构如下:

在这里插入图片描述

回溯三部曲

  1. 递归函数参数

    使用unordered_map<string, map<string, int>> targets; 来记录航班的映射关系,我定义为全局变量。

    参数里还需要ticketNum,表示有多少个航班(终止条件会用上)。因为tickets已经预处理完存到targets里,无法用tickets.size()了,只能用ticketNum标记。

    由于map<string, int>已经对string排序了,所以只要找到第一条路径,就是想要的【字典排序返回最小的结果】,然后就不用继续搜了。所以找到第一条路径上的每个机场存放到vector<string> path中。

    vector<string> path;
    unordered_map<string, map<string, int>> targets;
    bool backtracking(int ticketNum){
    

    **注意函数返回值我用的是bool!**因为我们只需要找到一个行程,就是在树形结构中唯一的一条通向叶子节点的路线,所以找到了这个叶子节点了直接返回。

    当然本题的targets和path都需要初始化,代码如下:

    // 记录映射关系
    for(vector<string> vec: tickets){   //预处理tickets到targets中
        targets[vec[0]][vec[1]]++;  //vec[0]到vec[1]的航班次数+1
    }
    path.push_back("JFK");  //题目说了肯定从JFK开始
    
  2. 递归终止条件

    拿题目中的示例为例,输入: [[“MUC”, “LHR”], [“JFK”, “MUC”], [“SFO”, “SJC”], [“LHR”, “SFO”]] ,这是有4个航班,那么只要找出一种行程,行程里的机场个数是5就可以了。

    所以终止条件是:我们回溯遍历的过程中,遇到的机场个数,如果达到了(航班数量+1),那么我们就找到了一个行程,把所有航班串在一起了。

    if(path.size() == ticketNum + 1){   
        return true;
    }
    

    到叶子节点不必搜集结果,因为在如下单层搜索的逻辑中result就添加元素了。

  3. 单层搜索的逻辑

    //path[path.size() - 1]表示path的最后一个元素,也就是航行上的当前机场
    //targets[path[path.size() - 1]]表示当前机场可以到达的目的地
    //!注意pair<const string, int>& target不能写出pair<string,int> target,如果没加引用,就会变成复制一份了,从而没修改到全局变量
    for(pair<const string, int>& target : targets[path[path.size() - 1]]){
        if(target.second > 0){  //如果可以还没被用完,也就是说可以飞
            path.push_back(target.first);
            target.second--;
            if(backtracking(ticketNum)) return true; //只要找到第一条路径,就是想要的【字典排序返回最小的结果】,然后就不用继续搜
            target.second++;
            path.pop_back();
        }
    }
    

    整体代码如下

    class Solution {
    public:
        vector<string> path;
        unordered_map<string, map<string, int>> targets;
        //因为tickets已经预处理完存到targets里,无法用tickets.size()了,只能用ticketNum标记
        //由于map<string, int>已经对string排序了,所以只要找到第一条路径,就是想要的【字典排序返回最小的结果】,然后就不用继续搜了,所以该函数用bool返回
        bool backtracking(int ticketNum){   //递归过程中形参值不变
            if(path.size() == ticketNum + 1){   
                return true;
            }
    
            //path[path.size() - 1]表示path的最后一个元素,也就是航行上的当前机场
            //targets[path[path.size() - 1]]表示当前机场可以到达的目的地
            //!注意pair<const string, int>& target不能写出pair<string,int> target,如果没加引用,就会变成复制一份了,从而没修改到全局变量
            for(pair<const string, int>& target : targets[path[path.size() - 1]]){
                if(target.second > 0){  //如果可以还没被用完,也就是说可以飞
                    path.push_back(target.first);
                    target.second--;
                    if(backtracking(ticketNum)) return true; //只要找到第一条路径,就是想要的【字典排序返回最小的结果】,然后就不用继续搜
                    target.second++;
                    path.pop_back();
                }
            }
            return false;
        }
        vector<string> findItinerary(vector<vector<string>>& tickets) {
            for(vector<string> vec: tickets){   //预处理tickets到targets中
                targets[vec[0]][vec[1]]++;  //vec[0]到vec[1]的航班次数+1
            }
            path.push_back("JFK");  //题目说了肯定从JFK开始
            backtracking(tickets.size());
            return path;
        }
    };
    

51. N皇后

文档讲解:https://programmercarl.com/0051.N%E7%9A%87%E5%90%8E.html#%E6%80%BB%E7%BB%93

视频讲解:这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后_哔哩哔哩_bilibili

状态:能直接写出来。

思路

棋盘的宽度就是for循环的长度,递归的深度就是棋盘的高度,这样就可以套进回溯法的模板里了

搜索皇后的位置,可以抽象为一棵树。下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一棵树,如图:

在这里插入图片描述

可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了

回溯三部曲

  1. 递归函数参数

    定义全局变量二维数组result来记录最终结果。参数n是棋盘的大小。

    因为path已经被初始化为n x n的’.'了,故无法用path.size()作为递归出口,只能用row来记录当前遍历到棋盘的第几层

    因为path要初始化为’.',需要用到n,所以无法用全局实现,只能作为参数。

    vector<vector<string>> result;
    void backtracking(int n, vector<string>& path, int row)
    
  2. 递归终止条件

    当递归到棋盘最底层(也就是叶子节点)的时候,就可以收集结果并返回了。

    if(row == n){   //到了row的索引为n的行,物理上为第n+1行
        result.push_back(path);
        return;
    }
    
  3. 单层搜索的逻辑

    递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。

    每次都是要从新的一行的起始位置开始搜,所以都是从0开始。

    for(int i = 0; i < n; ++i){ //当前行的第i列
        if(isValid(path, row, i, n)){  //在第row行第i列插入棋子合法
            path[row][i] = 'Q';
            ++row;
            backtracking(n ,path, row);
            --row;
            path[row][i] = '.';
        }
    }
    
  4. 验证棋盘是否合法

    按照如下标准去重:

    • 不能同行
    • 不能同列
    • 不能同斜线 (45度和135度角)

    为什么没有在同行进行检查呢?

    因为在单层搜索的过程中,每一层递归,只会选for循环(也就是同一行)里的一个元素,所以不用去重了

    bool isValid(vector<string>& path, int row, int col, int n){
        //若同一列有棋子,则不合法
        for(int i = row - 1; i >= 0; --i){  
            if(path[i][col] == 'Q') return false; 
        }
        //若左上角斜线有棋子,则不合法
        int i = row - 1, j = col - 1;
        while(i >= 0 && j >= 0){
            if(path[i][j] == 'Q') return false;
            --i; --j;
        }
        //若右上角斜线有棋子,则不合法
        i = row - 1; j = col + 1;
        while(i >= 0 && j < n){
            if(path[i][j] == 'Q') return false;
            --i; ++j;
        }
        return true;
    }
    

    我写的整体代码

    class Solution {
    public:
        vector<vector<string>> result;
        bool isValid(vector<string>& path, int row, int col, int n){
            //若同一列有棋子,则不合法
            for(int i = row - 1; i >= 0; --i){  
                if(path[i][col] == 'Q') return false; 
            }
            //若左上角斜线有棋子,则不合法
            int i = row - 1, j = col - 1;
            while(i >= 0 && j >= 0){
                if(path[i][j] == 'Q') return false;
                --i; --j;
            }
            //若右上角斜线有棋子,则不合法
            i = row - 1; j = col + 1;
            while(i >= 0 && j < n){
                if(path[i][j] == 'Q') return false;
                --i; ++j;
            }
            return true;
        }
    
        //因为path要初始化为'.',需要用到n,所以无法用全局实现,只能作为参数;
        //因为path已经初始化为n*n,故无法用path.size()作为递归出口,只能用形参row表示当前递归到第几行
        void backtracking(int n, vector<string>& path, int row){ 
            if(row == n){   //到了row的索引为n的行,物理上为第n+1行
                result.push_back(path);
                return;
            }
    
            for(int i = 0; i < n; ++i){ //当前行的第i列
                if(isValid(path, row, i, n)){  //在第row行第i列插入棋子合法
                    path[row][i] = 'Q';
                    ++row;
                    backtracking(n ,path, row);
                    --row;
                    path[row][i] = '.';
                }
            }
        }
        
        vector<vector<string>> solveNQueens(int n) {
            vector<string> path(n, string(n, '.'));
            backtracking(n, path, 0);
            return result;
        }
    };
    

37. 解数独

文档讲解:代码随想录 (programmercarl.com)

视频讲解:回溯算法二维递归?解数独不过如此!| LeetCode:37. 解数独_哔哩哔哩_bilibili

状态:不会做。

思路

先写两层for循环,从而能够遍历表格里所有格子。对于每个格子,用递归来实现遍历1-9,判断每个当前数字是否合法,如果合法,就填入,然后继续递归,只要找到一组符合的结果就返回,因此回溯函数需要返回bool。

判断当前格子所在的九宫格需要小技巧:

int startRow = (row / 3) * 3; //!当前位置所在九宫格的起始行
int startCol = (col / 3) * 3; //!当前位置所在九宫格的起始列

本题中棋盘的每一个位置都要放一个数字(而N皇后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深。因为这个树形结构太大了,我抽取一部分,如图所示:

在这里插入图片描述

回溯三部曲

  1. 递归函数以及参数

    递归函数的返回值需要是bool类型,为什么呢?

    因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值。

    bool backtracking(vector<vector<char>>& board)
    
  2. 递归终止条件

    本题递归不用终止条件,解数独是要遍历整个树形结构寻找可能的叶子节点就立刻返回。

    **不用终止条件会不会死循环?**递归的下一层的棋盘一定比上一层的棋盘多一个数,等数填满了棋盘自然就终止(填满当然好了,说明找到结果了),所以不需要终止条件!

    **那么有没有永远填不满的情况呢?**这个问题我在递归单层搜索逻辑里再来讲!

  3. 递归单层搜索逻辑

    在树形图中可以看出我们需要的是一个二维的递归(也就是两个for循环嵌套着递归)

    一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!

    bool backtracking(vector<vector<char>>& board) {
        for (int i = 0; i < board.size(); i++) {        // 遍历行
            for (int j = 0; j < board[0].size(); j++) { // 遍历列
                if (board[i][j] != '.') continue;
                for (char k = '1'; k <= '9'; k++) {     // (i, j) 这个位置放k是否合适
                    if (isValid(i, j, k, board)) {
                        board[i][j] = k;                // 放置k
                        if (backtracking(board)) return true; // 如果找到合适一组立刻返回
                        board[i][j] = '.';              // 回溯,撤销k
                    }
                }
                return false;                           // 9个数都试完了,都不行,那么就返回false
            }
        }
        return true; // 遍历完没有返回false,说明找到了合适棋盘位置了
    }
    

注意这里return false的地方,这里放return false 是有讲究的

​ 因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!

​ 那么会直接返回, 这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!

  • 判断棋盘是否合法

    判断棋盘是否合法有如下三个维度:

    • 同行是否重复

    • 同列是否重复

    • 9宫格里是否重复

      bool isValid(int row, int col, char val, vector<vector<char>>& board) {
          for (int i = 0; i < 9; i++) { // 判断行里是否重复
              if (board[row][i] == val) {
                  return false;
              }
          }
          for (int j = 0; j < 9; j++) { // 判断列里是否重复
              if (board[j][col] == val) {
                  return false;
              }
          }
          int startRow = (row / 3) * 3;
          int startCol = (col / 3) * 3;
          for (int i = startRow; i < startRow + 3; i++) { // 判断9方格里是否重复
              for (int j = startCol; j < startCol + 3; j++) {
                  if (board[i][j] == val ) {
                      return false;
                  }
              }
          }
          return true;
      }
      

整体代码

class Solution {
public:
    bool isValid(int row, int col, char val, vector<vector<char>>& board){
        for(int i = 0; i < 9; ++i){ //判断当前行是否合法
            if(board[row][i] == val) return false;
        }
        for(int j = 0; j < 9; ++j){ //判断当前列是否合法
            if(board[j][col] == val) return false;
        }
        //判断当前九宫格内是否合法
        int startRow = (row / 3) * 3; //!当前位置所在九宫格的起始行
        int startCol = (col / 3) * 3; //!当前位置所在九宫格的起始列
        for(int i = startRow; i < startRow + 3; ++i){
            for(int j = startCol; j < startCol + 3; ++j){
                if(board[i][j] == val) return false;
            }
        }
        return true;
    }
    bool backtracking(vector<vector<char>>& board){
        for(int i = 0; i < board.size(); ++i){  //这两个for循环嵌套是为了遍历所有格子,让每个格子都能递归到0-9
            for(int j = 0; j < board[0].size(); ++j){
                if(board[i][j] != '.') continue;

                for(char k = '1'; k <= '9'; ++k){
                    if(isValid(i, j, k, board)){    //如果合法,就放入数字
                        board[i][j] = k;
                        if(backtracking(board)) return true;    //只要在填满空格时找到第一组符合的结果,就不必再往下找了,因为结果存放在board上,如果继续往下找,可能找不到,同时也破坏了存放的结果board
                        board[i][j] = '.';
                    }
                }

                return false;//如果某个格子把0-9都试完了,都不合法,说明没必要继续填后面的格子了,已经找不到了
            }
        }
        return true;//遍历完所有格子没返回false,说明当前合法
    }
    void solveSudoku(vector<vector<char>>& board) {
        backtracking(board);
    }
};

回溯法大总结

代码随想录 (programmercarl.com)

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

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

相关文章

蚁群算法-车辆配载率的路径优化

车辆配送路径优化问题可描述为&#xff1a;某商超配送中心要使用一定数量的车辆对一批货物进行配送服务&#xff0c;要求在不超过车辆的额定载重量和额定容积的条件下&#xff0c;安排这些货物的装载&#xff0c;使得车辆利用率最高。 针对以上问题做出假设&#xff1a; (1) 只…

Python学习笔记(1)

《Python编程&#xff1a;从入门到实践》学习笔记 python编程软件PyCharm Community Edition 2022.3.2&#xff0c;快捷键&#xff1a;Ctrl/ 表示注释Python代码。 一、变量的命名和使用 1.变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头&#xff0c;但不能以数…

Java开发初学者实用网站

1.慕课网&#xff08;http://www.imooc.com&#xff09;&#xff1a;提供了大量的Java在线教程和视频。 优点 1.广泛的开放性&#xff1a;大规模、开放性和受众广 2.透明性&#xff1a;根据不同兴趣、准备情况和时间来学习所需课程 3.优质资源易获取性&#xff1a;让每位学生…

Python每日一练(20230504)

目录 1. 课程表 Course Schedule I 2. 课程表 Course Schedule II &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 课程表 Course Schedule I 你这个学期必须选修 numCourses 门课程&a…

linux ll命令是什么

ll并不是linux下一个基本的命令&#xff0c;它实际上是ls -l的一个别名。 # 查看指定目录下的内容&#xff0c;默认查看当前目录下内容 ls [-ald] [目录名] # 目录名不填写&#xff0c;默认为当前目录。 # -a&#xff1a;列出的全部的文件&#xff0c;包括隐藏文件 # -l&#x…

医院PACS系统源码,各种类型图像专业的图像处理功能,海量数据存储与检索

RIS/PACS系统源码 RIS/PACS系统源码在预约登记、分诊叫号、技师检查、诊断报告、临床浏览、科室管理等环节满足全院相关科室的要求。在医学影像下载、浏览、处理中满足速度快、强化常用功能、方便阅片等要求。满足放射、超声、内镜、病理等影像科室的业务需求。通过与HIS、LIS…

阿里云AMD服务器CPU:AMD EPYC Genoa 9T34处理器性能

阿里云AMD服务器AMD EPYC Genoa 9T34处理器&#xff0c;主频3.4 GHz&#xff0c;单核睿频最高3.75 GHz&#xff0c;计算性能稳定&#xff0c;阿里云百科分享AMD EPYC™ Genoa 9T34性能测评&#xff1a; 目录 AMD EPYC™ Genoa 9T34 AMD EPYC™ Genoa 9T34 阿里云AMD服务器性…

基于YOLOv4的目标检测系统(附MATLAB代码+GUI实现)

摘要&#xff1a;本文介绍了一种MATLAB实现的目标检测系统代码&#xff0c;采用 YOLOv4 检测网络作为核心模型&#xff0c;用于训练和检测各种任务下的目标&#xff0c;并在GUI界面中对各种目标检测结果可视化。文章详细介绍了YOLOv4的实现过程&#xff0c;包括算法原理、MATLA…

Windows中批量修改DNS记录

最近由于公网映射的IP需要更换&#xff0c;有一批DNS记录需要修改。对于使用Windows管理的DNS记录&#xff0c;可以使用Powershell批量导出记录更新后再批量修改。 首先使用Powershell将DNS服务器上test.local这个区域里的所有A记录导出 Get-DnsServerResourceRecord -Comput…

计算机专业大一的一些学习规划建议!

大家好&#xff0c;我是小北。 五一嗖的一下就过啦~ 对于还在上学的同学五一一过基本上意味着这学期过半了&#xff0c;很多大一、大二的同学会有专业分流、转专业等事情。 尤其是大二的时候&#xff0c;你会发现身边有些同学都加入各种实验室了&#xff0c;有忙着打ACM、学生…

初级算法-贪心算法

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-贪心算法 一、分发饼干二、摆动序列三、最大子序和四、买卖股票最佳时机五、跳跃游戏六、跳跃游戏二七、k次取反后最大化的数组和八、加油站九、分发糖果十、柠檬水找零十一、根据身高重建…

Python实现哈里斯鹰优化算法(HHO)优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

SPSS如何检验非参数之案例实训?

文章目录 0.引言1.卡方检验2.二项检验3.双独立样本检验4.多独立样本检验5.双配对样本检验6.多配对样本检验7.游程检验8.单样本K-S检验 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结…

文献集锦 | 非因空间多组学技术在胰腺癌肿瘤微环境中的研究策略

胰腺导管腺癌(PDAC)仍然是一种难治性疾病&#xff0c;5年总生存率&#xff08;OS&#xff09;仅不到9%&#xff0c;且诊断时多为晚期&#xff0c;治疗手段有限&#xff0c;除了传统的手术切除、放化疗之外&#xff0c;目前越来越多采用新辅助治疗的方法。利用空间组学分析平台深…

报错yarn create @umijs/umi-app Command failed, 文件名、目录名或卷标语法不正确

报错内容&#xff1a; 报错解决&#xff1a; 方法一&#xff1a; 1、我是用 npm 安装的 yarn &#xff1a; npm i yarn tyarn -g 2、我重新设定了 npm 全局包的安装位置 和 缓存位置。 // 查看 npm 全局包的安装位置 npm config get prefix // 查看 npm 缓存位置 npm co…

DTC 2023 | GBASE:构筑完备产品体系 释放数据全量价值

2023年4月7-8日&#xff0c;第十二届『数据技术嘉年华』(DTC 2023) 在京盛大召开。GBASE南大通用受邀参会&#xff0c;携核心产品亮相展区&#xff0c;并就数据库热门话题发表主题分享。 本届大会以“开源融合数字化——引领数据技术发展&#xff0c;释放数据要素价值”为议题…

mvn help:effective-pom命令的作用

无论 POM 文件中是否显示的声明&#xff0c;所有的 POM 均继承自一个父 POM&#xff0c;这个父 POM 被称为 Super POM。在pom的继承关系中&#xff0c;子pom可以覆盖父pom中的配置&#xff1b;如果子pom没有覆盖&#xff0c;那么父pom中的配置将会被继承。按照这个规则&#xf…

lammps教程:斜交转正交的方法

大家好&#xff0c;我是小马老师。 本文介绍lammps斜交模型转正交模型的方法。 多数晶体的模型都能在网上下载到对应的cif文件&#xff0c;但很多cif文件初始结构不是正交的&#xff0c;如sio2的初始结构&#xff1a; 对这种结构进行扩胞后&#xff0c;得到的模型也是一个斜交…

计组唐书第八章CPU部分课后习题

参考文章 计算机组成原理&#xff08;第三版&#xff09;唐朔飞-第八章CPU的结构和功能-课后习题_计算机组成原理唐朔飞课后题答案_蓝净云的博客-CSDN博客 本文是对计算机组成原理的课后题再解析。 8.1CPU有哪些功能?画出其结构框图并简要说明每个部件的作用。 容易忘掉中…

openEuler之上的K3s ARM64集群管理

K3s是CNCF认证的轻量级Kubernetes发行版&#xff0c;在全球拥有广泛的安装量&#xff0c;主要由SUSE工程师在开源社区维护。K3s除了可以单独部署外&#xff0c;也可以通过Kubernetes管理软件Rancher进行管理。SUSE中国团队与欧拉社区合作&#xff0c;以RFO SIG协作方式推动Ranc…