【数据结构】算法、时间复杂度和空间复杂度详解 ------ 算法篇

文章目录

  • 📋前言
  • 一. ⛳️算法的定义
  • 二. ⛳️算法的特性
    • 2.1 输入输出
    • 2.2 输入输出
    • 2.3 有穷性
    • 2.4 确定性
    • 2.5 可行性
  • 三. ⛳️算法设计要求
    • 3.1 正确性
    • 3.2 可读性
    • 3.2 健壮性
    • 3.3 时间效率高和存储量低
  • 四. ⛳️算法效率的度量方法
    • 4.1 事后统计方法
    • 4.2 事前分析估算方法
  • 五. ⛳️算法的复杂度
    • 5.1 算法的复杂度的简单介绍
    • 5.2 算法复杂度在面试中考察
  • 六. ⛳️算法的时间复杂度(重点)
    • 6.1 算法的时间复杂度定义
    • 6.2 大O的渐进表示法
    • 6.3 常见的时间复杂度
    • 6.4 最好情况、最坏情况与平均情况
    • 6.5 常见时间复杂度计算举例
  • 七. ⛳️算法的空间复杂度
    • 7.1 算法空间复杂度的定义
    • 7.2 常见空间复杂度计算举例
  • 八. ⛳️总结


📋前言

🏠 个人主页:@聆风吟的个人主页

🔥系列专栏:本期文章收录在《数据结构初阶》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!

📝作者留言:文章创作不易,可能会有些地方出现错误,还希望广大读者们能够帮忙指出,让我们大家一起共同进步。
⏰寄语:少年有梦不应止于心动,更要付诸行动。
☀️欢迎大家关注🔍点赞👍收藏⭐️留言📝



一. ⛳️算法的定义

    算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作



二. ⛳️算法的特性

    算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。

2.1 输入输出

    算法具有零个或多个输入,尽管对于大多数算法来说,输入参数都是有必要的,但对于个别情况,如打印"hello world!"这样的代码,不需要任何输入参数,因此算法的输入可以是零个。

2.2 输入输出

    算法至少有一个或多个输出,算法是一定需要输出的,不需要输出,你用这个算法干嘛呢?输出的形式可以打印输出,也可以是返回一个或多个值等。

2.3 有穷性

    有穷性:是指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤都在可接受的时间内完成

2.4 确定性

    确定性:算法的每一步骤都具有确定的含义,不会出现二义性。算法在一定条件下,只有一条执行的路径,相同的输入只能有唯一的输出结果。算法的每一步骤都被精确定义而无歧义。

2.5 可行性

    可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成



三. ⛳️算法设计要求

    算法不是唯一的。也就是说,解决同一个问题,可以有多种解决问题的算法。通常为了设计一个 “好” 的算法应考虑达到一下目标:
在这里插入图片描述

3.1 正确性

    正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性,能够得到问题的正确答案。但是算法的 “ 正确 ” 一词在用法上通常有很大差别,大体分为一下四个层次:

  1. 算法程序没有语法错误;
  2. 算法程序对于合法的输入数据能够产生满足要求的输入结果;
  3. 算法程序对于非法的输入数据能够得出满足规格说明的结果;
  4. 算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。

对于这四层含义,层次 1的要求最低,但仅仅没有语法错误实在谈不上是好算法。这就是如同仅仅解决温饱,不算是生活幸福一样。而层次 4是最难实现的,我们几乎不可能逐一验证所有的输入都得到正确的结果。所以一般情况下,我们通常把层次 3作为衡量一个算法算法是否合格的标准。

3.2 可读性

    可读性:算法的另一个目的是为了便于阅读,来理解和交流。可读性高有助于人们理解算法,晦涩难懂的算法往往隐含错误,不易被发现,并且难以调试和修改。

3.2 健壮性

    健壮性:当输入数据不合法时,算法也能做出相关处理而不是产生异常或莫名其妙的结果

3.3 时间效率高和存储量低

    时间效率指的是算法的执行时间。对于同一个问题,如果有多个算法能够解决,执行时间短的算法效率高,执行时间长的效率低。存储量需求指的是算法在执行过程中需要的最大空间,主要指算法程序运行时所占用的内存或外部硬盘存储空间。因此,设计算法时应尽量满足时间效率高和存储量低的需求。



四. ⛳️算法效率的度量方法

    刚才我们提到了设计算法要提高效率。这里的效率大都指算法的执行时间。算法的执行时间需要依据该算法编制的程序在计算机上运行时所消耗的时间来度量的。而度量一个程序的执行时间通常有有两种方法 —— 事后统计方法和事前分析估算方法。

4.1 事后统计方法

    事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同的算法编制的程序的运行时间进行比较,从而确定算法效率的高低。但是这种方法明显是有很大的缺陷:

  • 必须要依据算法事先编制好程序,这通常要需要花费大量时间和精力。如果编制出来发现它根本就是一团很糟糕的算法,那不就是竹篮打水一场空了吗?
  • 时间的比较依赖计算机硬件和软件等环境因素的影响,有时会掩盖算法本身的优劣。
  • 算法的测试数据设计困难,并且程序的运行时间往往还与测试数据的规模有很大关系,效率高的算法在小的测试数据面前往往得不到体现。

基于事后统计方法有这样那样的缺陷,我们一般不予以采纳,而是采用另一种事前分析估算方法。

4.2 事前分析估算方法

    事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。经过分析我们可以发现,一个用高级语言程序语言编写的程序在计算机上运行时所消耗的时间取决于一下因素:
在这里插入图片描述
解析
    第(1)条是一个好算法的根本,第(2)条要有软件来支持,第(4)条要看硬件性能。因此,抛开这些与计算机硬件、软件有关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题输入规模是指输入量的多少。



五. ⛳️算法的复杂度

5.1 算法的复杂度的简单介绍

    算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度

    时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。


5.2 算法复杂度在面试中考察

在这里插入图片描述

由此可以看出算法复杂度的重要性,所以说同学们下面的内容一定要好好学哦。言归正传接下来让我们开始具体讲解时间复杂度和空间复杂度。



六. ⛳️算法的时间复杂度(重点)

6.1 算法的时间复杂度定义

    在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度
即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度

  • 示例:请计算一下Func1中++count语句总共执行了多少次?
void Func1(int N)
{int count = 0;for (int i = 0; i < N; ++i){for (int j = 0; j < N; ++j){++count;//执行 N*N 次}}for (int k = 0; k < 2 * N; ++k){++count;//执行 2*N 次}int M = 10;while (M--){++count;//执行 10次}printf("%d\n", count);
}

在这里插入图片描述

     实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么我们就可以使用大O的渐进表示法。看到这估计有同学该问了大O的渐进表示法是什么,它又是如何推导的呢?且听我慢慢道来,让我们继续接着向下面学习。


6.2 大O的渐进表示法

大O符号(big O notation):是用于于描述函数渐进行为的数学符号

推导大O阶方法:

(1)用常数1取代运行时间中的所有加法常数。
(2) 在修改后的运行次数函数中,只保留最高阶项。
(3)如果最高阶项存在且其系数不是1,则去除与这个项相乘的系数。得到的结果就是大O阶。

结合上面示例: 使用大O的渐进表示法以后,Func1的时间复杂度为:
在这里插入图片描述

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数


6.3 常见的时间复杂度

  常见的时间复杂度如下表所示:
在这里插入图片描述
注:对数在文本中不好表示,以 2 为底的对数通常简写为(logn)

  常用的时间复杂度所耗费的时间从小到大依次是:

O(1) < O(logn) < O(n) < O(nlogn) < O(2n) < O(n3) < O(2n) < O(n!)

在这里插入图片描述


6.4 最好情况、最坏情况与平均情况

另外有些算法的时间复杂度存在最好、平均和最坏情况:

  • 最坏情况:任意输入规模的最大运行次数(上界)
  • 平均情况:任意输入规模的期望运行次数
  • 最好情况:任意输入规模的最小运行次数(下界)

例如:在一个长度为N数组中搜索一个数据x
      最好情况:1次找到
      最坏情况:N次找到
      平均情况:N/2次找到
在实际中 一般在没有特殊说明的情况下,关注的都是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)。


6.5 常见时间复杂度计算举例

1️⃣实例一:

// 计算Func1的时间复杂度?
void Func1(int N)
{int count = 0;for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}

解析:实例1基本操作执行了2N+10次,根据大O阶的推导方法很容易得出:Func1的时间复杂度为O(N)


2️⃣实例二:

// 计算Func2的时间复杂度?
void Func2(int N, int M)
{int count = 0;for (int k = 0; k < M; ++k){++count;}for (int k = 0; k < N; ++k){++count;}printf("%d\n", count);
}

解析:实例二基本操作执行了M+N次,根据大O阶的推导方法得出:

  • 如果题目没有表明 M 和 N 的大小,Func2的时间复杂度为O(M + N)
  • 如果题目明确表明 M 远大于 N ,则 N 的变化对时间复杂度的影响不大,Func2的时间复杂度为O(M)
  • 如果题目明确表明 N 远大于 M ,则 M 的变化对时间复杂度的影响不大,Func2的时间复杂度为O(N)
  • 如果题目明确表明 M 和 N 一样大,则O(M + N)等价于O(2M)或O(2N),Func2的时间复杂度为O(M)O(N)

3️⃣实例三:

// 计算Func3的时间复杂度?
void Func3(int N)
{int count = 0;for (int k = 0; k < 100; ++k){++count;}printf("%d\n", count);
}

解析:实例3基本操作执行了100次,根据大O阶的推导方法很容易得出:Func3的时间复杂度为O(1)


4️⃣实例四:

// 计算strchr的时间复杂度?
const char * strchr ( const char * str, int character );

解析:首先我们先来介绍一下库函数strchr作用:在str指向的字符数组中查找是否包含字符characte。因此实例4的基本操作执行最好1次,最坏N次。根据时间复杂度一般看最坏,strchr的时间复杂度为O(N)


5️⃣实例五:

// 计算BubbleSort的时间复杂度?
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

解析:本题是冒泡排序函数,冒泡排序的思想是:假设数组中有 n 个元素,第一趟执行将会执行 n-1 次交换,将一个元素排好序。第二趟将会执行 n-2 次交换,将将一个元素排好序…依次类推。排好所有元素需要执行 n-1 次,每趟交换的次数分别为(n - 1),(n-2),(n-3),… ,(2),(1)。由此可知,实例5基本操作执行最好n-1次(即数组已经排好序,只需要执行一趟排序判断数组是否已经有序),最坏执行了( n*(n-1) )/2次(即将所有趟交换的次数相加,可以直接使用等差数列求和),通过推导大O阶方法+时间复杂度一般看最坏,BubbleSort的时间复杂度为O(N^2)


6️⃣实例六:

// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{assert(a);int begin = 0;int end = n - 1;// [begin, end]:begin和end是左闭右闭区间,因此有=号while (begin <= end){int mid = begin + ((end - begin) >> 1);if (a[mid] < x)begin = mid + 1;else if (a[mid] > x)end = mid - 1;elsereturn mid;}return -1;
}

解析:本题是二分查找函数,每次查找将会将范围缩放一半。因此实例6基本操作执行最好1次,最坏O(logN)次。根据时间复杂度一般看最坏,BinarySearch时间复杂度为 O(logN)
在这里插入图片描述


7️⃣实例七:

// 计算阶乘递归Fac的时间复杂度?
long long Fac(size_t N)
{if (0 == N)return 1;return Fac(N - 1) * N;
}

解析:本题是一个简单的递归调用, 实例7通过计算分析发现基本操作递归了N次,时间复杂度为O(N)
在这里插入图片描述

8️⃣实例八:

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}

解析:本题是一个双递归。实例8通过计算分析发现基本操作递归了2n,Fib的时间复杂度为O(2^n)
在这里插入图片描述



七. ⛳️算法的空间复杂度

7.1 算法空间复杂度的定义

  • 空间复杂度也是一个数学表达式,是对一个算法在运行过程中额外临时占用存储空间大小的量度
  • 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以 空间复杂度算的是变量的个数
  • 空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。

注意: 函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。


7.2 常见空间复杂度计算举例

1️⃣实例一:

// 计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

解析: 实例1使用了常数个额外空间,分别是[ end,exchange,i ]。根据大O阶的推导方法很容易得出,BubbleSort空间复杂度为 O(1)


2️⃣实例二:

// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
long long* Fibonacci(size_t n)
{if (n == 0)return NULL;long long* fibArray = (long long*)malloc((n + 1) * sizeof(long long));fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n; ++i){fibArray[i] = fibArray[i - 1] + fibArray[i - 2];}return fibArray;
}

解析:实例2动态开辟了N+1个空间,根据大O阶的推导方法很容易得出,Fibonacci空间复杂度为 O(N)


3️⃣实例三:

// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{if (N == 0)return 1;return Fac(N - 1) * N;
}

解析:实例3递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)。
在这里插入图片描述



八. ⛳️总结

本文主要讲解:

  1. 算法的定义:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
  2. 算法的特性:有穷性、确定性、可行性、输入、输出。
  3. 算法的设计要求:正确性、可读性、健壮性、高效率和低存储量需求。
  4. 算法的度量方法:事后统计方法、事前分析估算方法。
  5. 推导大O阶
  6. 时间复杂度
  7. 空间复杂度

     今天的内容就到这里了,你对今天的内容是否有所掌握?如果还有疑问的话请在评论区里多多提问,大家可以一起帮你解决,让我们共同进步。创作不易,如果对你有用的的话点个赞支持下作者,你们的支持是作者创作最大的动力。关注我不迷路。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学术 | IEEE ICASSP学术会议申请及截止时间

ICASSP会议即国际声学、语音与信号处理会议&#xff0c;是全世界最大的&#xff0c;也是最全面的信号处理及其应用方面的顶级会议&#xff0c;是IEEE&#xff08;电子技术与信息科学工程师协会&#xff09;旗下的重要国际会议。 2024 IEEE International Conference on Acousti…

Vue - 标准开发方式、组件(全局、局部、props、事件传递)、插槽的使用

目录 一、Vue 1.1、标准开发方式 1.2、组件的使用 1.2.1、全局组件 1.2.2、局部组件 1.2.3、props 传递静态数据 1.2.4、props 传递动态数据 1.2.5、事件传递 1.2.6、插槽slot 一、Vue 1.1、标准开发方式 Vue 的标准开发方式是 SPA&#xff08;Single Page Applicatio…

2023年【天津市安全员C证】模拟考试及天津市安全员C证实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证模拟考试是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2023年【天津市安全员C证】模拟考试及天津市…

10-SRCNN-使用CNN实现超分辨成像

文章目录 utils_dataset.pymodel.pytrain.pyuse.py主要文件 utils_dataset.py 工具文件,主要用来制作dataset,便于加入dataloader,用于实现数据集的加载和并行读取 model.py 主要写入网络(模型) train.py 主要用于训练 use.py 加载训练好的模型,用于测试或使用 utils_dat…

ACU-01B 3HNA024871-001/03 机器人将如何改变世界

ACU-01B 3HNA024871-001/03 机器人将如何改变世界 由于改进的传感器技术以及机器学习和人工智能方面更显著的进步&#xff0c;机器人将继续从单纯的机械机器转变为具有认知功能的合作者。这些进步&#xff0c;以及其他相关领域&#xff0c;正在享受一个上升的轨迹&#xff0c;…

Archive Team: The Twitter Stream Grab

该集合不再更新&#xff0c;应被视为静态数据集。 从一般 Twitter 流中抓取的 JSON 的简单集合&#xff0c;用于研究、历史、测试和记忆的目的。这是“Spritzer”版本&#xff0c;最轻、最浅的 Twitter 抓取。不幸的是&#xff0c;我们目前无法访问流的洒水器或花园软管版本。 …

MATLAB-自动批量读取文件,并按文件名称或时间顺序进行数据处理

我在处理文件数据时&#xff0c;发现一个一个文件处理效率太低&#xff0c;因此学习了下MATLAB中自动读取特定路径下文件信息的程序&#xff0c;并根据读取信息使用循环进行数据处理&#xff0c;提高效率&#xff0c;在此分享给大家这段代码并给予一些说明&#xff0c;希望能为…

Docker逃逸---授权 SYS_ADMIN Capability逃逸原理浅析

目录 一、产生原因 二、利用条件 三、复现过程 1、容器内挂载宿主机cgroup 2、设置notify_no_release并寻找容器在宿主机上的存储路径 3、将恶意脚本写入release_agent 一、产生原因 给容器额外授权了SYS_ADMIN Cap&#xff0c;并且容器以root权限运行&#xff0c;攻击者…

数据结构之堆

目录 前言 堆的概念与结构 堆的实现 堆的初始化 堆的销毁 堆的显示 堆的插入 堆的向上调整算法 堆的删除 堆的向下调整算法 堆的判空 获取堆顶元素 堆的数据个数 堆的创建 前言 二叉树的顺序结构存储即使用数组存储&#xff0c;而数组存储适用于完全二叉树&#xf…

C# OpenVINO Cls 图像分类

效果 耗时 class idbrown_bear, score0.86 preprocess time: 0.00ms infer time: 2.72ms postprocess time: 0.02ms Total time: 2.74ms项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using Sdcb.OpenVINO.Natives; using System; using System.Diagnostics; using Sys…

【分享】教你加速访问GitHub,进来学!

哈喽&#xff0c;大家好&#xff0c;木易巷来啦&#xff01; 众所周知&#xff0c;Github是一款程序猿必备的代码托管平台&#xff0c;上面已经存在了无数前辈的心血&#xff01;经常需要在上面查看大佬写的一些好用的开源项目&#xff0c;无赖国外网站的速度实在让人难以接受。…

基于ssm+vue的线上点餐系统

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

间歇性微服务问题...

在Kubernetes环境中&#xff0c;最近由于特定配置导致Pod调度失败。哪种 Kubernetes 资源类型&#xff08;通常与节点约束相关&#xff09;可能导致此故障&#xff0c;尤其是在未正确定义的情况下&#xff1f; 节点选择器资源配额优先级污点Pod 中断预算 已有 201 人回答了该…

华为数通方向HCIP-DataCom H12-831题库(单选题:261-280)

第261题 某网络通过部署1S-IS实现全网与通,若在一台IS-IS路由器的某接口下配置命令isis timer holding multiplier 5 level-2,则以下关于该场景的描述,正确的是哪一项? A、该接口Level-2邻居保持时间为5秒 B、该接口Level-1邻居保持时间为30秒 C、该接口为点对点链路接口 …

工控网络协议模糊测试:用peach对modbus协议进行模糊测试

0x00 背景 本人第一次在FB发帖&#xff0c;进入工控安全行业时间不算很长&#xff0c;可能对模糊测试见解出现偏差&#xff0c;请见谅。 在接触工控安全这一段时间内&#xff0c;对于挖掘工控设备的漏洞&#xff0c;必须对工控各种协议有一定的了解&#xff0c;然后对工控协议…

Qt开发之路--模块化设计.pri文件

Qt开发之路--模块化设计.pri文件 QT pro文件和pri文件的区别Chapter1 Qt开发之路--模块化设计.pri文件一&#xff1a;.pri文件简介二&#xff1a;通过.pri模块化设计三&#xff1a;结尾 Chapter2 Qt开发大型项目时&#xff0c;通过.pri文件将众多文件按功能模块分类显示Qt中多p…

概率神经网络分类问题程序

欢迎关注“电击小子程高兴的MATLAB小屋” %% 概率神经网络 %% 解决分类问题 clear all; close all; P[1:8]; Tc[2 3 1 2 3 2 1 1]; Tind2vec(Tc) %数据类型的转换 netnewpnn(P,T); Ysim(net,P); Ycvec2ind(Y) %转换回来

7天狂揽 1.3w star 的 MetaGPT,他们的目标让软件公司为之一惊

在 AI 产品爆炸的今天&#xff0c;拥有各种本领的 AI 产品层出不穷&#xff0c;但 MetaGPT 的出现仍然显的格外耀眼&#xff0c;其可以实现只输入单一 prompt&#xff0c;就可以输出需求分析、需求文档、技术架构、最终代码等等产物&#xff0c;这相当于一个开发团队的输出成果…

Linux:【Kafka四】集群介绍与单机搭建

目录 环境简介 一、搭建kafka集群 1.1、复制出两个kafka的配置文件 1.2、修改配置文件中的如下属性 二、启动kafka集群 三、可校验kafka三个节点是否均启动成功 四、查看集群中主题的分区和副本 4.1、新建一个包含了分区和副本的主题 4.2、查看该主题的详细信息 五、…

Android查看签名信息系列 · 使用逆向分析工具JadxGUI获取签名

前言 Android查看签名信息系列之使用逆向分析工具JadxGUI获取签名&#xff0c;通过这种方式&#xff0c;可以获取到的签名信息包括&#xff1a;MD5、SHA1、SHA-256、公钥(模数)等信息 实现方法 1、进入JadxGUI目录下的lib文件夹内&#xff0c;找到jadx-gui-1.4.7.jar文件 2、…