算法分析与设计期末考试复习

news2024/11/24 12:58:23

重点内容:

绪论:
简单的递推方程求解  1.19(1)(2) 、 教材例题  
多个函数按照阶的大小排序  1.18            

分治法:
分治法解决芯片测试问题   
计算a^n的复杂度为logn的算法(快速幂) 
分治法解决平面最近点对问题  (增加预处理) 
锦标赛算法求第二大数的步骤(链表)         
分治法S中第k小元素的归约过程      (m*)       

动态规划:
最长公共子序列问题:蛮力法和动态规划的递归方程或递推关系、动态规划的伪码(填空)、优化函数和标记函数(填空)
矩阵链的乘法问题 : 蛮力法和动态规划的递归方程或递推关系、动态规划的伪码(填空)、备忘录和标记函数(填空)
最大子段和

贪心法:4.3  4.4    4.16  4.21  
    主要设计思想、伪码、复杂度、实例求解
贪心法:活动安排问题问题实例求解、最小延迟调度问题实例求解

回溯:
(填空)回溯算法的主要设计步骤,用回溯算法解决图的m着色问题、货郎问题(TSP)
(填空)分支界限的基本下,用分支界限算法解决最大团问题、背包问题

绪论:

多个函数按照阶的大小排序

简单的递推方程求解 

大小关系:指数级>多项式级>对数多项式级>常数级

化简:

主定理

【北大公开课】  算法设计与分析 屈婉玲教授 (76p)icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Ls411W7PB/?p=16&share_source=copy_web&vd_source=7ffbd7feaeedb3d59fb21e59435a53d8

教材例题

【北大公开课】  算法设计与分析 屈婉玲教授 (76p)icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Ls411W7PB/?p=17&share_source=copy_web&vd_source=7ffbd7feaeedb3d59fb21e59435a53d8

分治法:

分治法解决芯片测试问题   

问题描述

一次测试过程:

两片都是好结果,就留一片。其他情况全丢掉

蛮力算法时间复杂度

蛮力算法的判断好坏标准(一片芯片怎么判断好坏)

n为奇数情况

n为偶数情况

结论还是不变

分治法

假设 n为偶数,将 n片芯片两两一组做 测试淘汰,剩下芯片构成子问题,进 入下一轮分组淘汰。(类似锦标赛)

分治命题正确性

时间复杂度

主定理第三种情况ヽ(ー_ー)ノ直接记吧

计算a^n的复杂度为logn的算法(快速幂) 

迭代伪码

输入:底数a,指数n

输出:计算完成的结果result

result=1; //用于存储结果

while p不为0时 do

        if p为奇数

        result =result *a        //奇数需多乘一次底数

        a=a*a;

n/=2;

递归伪码

输入:底数a,指数exponent

输出:计算完成的结果

function fastpow(a, exponent):
    if exponent == 0
        then return 1
    if exponent == 1
        then return a
    temporary <- fastpow(a, exponent/2)
    if exponent % 2 == 0
        then return (temporary  * temporary) 
    else
        return (temporary * temporary * a) 

时间复杂度

分治法解决平面最近点对问题  (增加预处理) 

伪码

直接看课吧【【北大公开课】  算法设计与分析 屈婉玲教授 (76p)】icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Ls411W7PB/?p=25&share_source=copy_web&vd_source=7ffbd7feaeedb3d59fb21e59435a53d8

未改进的算法时间复杂度

改进:增加预处理

括号里面是第几个点,比如-2(3)就是横坐标x=-2,第p3点

改进后算法的时间复杂度

锦标赛算法求第二大数的步骤(链表)         

题目描述&蛮力算法时间复杂度

锦标赛算法

伪代码

7是第二小

时间复杂度

算法比较分为两部分:第一部分是找最大元素max的比较次数,显然为n-1;第二部分是在产生max后链表中找最大所需的比较次数。

分治法S中第k小元素的归约过程      (m*)       

问题描述

简单的算法(k次最小算法 or 排序后输出)

分治算法

每一组就是一列,先排序,上面大下面小

8,7,10,4不确定大小,所以要和m*比较

伪代码 

时间复杂度

动态规划:

最长公共子序列问题:

蛮力法的时间复杂度O(n*2^{m})

#include <iostream>
#include <string>
using namespace std;

string lcs_bruteforce(const string& X, const string& Y) {
    int m = X.length();
    int n = Y.length();
    if (m == 0 || n == 0) {
        return "";
    } else if (X[m-1] == Y[n-1]) {
        return lcs_bruteforce(X.substr(0, m-1), Y.substr(0, n-1)) + X[m-1];
    } else {
        string lcs1 = lcs_bruteforce(X.substr(0, m-1), Y);
        string lcs2 = lcs_bruteforce(X, Y.substr(0, n-1));
        if (lcs1.length() > lcs2.length()) {
            return lcs1;
        } else {
            return lcs2;
        }
    }
}

int main() {
    string X = "ABCBDAB";
    string Y = "BDCAB";
    string lcs = lcs_bruteforce(X, Y);
    cout << "The longest common subsequence is: " << lcs << endl;
    return 0;
}

参考代码

动态规划的递归方程或递推关系

✨代码实现: 

【算法设计与分析MOOC-青岛大学-张公敬教授】icon-default.png?t=N7T8http:// https://www.bilibili.com/video/BV18X4y1k74c/?p=27&share_source=copy_web&vd_source=7ffbd7feaeedb3d59fb21e59435a53d8

动态规划的伪码(填空)

优化函数(填空)

X = 【1, 2, 3】, Y = 【1, 3】按照下图关系推

标记函数(填空)

b数组用来设立标记,算法结束后可以利用这些标记追踪最优解。

例子:

怎么推?
c[i][j]矩阵:

按照信息表即可推出b矩阵(数组)

 如何追踪解? 
b[i][j]为1时,对应X、Y序列第i行,j列中的元素

矩阵链的乘法问题:

蛮力法的时间复杂度\Omega(2^{2n}/{n^{\frac{3}{2}}})

动态规划的递归方程或递推关系

动态规划的伪码(填空)

递归实现:

时间复杂度

迭代实现:

备忘录(填空)

看着递推方程来填空

自己复制代码,断点调试设置变量查看吧

#include <bits/stdc++.h>
using namespace std;
//输入:矩阵链Ai…j的输入为向量P=<Pi-1,Pi,…,Pj>,其中:1<=i<=j<=n.
//输出:计算Ai…j的所需最小乘法运算次数m[i,j]和最后一次运算位置s[i,j]。
const int N = 101;
int m[N][N], s[N][N];
int a[] = {30, 35, 15, 5, 10, 20};

void MatrixChain(int a[N], int n)
{
	for(int i=1; i<=n; i++)
		m[i][i] = 0;
		
	for(int r=2; r<=n; r++)
	{
		for(int i=1; i<= n-r+1; i++)
		{
			int j = i+r-1;
			m[i][j] = m[i+1][j] + a[i-1]*a[i]*a[j];
			s[i][j] = i;
			
			for(int k=i; k<=j-1; k++)
			{
				int t = m[i][k] + m[k+1][j] + a[i-1]*a[k]*a[j];
				if(t < m[i][j])
				{
					m[i][j] = t;
					s[i][j] = k;
				}
			}
		}
	}
}

int main()
{
 	MatrixChain(a, 6);
 	cout << "The number of least multiplication operations:" << endl;
 	cout << m[1][5] << endl;
 	cout << "Position of the last operation:" << endl;
 	cout << s[1][5] << endl;
 	cout << "array s:" << endl;
 	for(int i=1; i<=5; i++)
 	{
 		for(int j=1; j<=5; j++)
 		{
 			cout << s[i][j] << ' ';
		}
		cout << endl;
	 }
 	return 0;
}

标记函数(填空)

记录k的值,k就是分割线

最大子段和

力扣(LeetCode)53.最大子数组和

蛮力算法O(n^2--n^3)

O(n^{3})

改进后O(n^{2})

分治算法O(nlogn)

思路:一路分分分,分到只有左边一个和右边一个的时候开始计算。分治区间左右两半分别求和放好(leftsum, rightsum),还有一个跨边界,把边界左边(整个数组第一个元素)和右边(整个数组最后一个元素)全加起来

分治区间:当前递归函数所计算的左右区间


代码: 

————————————————
版权声明:图片为博主原创文章摘录
链接:https://blog.csdn.net/weixin_73523694/article/details/134515793 

动态规划算法

类似前缀和思想,判断前一个数是否大于0,不是就不加,是就加,当前数+前一个数。以达到最大和的目的

时间复杂度O(n),空间复杂度O(n)

伪代码写成代码: 

int MaxInterval(vector<int> a, int len) {
	vector<int> dp(len);
	int res = -INF;
	dp[0] = a[0];
	for(int i = 1; i < len; i ++ ) {
		dp[i] = max(a[i], dp[i - 1] + a[i]);
		res = max(res, dp[i]);
	}
	return res;
}

贪心法:

4.3

最坏情况下的时间复杂度函数

主要设计思想、伪码、复杂度、实例求解 

这是一个经典的区间覆盖问题,可以通过贪心算法来解决。我们的目标是用最少的基站覆盖所有房子,且每个房子都在至少一个基站的4千米范围内。

主要设计思想

1. 贪心策略:为了覆盖最多的房子,每次选择可以覆盖尚未被覆盖的房子中最远的那个房子的位置作为新基站的位置。这样可以确保每个新基站都能覆盖最多未被覆盖的房子。
2. 迭代过程:从房子A开始,依次考虑每个房子,如果当前房子不在已有基站的覆盖范围内,则在其位置设置新的基站。
3. 覆盖检查:对于每个房子,检查是否已经在任意基站的4千米范围内。如果是,则该房子已被覆盖;如果不是,则需要在新的位置设置基站。

伪码
输入:房子距离A的列表distances[1...n]
输出:基站位置列表base_stations

初始化基站位置列表base_stations为空

对房子距离A的列表进行升序排序

for i = 1 to n do
    基站位置列表base_stations添加设置新基站位置distances[i]+4
    rightpoint <- distances[i]+8
    在房子距离A的列表distances中寻找大于rightpoint的点
end for

返回base_stations

时空复杂度分析

        时间复杂度:最坏情况下,我们需要遍历所有的房子来检查是否已经被覆盖,因此时间复杂度为O(n),其中n是房子的数量。
        空间复杂度:除了输入的距离列表,我们还需要存储基站位置列表,因此空间复杂度为O(n)。

实例求解

假设房子到A的距离分别是[0, 5, 10, 15]千米。按照上述算法:

1. 从房子A开始,设置基站1(位置0+4千米),覆盖范围[0, 8]千米。房子B(位置5千米)在覆盖范围内。
2. 房子C(位置10千米)不在覆盖范围内,设置基站2(位置10+4千米),覆盖范围[10, 18]千米。房子D(位置15千米)在覆盖范围内。

最终基站位置为[4,14]千米。

这个算法通过贪心策略确保了使用最少数量的基站来覆盖所有的房子,同时满足每个房子都在至少一个基站的4千米范围内。

4.4  

题目:

主要设计思想、伪码、复杂度、实例求解

这是一个典型的区间覆盖问题,我们可以通过贪心算法来解决这个问题。算法步骤如下

设计思想

        由于点已经按照从小到大的顺序排列,我们可以直接从最小的点开始,每次都尽可能选择包含更多未被覆盖的点的闭区间。具体步骤如下:

1. 初始化闭区间集合为空,当前覆盖的点集也为空。
2. 从未被覆盖的点中选择最小的一个作为新闭区间的左端点。
3. 向右扩展这个长度为1闭区间直到不能覆盖更多的点为止。
4. 将这个闭区间加入到闭区间集合中,记录个数和位置,并将覆盖的点标记为已覆盖。
5. 重复步骤2-4,直到所有的点都被覆盖。

伪码
输入:点集x1, x2, ....., xn
输出:闭区间集合

初始化闭区间集合S为空

for i=1 to n do
    选择未被覆盖的最小点x_i
    设置闭区间右端点right <- x_i + 1
    while x_i+1 < right do
        i <- i+1; (i++的意思)
    将[x_i, right]添加到S

end for

时空复杂度分析

        时间复杂度:算法需要遍历所有的点来确定每个闭区间,因此时间复杂度为O(n),其中n是点的数量。
        空间复杂度:除了输入的点集外,我们需要存储每个闭区间集合位置,因此空间复杂度也是O(n)。

实例求解

假设给定的点集为{1,2,3,7,8,9},按照上述算法:

  • 对于点1,2,闭区间是[1, 2]
  • 对于点3,闭区间是[3, 4]
  • 对于点7,8,闭区间是[7, 8]
  • 对于点9,闭区间是[9, 10]

最终得到的闭区间集合是{[1,2],[3,4],[7,8],[9,10]},闭区间个数4个。覆盖了所有的点。

这个算法确保了每个点都被一个长度为1的闭区间覆盖,满足了题目的要求。

4.16

主要设计思想、伪码、复杂度、实例求解

设计思想:双指针算法

算法的核心思想是利用两个指针分别遍历序列A和B。由于B是A的子序列,因此B中的每个元素都必须按顺序出现在A中。我们可以通过比较两个序列当前指针所指向的元素来检查这一点。如果B的当前元素与A的当前元素匹配,则将B的指针向前移动一位;无论是否匹配,A的指针都向前移动一位。如果B的指针移动到了序列末尾,说明B是A的子序列。

伪码:
算法4.16 IsSubsequence
输入:A、B两个序列
输出:如果B是A的子序列,输出True;否则返回False
i <- 0
j <- 0
while i < n and j < m do
        if A[i] == B[j] then
            j <- j+1
        i <- i+1

if j == m then
       Return True
else
       Return False

时空复杂度分析:

时间复杂度为O(n),因为最坏的情况下,我们需要遍历整个A序列一次。
空间复杂度为O(1),因为我们只使用了常数个辅助变量。

实例求解:

假设A = [1, 2, 3, 4, 5],B = [2, 4]。

- 初始化i = 0, j = 0。
- 比较A[0]与B[0],不匹配,i = 1。
- 比较A[1]与B[0],匹配,i = 2, j = 1。
- 比较A[2]与B[1],不匹配,i = 3。
- 比较A[3]与B[1],匹配,i = 4, j = 2。
- 此时j已经等于B的size,说明B是A的子序列。

因此,算法判断B是A的子序列是正确的。

4.21  

题目:

主要设计思想、伪码、复杂度、实例求解

设计思想:

这个问题可以通过求解所有集合的交集来找到最小的集合S,使得每个A$_{i}$至少含有S中的一个数。由于每个集合A$_{i}$是由连续的正整数构成的,我们可以通过比较相邻集合的边界来逐步缩小交集的范围,直到找到最小的满足条件的集合S。

伪码:
算法4.21 FindSmallestSet(A)
输入:n个集合A1,...,An。
输出:最小的满足条件的集合S。
对n个集合的右端点进行升序排序
for i <- 1 to n do
        选一个集合A[i]作为一个交集,加入S
        j <- i+1
        while A[j]的左断点小于当前交集右端点 do
                删除A[j]
                j <- j+1

时空复杂度分析:

时间复杂度为O(nlogn),因为需要对集合进行排序。
空间复杂度为O(n),用于存储集合S。

实例求解:

假设有集合 A1 = [1, 3],  A2 = [2, 6],  A3 = [7, 10],  A4 = [8, 9]。

- 对n个集合的右端点进行升序排序,A1,A2,A4,A3。
- 选择A1,加入S中。由于A2左端点小于A1右端点,所以删除A2
- 选择A4,加入S中。由于A3左端点小于A4右端点,所以删除A3
- 返回S = {A1, A4}作为最小集合,满足每个Ai至少含有S中的一个数。

活动安排问题实例求解

如果第二个活动的开始时间大于第一个活动的结束时间,就加入集合A

先按照起始时间排序

最小延迟调度问题实例求解

题目P91

回溯:

回溯算法的主要设计步骤

用回溯算法解决图的m着色问题

搜索策略:深度优先

时间复杂度O(nm^{n})

第一个解向量:< 1, 2, 1, 3, 1, 2, 3 >。根据对称性,只需搜索 1/3 的解空间. 当点1和点2确定, 即 以后,只有1个解,点2为根的子树中也只有1个解。由于3个子树的对称性,总共6个解。
对称性:3的地方换成2,2的地方换成3

货郎问题(TSP)旅行售货员问题

定义(题目)

解向量 & 约束条件 & 搜索空间(子结点排列规则)

【【北大公开课】  算法设计与分析 屈婉玲教授 (76p)】

太多不更了,看视频吧

分支限界

相关概念

      目标函数(极大化或极小化)

      约束条件(解满足的条件)

      可行解: 搜索空间满足约束条件的解

      最优解: 使得目标函数达到极大 (或极小)的可行解


用分支限界算法解决最大团问题

题目

代价函数

实例

来不及就直接背吧

用分支限界算法解决背包问题

题目:

代价函数

\Delta是理想情况下,每一个小空隙都装第k+1件物品。实际情况是第k+1件物品塞不满这些空隙的

分支策略:深度优先

界函数

界函数初始值0,到达橙色框后得到了更好的可行解,就更新界函数的值为12。
之后的深度搜索中,当代价函数大于界函数时,继续向下搜索。当代价函数小于界函数时,就可以停止向前了,因为往下也得不到更好的,这已经是下面的叶子结点中最大的一个代价函数值

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

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

相关文章

基于遗传优化算法的风力机位置布局matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的风力机位置布局matlab仿真&#xff0c;风力机位置布局优化是风能转换系统设计中的一个重要环节&#xff0c;旨在最大化风场的整体发电效率。仿…

数字芯片——时钟与复位

关于此次章节我想要探讨的问题是门控时钟的处理&#xff08;Clock Gating Methodology&#xff09;和时钟复位策略。在低功耗设计中&#xff0c;门控时钟是结构最简洁&#xff0c;最容易实现的电路结构。如上期所讲的&#xff0c;一个控制信号和时钟逻辑与在一起输出的信号作用…

redis设计与实现(四)服务器中的数据库

服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态server.h结构的db数组中&#xff0c;db数组的每个项都是一个redis.h/redisDb结构&#xff0c;每个redisDb结构代表一个数据库。 在初始化服务器时&#xff0c;程序会根据服务器状态的dbnum属性来决定应该创建多少…

产品人生(12):从“产品生命周期管理”看如何做“职业规划”

产品生命周期管理是产品人常接触的一个概念&#xff0c;它是一种全面管理产品从概念构想、设计开发、生产制造、市场推广、销售使用&#xff0c;直至最终退役的全生命周期过程的方法论和一系列业务流程。下面我们来简单介绍下产品生命周期管理&#xff1a; 概念阶段&#xff1a…

C++ | Leetcode C++题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:void addPath(vector<int> &vec, TreeNode *node) {int count 0;while (node ! nullptr) {count;vec.emplace_back(node->val);node node->right;}reverse(vec.end() - count, vec.end());}vect…

【全开源】多平台租房系统源码(Fastadmin+ThinkPHP+Uniapp)

&#x1f3e0;多平台租房系统&#xff1a;一站式租房新体验&#x1f50d; &#x1f310;一、引言&#xff1a;租房市场的变革 在快节奏的现代生活中&#xff0c;租房已成为许多人解决居住问题的首选。然而&#xff0c;传统的租房方式往往繁琐且效率低下。随着互联网的飞速发展…

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载)

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载) iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Sequoia/&a…

全方位·多层次·智能化,漫途水库大坝安全监测方案

党的十九届五中全会提出&#xff0c;到2025年前&#xff0c;完成新出现病险水库的除险加固&#xff0c;配套完善重点小型水库雨水情和安全监测设施&#xff0c;实现水库安全鉴定和除险加固常态化。 加快推进小型水库除险加固。加快构建气象卫星和测雨雷达、雨量站、水文站组成…

GIS之arcgis系列10:arcpy实现批量掩膜提取

按掩膜提取 (Spatial Analyst) 提取掩膜所定义区域内的相应栅格像元。 OutRas ExtractByMask(InRas1, InMsk1, "INSIDE") 使用情况 输入栅格中的其他属性&#xff08;若有的话&#xff09;将按照原样添加到输出栅格属性表。 根据所记录的属性&#xff0c;某些属性…

Golang | Leetcode Golang题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; func reverse(a []int) {for i, n : 0, len(a); i < n/2; i {a[i], a[n-1-i] a[n-1-i], a[i]} }func postorderTraversal(root *TreeNode) (res []int) {addPath : func(node *TreeNode) {resSize : len(res)for ; node ! nil; node n…

STM32—U8g2图形库练习

一、新建CubeMX工程 1.照例将RCC配置为外部高速晶振&#xff08;精度更高&#xff09;——HSE&#xff1b;将SYS的Debug设置成Serial Wire&#xff08;否则可能导致芯片自锁)&#xff1b; 2.配置I2C2作为OLED的通讯方式。 3.TIM1配置&#xff1a;U8g2图形库需要us级延迟推动&…

uniapp地图选择位置

直接上代码 通过一个点击事件调用官方api即可调用 点击调用成功后显示如下 然后选择自己所需要的位置即可

Mssql数据注入

1.查询用户创建的数据表 select id,name from sysobjects where xtypeu ; 2.查询用户创建数据表的具体列名 select * from syscolumns where id 上一步获取的id值; 3.查询具体内容 select id,字段名 from 数据表名&#xff1b; 4.数据库名 db_name() 5.用户登录名 su…

使用Ollama简单部署本地Qwen2

Ollama 是一个开源的、本地运行的 AI 聊天模型&#xff0c;允许在自己的设备上运行 LLM&#xff0c;无需依赖云服务。它支持多种 LLM。目前Ollama library已经支持Qwen2&#xff0c;可以直接使用。 首先安装ollama&#xff0c; 访问官网 下载 ollama 对应版本 Download Ollama…

数字时代网络安全即服务的兴起

在日益数字化的世界里&#xff0c;威胁形势不断演变&#xff0c;网络攻击变得越来越复杂和频繁。当组织努力保护敏感数据并保持运营完整性时&#xff0c;传统的网络安全措施往往不够。 这为更具动态性和可扩展性的解决方案铺平了道路&#xff1a;网络安全即服务 (CSaaS)。网络…

Vitis HLS 学习笔记--矢量数据类型

目录 1. 简介 2. 用法详解 2.1 存储器布局 2.2 示例展示 2.3 综合报告 3. 总结 1. 简介 在 Vitis HLS 中&#xff0c;矢量数据类型是一种特殊的数据类型&#xff0c;它允许你一次处理多个数据元素&#xff0c;就像一排并排的盒子&#xff0c;每个盒子里都装着一个数据元…

大模型基础——从零实现一个Transformer(3)

大模型基础——从零实现一个Transformer(1)-CSDN博客 一、前言 之前两篇文章已经讲了Transformer的Embedding,Tokenizer,Attention,Position Encoding, 本文我们继续了解Transformer中剩下的其他组件. 二、归一化 2.1 Layer Normalization layerNorm是针对序列数据提出的一种…

基于STM32移植U8g2图形库——OLED显示(HAL库)

文章目录 一、U8g2简介1、特点2、U8g2的使用步骤 二、I2C相关介绍1、I2C的基本原理2、I2C的时序协议 三、OLED屏的工作原理四、汉字点阵显示原理五、建立STM32CubeMX工程六、U8g2移植1、U8g2源码2、移植过程 七、代码编写1、参考博主实现的U82G的demo例程&#xff08;1&#xf…

VMware Workerstation开启虚拟机后,产生乱码名称日志文件

问题情况 如下图所示&#xff0c;我的虚拟机版本是16.1.2版本&#xff0c;每次在启动虚拟机之后&#xff0c;D盘目录下都会产生一个如图下所示的乱码名称文件。同时&#xff0c;虚拟机文件目录也是杂乱不堪&#xff0c;没有按照一台虚拟机对应一个文件夹的形式存在。 问题处理…

笔记 | 软件工程06-1:软件设计-软件设计基础

1 软件设计概述 1.1 为什么要软件设计 1.2 何为软件设计 何为软件系统的解决方案&#xff1f; 软件设计关注与软件需求的实现问题软件设计是需求分析和软件实现间的桥梁 1.3 软件设计的质量要求 1.4 软件设计的过程 1.4.1 软件体系结构设计 1.4.2 用户界面设计 1.4.3 软件详细…