中企动力做的网站怎么登陆/西安百度百科

中企动力做的网站怎么登陆,西安百度百科,如何做网站流量报告,买网站空间目录 一、前言 1. 什么是数据结构 2. 什么是算法 二、时 / 空间复杂度 1. 算法效率 2. 时间复杂度 2.1 时间复杂度的概念 2.2 大 O 的渐进表示法 2.3 常见的计算时间复杂度的例子 2.3.1 实例 1 2.3.2 实例 2 2.3.3 实例 3 2.3.4 实例 4 2.3.5 实例 5 &#xff1a…

目录

一、前言

1. 什么是数据结构

2. 什么是算法

二、时 / 空间复杂度

1. 算法效率

2. 时间复杂度

2.1 时间复杂度的概念

2.2 大 O 的渐进表示法

2.3 常见的计算时间复杂度的例子

2.3.1 实例 1

2.3.2 实例 2

2.3.3 实例 3

2.3.4 实例 4

2.3.5 实例 5 :冒泡排序

2.3.6 实例 6 :二分查找

2.3.7 实例 7 :阶乘递归

2.3.8 实例 8 :斐波那契递归

3. 空间复杂度

3.1 空间复杂度的概念

3.2 显式申请的额外空间

3.3 常见的计算空间复杂度的例子

3.3.1 实例 1 :冒泡排序

3.3.2 实例 2 :返回斐波那契数列的前n项

3.3.3 实例 3 :阶乘递归

4.

4.1 常见复杂度总结

4.2 判断复杂度的方法

4.2.1 判断时间复杂度的方法

4.2.2 判断空间复杂度的方法

5. 练习

5.1 消失的数字

5.2 轮转数组

💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!

👍 :如果你觉得这篇文章还不错,不妨顺手、加入收藏,并分享给更多的朋友噢~!


一、前言

1. 什么是数据结构

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

2. 什么是算法

算法(Algorithm)是明确的计算流程,它接收一个或一组输入值,经过一系列计算步骤后,输出一个或一组结果,其作用就是把输入数据转变为输出结果。


二、时 / 空间复杂度

1. 算法效率

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。

因此衡量一个算法的好坏,一般从时间和空间两个维度来衡量,即时间复杂度和空间复杂度。

  • 时间复杂度主要衡量一个算法的运行快慢。
  • 空间复杂度主要衡量一个算法运行所需要的额外空间。

计算机发展早期,由于存储容量很小,所以很在乎空间复杂度。但随着计算机行业迅速发展,如今计算机的存储容量已达到很高程度,所以我们现在不需特别关注一个算法的空间复杂度。

2. 时间复杂度

2.1 时间复杂度的概念

时间复杂度是定量描述算法运行时间随问题规模 N 增长的变化趋势的函数。

理论上,算法执行耗时无法直接算出,需运行程序才知晓,但没必要对每个算法都上机测试,于是有了时间复杂度分析。

算法耗时与语句执行次数成正比,基本操作的执行次数就是算法的时间复杂度。即,算出某条基本语句和问题规模 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;}}for (int k = 0; k < 2 * N ; ++ k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}

这里 Func1 执行的基本操作次数 :

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

实际中计算时间复杂度时,不一定要计算精确的执行次数,只需获知大概执行次数,此时使用大 O 的渐进表示法。

2.2 大 O 的渐进表示法

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

推导大 O 阶:

  1. 用常数 1 取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项  。
  3. 若最高阶项存在且不是 1,则去掉该项系数 y 。得到的结果就是大 O 阶  。

对于前面的 

  • 步骤 1:用常数 1 取代加法常数 10,得  。
  • 步骤 2:只保留最高阶项 
  • 步骤 3:最高阶项  的系数为 1,无需去除,得到大 O 阶  。

因此使用大 O 的渐进表示法后,前面 Func1 的时间复杂度为  。

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

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

例如:在一个长度为 N 的数组中搜索一个数据 x

  • 最好情况:1 次找到
  • 最坏情况:N 次找到
  • 平均情况:N/2 次找到

实际中一般关注算法的最坏运行情况,所以数组中搜索数据的时间复杂度为 O (N) 。

2.3 常见的计算时间复杂度的例子

2.3.1 实例 1
void Func2(int N)
{int count = 0;for (int k = 0; k < 2 * N ; ++ k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}

基本操作执行次数  ,所以 Func2 时间复杂度为 O(N) 。

2.3.2 实例 2
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;}printf("%d\n", count);
}

基本操作执行次数  ,有两个未知数 M 和 N,所以 Func3 时间复杂度为 O(N + M) 。

2.3.3 实例 3
void Func4(int N)
{int count = 0;for (int k = 0; k < 100; ++ k){++count;}printf("%d\n", count);
}

基本操作执行次数 100,所以 Func4 时间复杂度为 O(1) 。

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

基本操作执行最好 1 次,最坏 N 次,时间复杂度一般看最坏,所以时间复杂度为 O(N) 。

2.3.5 实例 5 :冒泡排序
// 冒泡排序
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;}
}

基本操作执行最好  次(数组已有序,只需进行一轮遍历),最坏执行了  次(  ),时间复杂度一般看最坏,所以时间复杂度为 

2.3.6 实例 6 :二分查找
// 二分查找
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;
}

基本操作执行最好 1 次(第一次比较就找到目标值),最坏  次(第 k 次比较后,搜索区间长度变为  , 得  。又因为大 O 表示法中,通常忽略对数的底数 ),所以时间复杂度为  。有些地方写成  。

2.3.7 实例 7 :阶乘递归
// 阶乘递归
long long Fac(size_t N)
{if(0 == N)return 1;return Fac(N-1)*N;
}

基本操作执行了 N 次,所以时间复杂度为 O(N) 。

2.3.8 实例 8 :斐波那契递归
// 斐波那契递归
long long Fib(size_t N)
{if(N < 3)return 1;return Fib(N-1) + Fib(N-2);
}

以 Fib(5) 为例,构建它的递归调用树:

  • 当 N < 3 时,F(N) = 1 ;
  • 当 N >= 3 时,F(N) = F(N - 1) + F(N - 2) +1 (+1是当前Fib(N)的这次调用)。此递推关系的解的增长趋势与  同阶。

又因为大 O 表示法忽略常数和低阶项,所以该算法的时间复杂度为 

3. 空间复杂度

3.1 空间复杂度的概念

空间复杂度是用于衡量算法运行时临时占用存储空间大小的数学表达式。

其计算规则与时间复杂度类似,采用大O渐进表示法。

需注意,函数运行所需的栈空间(如参数、局部变量、寄存器信息等占用空间)在编译时已确定,故空间复杂度主要看函数运行时显式申请的额外空间

3.2 显式申请的额外空间

  • 动态内存分配函数申请的空间。

  • 部分库函数内部会申请额外空间,C 语言标准库中常见的如 realloc 、strdup 等。

  • 创建某些数据结构时需专门写代码向系统申请内存,那么申请到的这部分内存空间就属于额外空间。如,创建链表节点时得用 malloc 或 new 这些操作去申请内存。

3.3 常见的计算空间复杂度的例子

3.3.1 实例 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;}
}

BubbleSort函数未通过动态内存分配函数、特定库函数或创建复杂数据结构来显式申请额外空间,仅使用了几个固定的局部变量,所以它使用了常数个额外空间,其空间复杂度为 O(1)。

3.3.2 实例 2 :返回斐波那契数列的前n项
// 计算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;
}

动态开辟了 N+1 个空间,空间复杂度为 O(N) 。

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

Fac函数虽然未显式地使用动态内存分配函数来申请额外空间,但递归调用会隐式地占用与递归深度成正比的栈空间,因此在计算空间复杂度时需要考虑这部分额外空间

这里递归调用了 N+1 次,所以空间复杂度为 O(N) 。

4.

4.1 常见复杂度总结

基本操作执行次数/额外空间量复杂度
常数常数阶
线性阶
平方阶
对数阶
NlogN阶
立方阶
指数阶

4.2 判断复杂度的方法

4.2.1 判断时间复杂度的方法
  1. 确定基本操作:如简单赋值、算术和比较运算等,其时间复杂度为 O(1)。
  2. 分析循环
    • 单层循环:循环体为基本操作且次数与输入规模 n 相关,复杂度为 O(n)。
    • 嵌套循环:多层嵌套时,复杂度是各层循环次数乘积,如双重嵌套为 O(n^2),三层为 O(n^3)
    • 次数不固定循环:像二分查找,复杂度为 O(logn)。
  3. 分析递归函数
    • 确定深度:如阶乘递归调用 N 次,复杂度为 O(N)。
    • 考虑操作数:每次递归操作数固定,复杂度是深度与单次操作数乘积;若操作数与规模有关,如斐波那契递归,复杂度为 O(2^n)
  4. 处理条件语句if-else 本身 O(1),若分支操作复杂度不同,取最坏情况,如一支 O(1) 一支 O(n),整体为 O(n)。
  5. 确定整体复杂度:取复杂度最高部分作为整体复杂度。
4.2.2 判断空间复杂度的方法
  1. 找基本变量:如简单数据类型(intfloatchar 等)变量占用固定空间,复杂度为 O(1)。
  2. 数据结构
    • 一维数组:数组的空间复杂度取决于数组的大小。若一维数组大小为 n,复杂度 O(n)。
    • 二维数组:int arr[m][n],复杂度 O(mn)。
    • 其他:链表、树、图等,依节点数和单节点空间定,如链表节点数为 n 时复杂度 O(n)。
  3. 递归函数
    • 调用栈:递归深度为 n 且每次递归占固定空间,复杂度 O(n)。
    • 数据结构:若递归函数中创建了数据结构,需结合结构空间和递归深度考量。
  4. 函数调用
    • 参数:函数参数若为大型数据结构或数组等,需考虑其占用空间对整体空间复杂度的影响。若传递的是指针,则通常只占固定空间,空间复杂度为 O(1)。
    • 返回值:若函数返回大型数据结构,返回值占用的空间也应计入空间复杂度。
  5. 整体复杂度:取代码各部分中复杂度最高的作为整体复杂度。

5. 练习

5.1 消失的数字

一个数组包含从0到n的所有整数,但其中缺了一个。请编写代码在O(n)时间内找出缺失的整数。

分析:“O(n)时间”意味着不能使用嵌套循环等。

示例:求和法

#include <stdio.h>int missingNumber(int* nums, int numsSize)
{int i = 0;int sum1 = 0;int sum2 = 0;for (i = 0; i < numsSize; i++){sum1 += nums[i];}sum2 = (numsSize * (numsSize + 1)) / 2;return sum2 - sum1;
}int main()
{int nums[] = { 9,6,4,2,3,5,7,0,1 };int size = sizeof(nums) / sizeof(nums[0]);int missnum = missingNumber(nums, size);printf("missnum=%d\n", missnum);return 0;
}

5.2 轮转数组

给定一个整数数组,将数组中的元素向右轮转 k 个位置。

示例:环状替换

​
#include <stdio.h>void swap(int *a, int *b) 
{int temp = *a;*a = *b;*b = temp;
}// 向右轮转数组函数
void rotate(int* nums, int numsSize, int k) 
{k = k % numsSize;// 处理 k > 数组长度的情况。避免不必要的重复轮转int count = 0;for (int start = 0; count < numsSize; start++) {int current = start;// current 用于标记当前正在处理的元素的索引int prev = nums[start];do    {int next = (current + k) % numsSize;// 计算当前元素要移动到的新位置的索引// 取模确保索引在数组范围内int temp = nums[next];nums[next] = prev;prev = temp;      // 更新 prev 为新位置的原来值current = next;   // 更新 current 为新位置的索引count++;} while (start != current);   // 回到起始位置时,说明当前的环状替换完成,退出内层循环}
}int main() 
{int nums[] = {1, 2, 3, 4, 5, 6, 7};int numsSize = sizeof(nums) / sizeof(nums[0]);int k = 3;rotate(nums, numsSize, k);for (int i = 0; i < numsSize; i++) {printf("%d ", nums[i]);}printf("\n");return 0;
}​
  • 索引 :0→3→6→2→5→1→4→0
  • 元素 :1→4→7→3→6→2→5→1

  • 时间复杂度:O(n)( n 是数组长度)
  • 空间复杂度:O(1)

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

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

相关文章

23种设计模式一览【设计模式】

文章目录 前言一、创建型模式&#xff08;Creational Patterns&#xff09;二、结构型模式&#xff08;Structural Patterns&#xff09;三、行为型模式&#xff08;Behavioral Patterns&#xff09; 前言 设计模式是软件工程中用来解决特定问题的一组解决方案。它们是经过验证…

Beyond Compare for mac v5.0.6.30713 文件对比利器 支持M、Intel芯片

Mac毒搜集到的Beyond Compare是一套超级的文件及文件夹(目录)的比较工具&#xff0c;不仅可以快速比较出两个目录的不同&#xff0c;还可以比较每个文件的内容&#xff0c;而且可以任意显示比较结果。 应用介绍 程序内建了文件浏览器&#xff0c;方便您对文件、文件夹、压缩包…

ProfibusDP主站转ModbusTCP网关如何进行数据互换

ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域&#xff0c;通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准&#xff0c;广泛应用于工业控制网络中&#xff1b;而Modbus TCP作为基于以太网的通信协议&#xff0c;因其简单易…

【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理

华为w515麒麟芯片版&#xff0c;还有非麒麟芯片版本&#xff0c;是一款信创电脑&#xff0c;一般安装的UOS系统。 准备一个空U盘&#xff0c;先下载镜像文件及启动盘制作工具&#xff0c;连接如下&#xff1a; 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…

数据结构秘籍(四) 堆 (详细包含用途、分类、存储、操作等)

1 引言 什么是堆&#xff1f; 堆是一种满足以下条件的树&#xff1a;&#xff08;树这一篇可以参考我的文章数据结构秘籍&#xff08;三&#xff09;树 &#xff08;含二叉树的分类、存储和定义&#xff09;-CSDN博客&#xff09; 堆中的每一个结点值都大于等于&#xff08…

服务器数据恢复—raid5阵列中硬盘掉线导致上层应用不可用的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某公司一台服务器&#xff0c;服务器上有一组由8块硬盘组建的raid5磁盘阵列。 磁盘阵列中2块硬盘的指示灯显示异常&#xff0c;其他硬盘指示灯显示正常。上层应用不可用。 服务器数据恢复过程&#xff1a; 1、将服务器中所有硬盘编号…

全网独家:zabbixV7版本容器服务器无法访问Postgres V17数据库的问题解决

近期将zabbix平台从V6.2.6升级到7.2.4&#xff0c;遇到问题“PostgresoL server is not available. Waiting 5seconds”&#xff0c;容器无法访问Postgres V17数据库&#xff0c;本文记录问题解决过程。 一、系统环境 1、数据库版本 数据库版本&#xff1a;postgres-17.4-tim…

进程控制 ─── linux第15课

目录 进程控制 1.进程创建 (fork前面讲过了) 写时拷贝 进程终止 进程退出场景 退出码 进程终止方法 进程控制 1.进程创建 (fork前面讲过了) 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父…

Hive-07之企业级调优

⭐️⭐️⭐️⭐️hive的企业级调优 1、Fetch抓取 Fetch抓取是指&#xff0c;Hive中对某些情况的查询可以不必使用MapReduce计算 例如&#xff1a;select * from score;在这种情况下&#xff0c;Hive可以简单地读取employee对应的存储目录下的文件&#xff0c;然后输出查询结果…

华为云 | 快速搭建DeepSeek推理系统

DeepSeek&#xff08;深度求索&#xff09;作为一款国产AI大模型&#xff0c;凭借其高性能、低成本和多模态融合能力&#xff0c;在人工智能领域崛起&#xff0c;并在多个行业中展现出广泛的应用潜力。 如上所示&#xff0c;在华为云解决方案实践中&#xff0c;华为云提供的快速…

Spring Boot 3 整合 MinIO 实现分布式文件存储

引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心&#xff0c;而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…

3月5日作业

代码作业&#xff1a; #!/bin/bash# 清空目录函数 safe_clear_dir() {local dir"$1"local name"$2"if [ -d "$dir" ]; thenwhile true; doread -p "检测到 $name 目录已存在&#xff0c;请选择操作&#xff1a; 1) 清空目录内容 2) 保留目…

达梦数据库关于参数PK_WITH_CLUSTER的改动分析

目录 1、PK_WITH_CLUSTER取值为0 2、PK_WITH_CLUSTER取值为1 达梦数据库的参数PK_WITH_CLUSTER在最近使用过程中发现与前期使用的版本存在差异&#xff0c;特此测试分析一下。具体哪个版本改动的暂未得知。 PK_WITH_CLUSTER&#xff0c;默认值为0&#xff0c;动态会话级参数。…

android11使用gpio口控制led状态灯

目录 一、简介 二、解决方法 A、底层驱动 B、上层调用 C、验证 一、简介 1、需求&#xff1a;这里是用2个gpio口来控制LED灯&#xff0c;开机时默认亮蓝灯&#xff0c;按开机键&#xff0c;休眠亮红灯&#xff0c;唤醒亮蓝灯。 原理图&#xff1a; 这里由于主板上电阻R63…

windows 利用nvm 管理node.js 2025最新版

1.首先在下载nvm 下载链接 2. 下载最新版本的nvm 3. 同意协议 注意&#xff1a;选择安装路径 之后一直下一步即可 可以取消勾选 open with Powershell 勾选后它会自动打开Powershell 这里选用cmd 输入以下命令查看是否安装成功 nvm version 查看已经安装的版本 我之前自…

MySQL ——数据的增删改查

一、DML语言 1.1 insert插入数据 语法&#xff1a;insert [into] 表名 [字段名] values(值列表)&#xff1b; 插入一行数据 第一种&#xff1a;insert into file1(id,name,age) values (1,‘aa’,11); 第二种&#xff1a;insert into file1 values(1,‘aa’,11); 插入多行数…

【CF记录】贪心——A. Scrambled Scrabble

https://codeforces.com/contest/2045/problem/A 思路&#xff1a; 由于Y有两种选择&#xff0c;NG也是&#xff0c;那我们可以枚举以下情况&#xff1a;选i个Y做辅音&#xff0c;j个NG做辅音 然后贪心选择最长的即可&#xff0c;观察到S最长为5000&#xff0c;即使是也不会…

C语言【指针篇】(四)

前言&#xff1a;正文1. 字符指针变量2. 数组指针变量2.1 数组指针变量是什么?2.2 数组指针变量怎么初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 两段有趣的代码4.3.1 typedef关键字 5. 函数指针数组6. 转移表 总结 前言&am…

Flutter 学习之旅 之 flutter 不使用插件,简单实现一个 Toast 功能

Flutter 学习之旅 之 flutter 不使用插件&#xff0c;简单实现一个 Toast 功能 目录 Flutter 学习之旅 之 flutter 不使用插件&#xff0c;简单实现一个 Toast 功能 一、简单介绍 二、简单介绍 Toast 1. 确保正确配置 navigatorKey 2. 避免重复显示 Toast 3. 确保 Toast …

《OpenCV》——dlib(人脸应用实例)

文章目录 dlib库dlib库——人脸应用实例——表情识别dlib库——人脸应用实例——疲劳检测 dlib库 dlib库的基础用法介绍可以参考这篇文章&#xff1a;https://blog.csdn.net/lou0720/article/details/145968062?spm1011.2415.3001.5331&#xff0c;故此这篇文章只介绍dlib的人…