【数据结构】1.时间和空间复杂度

目录

1.如何衡量一个算法的好坏

2.算法效率

3.时间复杂度

3.1时间复杂度的概念

3.2大O的渐进表示法

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

4.空间复杂度


1.如何衡量一个算法的好坏

下面求斐波那契数列的算法是好还是不好,为什么?该如何衡量一个算法的好坏呢?

public static long Fib(int N){
if(N < 3){
return 1;
}
return Fib(N-1) + Fib(N-2);
}

2.算法效率

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称为空间复杂度。时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法多需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的高度了,所以我们如今不用再特别关注一个算法的空间复杂度。

3.时间复杂度

3.1时间复杂度的概念

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间,一个算法执行所消耗的时间,从理论上来说,是不能算出来的,只有把你的程序放在机器上跑起来,才能知道。算法中的基本操作的执行次数,为算法的时间复杂度。

3.2大O的渐进表示法
// 请计算一下func1基本操作执行了多少次?
void func1(int N){
int count = 0;
for (int i = 0; i < N ; i++) {
for (int j = 0; j < N ; j++) {
count++;
}
}
for (int k = 0; k < 2 * N ; k++) {
count++;
}
int M = 10;
while ((M--) > 0) {
count++;
}
System.out.println(count);
}

Func1执行的基本操作数:

F(N)=N^2+2*N+10

  • N=10 F(N)=130
  • N=100 F(N)=10210
  • N=1000F(N)=1002010

实际中我们计算时间复杂度时,我们不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。

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

【实例1】

// 计算func2的时间复杂度?
void func2(int N) {
int count = 0;
for (int k = 0; k < 2 * N ; k++) {
count++;
}
int M = 10;
while ((M--) > 0) {
count++;
}
System.out.println(count);
}

【实例2】

// 计算func3的时间复杂度?
void func3(int N, int M) {
int count = 0;
for (int k = 0; k < M; k++) {
count++;
}
for (int k = 0; k < N ; k++) {
count++;
}
System.out.println(count);
}

【实例3】

// 计算func4的时间复杂度?
void func4(int N) {
int count = 0;
for (int k = 0; k < 100; k++) {
count++;
}
System.out.println(count);
}

【实例4】

// 计算bubbleSort的时间复杂度?
void bubbleSort(int[] array) {
for (int end = array.length; end > 0; end--) {
boolean sorted = true;
for (int i = 1; i < end; i++) {
if (array[i - 1] > array[i]) {
Swap(array, i - 1, i);
sorted = false;
}
}
if (sorted == true) {
break;
}
}
}

【实例5】

// 计算binarySearch的时间复杂度?
int binarySearch(int[] array, int value) {
int begin = 0;
int end = array.length - 1;
while (begin <= end) {
int mid = begin + ((end-begin) / 2);
if (array[mid] < value)
begin = mid + 1;
else if (array[mid] > value)
end = mid - 1;
else
return mid;
}
return -1;
}

【实例6】

// 计算阶乘递归factorial的时间复杂度?
long factorial(int N) {
return N < 2 ? N : factorial(N-1) * N;
}

【实例7】

// 计算斐波那契递归fibonacci的时间复杂度?
int fibonacci(int N) {
return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}

【实例答案】

  1. 实例1基本操作执行了2N+10次,通过推导大O阶方法知道,时间复杂度为O(N)
  2. 实例2基本操作执行了M+N次,有两个未知数M和N,时间复杂度为O(N+M)
  3. 时间复杂度为(O1)
  4. 时间复杂度为O(N^2)
  5. 时间复杂度为:O(log2N)
  6. 时间复杂度为:O(N)
  7. 时间复杂度为:O(2^N)

4.空间复杂度

空间复杂度时一个算法在运行过程中临时占用存储空间大小的量度。使用大O渐进表示法

【实例1】

// 计算bubbleSort的空间复杂度?
void bubbleSort(int[] array) {
for (int end = array.length; end > 0; end--) {
boolean sorted = true;
for (int i = 1; i < end; i++) {
if (array[i - 1] > array[i]) {
Swap(array, i - 1, i);
sorted = false;
}
}
if (sorted == true) {
break;
}
}
}

【实例2】

// 计算fibonacci的空间复杂度?
int[] fibonacci(int n) {
long[] fibArray = new long[n + 1];
fibArray[0] = 0;
fibArray[1] = 1;
for (int i = 2; i <= n ; i++) {
fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
}
return fibArray;
}

【实例3】

// 计算阶乘递归Factorial的空间复杂度?
long factorial(int N) {
return N < 2 ? N : factorial(N-1)*N;
}

【实例答案】

  1. 实例1使用了常数个额外空间,所以空间复杂度为O(1。.
  2. 实例2动态开辟了N个空间,空间复杂度为O(N)。
  3. 实例3递归调用了N次,开辟了N个栈帧,每个栈帧受用了常数个空间。空间复杂度为O(N)

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

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

相关文章

编程新手必看,学习python中列表数据类型内容(9)

Python中的列表是一种可变的、有序的数据结构&#xff0c;它允许存储不同类型的数据项&#xff0c;并支持多种操作。具体如下&#xff1a; 创建列表&#xff1a;可以通过一对方括号[]来创建一个空列表&#xff0c;或者在方括号内放入初始元素来创建一个非空列表。例如&#xff…

链表实验.

#include<stdio.h> #include<stdlib.h>// 定义单链表节点结构体 struct Node {int data;struct Node* next; };struct Node* initList() {struct Node* list (struct Node*)malloc(sizeof(struct Node));list->data 0;list->next NULL;return list; }void…

特征提取算法

特征提取算法 0. 写在前边1. Harris算法1.1 写在前面1.2 Harris算法的本质1.3 Harris算法的简化 2. Harris3D2.1 Harris3D算法问题定义2.2 Harris3D with intensity2.3 Harris3D without intensity 3. ISS特征点的应用 0. 写在前边 本篇将介绍几种特征提取算法&#xff0c;特征…

笔记 | 软件工程:需求分析

1 需求分析 #需求分析 1.1 需求分析概述 初步软件需求存在的问题&#xff1a;不具体&#xff0c;不清晰&#xff0c;关系不明朗&#xff0c;存在潜在缺陷&#xff0c;没有区分不同软件需求&#xff08;有必要鉴别不同软件需求项的重要性差别&#xff0c;区分不同软件需求的开…

【C语言】——指针八:指针运算笔试题解析

【C语言】——指针八&#xff1a;指针运算笔试题解析 一、题一二、题二三、题三四、题四五、题五六、题六七、题七 一、题一 //程序输出结果是什么 int main() {int a[5] { 1,2,3,4,5 };int* ptr (int*)(&a 1);printf("%d, %d", *(a 1), *(ptr - 1));return…

Python基于Tkinter的加法游戏

定制魏:QTWZPW,获取更多源码等 目录 题目概述 详细设计 函数设计 总体设计 重要代码

责任链模式详解+代码案例

责任链设计模式 定义&#xff1a; 又名职责链模式&#xff0c;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这条链传递&#xff0c;直到…

算法|ss dfsbfs

200.岛屿数量—1207.课程表—1547.省份数量695.岛屿的最大面积17.15.最长单词 200.岛屿数量—1 /*** param {character[][]} grid* return {number}*/ var numIslands function (grid) {let ans 0;let m grid.length;let n grid[0].length;const dirs [[1, 0],[-1, 0],[…

揭开“栈和队列”的神秘面纱

前言 在线性表中不止有顺序表和链表&#xff0c;今天的主角就如标题所说--->认识栈和队列。把他们俩放一起总结是有原因的&#xff0c;还请看官听我娓娓道来~ 什么是栈&#xff1f; 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入和删除操作的线性表 咱可以把栈理…

Pro版 v3.0首页DIY热区神器,让图片更全能!

Pro版v3.0新增了很多新功能&#xff0c;为了方便大家能快速了解使用&#xff0c;今天&#xff0c;我们就开始来逐步了解这些新功能。 在此次更新中&#xff0c;Pro版的首页DIY功能实现了全新重构升级&#xff0c;新增了DIY热区、视频、排行榜、积分商城、预售、签到组件&#…

python类中的__call__函数有什么用法?

在 Python 中,如果一个类实现了 __call__ 方法,那么这个类的实例对象就可以像函数一样被调用。当调用一个实现了 __call__ 方法的对象时,实际上会调用这个对象的 __call__ 方法。 __call__ 方法的主要作用是让对象具有函数的行为,可以在调用对象时执行一些操作。这对于需要…

【Hadoop技术框架-MapReduce和Yarn的详细描述和部署】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天的内容主要是Hadoop的后两个组件&#xff1a;MapReduce和yarn的相关内容。同时还有Hadoop的完整流程。希望对大家有所帮助。感谢大家关注点赞。 &#x1f49e;&#x1f49e;前路漫漫&…

mysql学习笔记NO.1

MySQL入门笔记 1.MySQL 5.7 安装配置 下载MySQL 5.7安装包并进行安装。配置MySQL的环境变量。启动MySQL服务。 2.命令行连接到MySQL 打开命令行终端。输入以下命令连接到MySQL服务器&#xff1a; mysql -u 用户名 -p 输入密码以登录MySQL服务器。​​​​​​​ 3.SQLyog 下载并…

蓝桥杯刷题-07-整数删除-暴力

给定一个长度为 N 的整数数列&#xff1a;A1, A2, . . . , AN。你要重复以下操作 K 次&#xff1a; 每次选择数列中最小的整数&#xff08;如果最小值不止一个&#xff0c;选择最靠前的&#xff09;&#xff0c;将其删除。并把与它相邻的整数加上被删除的数值。输出 K 次操作后…

深度学习实战73-基于多模态CLIP模型的实战项目,CLIP模型的架构介绍与代码实现

大家好,我是微学AI,今天给大家介绍一下深度学习实战73-基于多模态CLIP模型的实战项目,CLIP模型的架构介绍与代码实现。多模态CLIP(Contrastive Language-Image Pre-training)模型是一种深度学习模型,其核心设计理念是通过大规模的对比学习训练,实现图像与文本之间的跨模…

【JAVASE】面向对象程序三大特性之一( 封装)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609;\n &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1.包的使用 2.static关键字的使用 3.代码…

Python+Vuecil笔记

Nginx 进入目录: C:\nginx-1.20.2\nginx-1.20.2 start nginx 开始 nginx -s stop 停止 nginx -s quit 退出CSS 通过标签去写css 循环展示数据 JS 点击时执行事件 Django 配置media 在seetings里面修改 STATIC_URL /static/ MEDIA_URL /upload/ MEDIA_ROOT os.pat…

windows terminal美化教程

安装terminal 微软商店下载安装terminal 配置文件 进入terminal&#xff0c;打开设置。 {"$schema": "https://aka.ms/terminal-profiles-schema",// global settings"profiles": {// profile settings"defaults": {// default sett…

阿里云服务器租赁一年收费标准

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

Docker设置时区

Dockerfile中设置时区的方法 # 设置环境变量TZ ENV TZAsia/Shanghai# 配置时区 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone创建容器时设置时区 将宿主机与容器的时间进行挂载&#xff0c;直接使用宿主机的时区 -v /etc/lo…