当前位置: 首页 > news >正文

数据结构(时空复杂度)

目录

一、算法复杂度

二、时间复杂度

1.不同时间度代码举例

三、空间复杂度

一、算法复杂度

        算法复杂度(评估算法优劣一个重要指标)分为时间复杂度和空间复杂度。
        时间复杂度是指执行算法所需要的计算工作量,而空间复杂度是指执行这个算法所需要的内存空间。
        算法的复杂性体运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。

二、时间复杂度

        一个算法所需的运算时间通常与所解决问题的规模大小有关,即与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。

常见的算法时间复杂度由小到大依次为:
Ο(1)<Ο(log 2n)<Ο(n)<Ο(n log⁡2n)<Ο(n^2)<Ο(n^3) < Ο(2^n) < Ο(n!)

1.不同时间度代码举例

#include <stdio.h>// O(1) 常数时间 - 访问数组元素
int access_element(int arr[], int size) {return arr[0];
}// O(log n) 对数时间 - 二分查找
int binary_search(int arr[], int left, int right, int target) {while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target)return mid;if (arr[mid] < target)left = mid + 1;elseright = mid - 1;}return -1;
}// O(n) 线性时间 - 遍历数组
void traverse_array(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}// O(n log n) 线性对数时间 - 归并排序
void merge(int arr[], int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;int L[n1], R[n2];for (int i = 0; i < n1; i++)L[i] = arr[left + i];for (int j = 0; j < n2; j++)R[j] = arr[mid + 1 + j];int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}while (i < n1) {arr[k] = L[i];i++;k++;}while (j < n2) {arr[k] = R[j];j++;k++;}
}void merge_sort(int arr[], int left, int right) {if (left < right) {int mid = left + (right - left) / 2;merge_sort(arr, left, mid);merge_sort(arr, mid + 1, right);merge(arr, left, mid, right);}
}// O(n²) 平方时间 - 冒泡排序
void bubble_sort(int arr[], int size) {for (int i = 0; i < size - 1; i++)for (int j = 0; j < size - i - 1; j++)if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}
}// O(n³) 立方时间 - 矩阵乘法
void matrix_multiply(int a[][10], int b[][10], int result[][10], int n) {for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)for (int k = 0; k < n; k++)result[i][j] += a[i][k] * b[k][j];
}// O(2^n) 指数时间 - 汉诺塔问题
void hanoi(int n, char source, char auxiliary, char target) {if (n > 0) {hanoi(n - 1, source, target, auxiliary);printf("Move disk %d from %c to %c\n", n, source, target);hanoi(n - 1, auxiliary, source, target);}
}// O(n!) 阶乘时间 - 排列 (部分示例)
void permute(int arr[], int start, int end) {if (start == end) {for (int i = 0; i <= end; i++)printf("%d ", arr[i]);printf("\n");return;}for (int i = start; i <= end; i++) {int temp = arr[start];arr[start] = arr[i];arr[i] = temp;permute(arr, start + 1, end);temp = arr[start];arr[start] = arr[i];arr[i] = temp;}
}

三、空间复杂度

一个算法的空间复杂度是指程序运行开始到结束所需要的存储空间。包括算法本身所占用的存储空间、输入/输出占用的存储空间以及算法在运行过程中的工作单元和实现算法所需辅助空间。

http://www.dtcms.com/a/351313.html

相关文章:

  • VMware 中 Ubuntu 右上角网络图标消失的 5 种终极修复方案
  • 腾讯开源OpenTenBase深度实践:企业级分布式HTAP数据库部署全攻略
  • 【URP】Unity超分辨率优化实践
  • 【yocto】Yocto Project 核心:深入了解.bbclass文件
  • 云蝠智能 Voice Agent:多语言交互时代的AI智能语音呼叫
  • 病理软件Cellprofiler使用教程
  • 【系统编程】线程控制原语
  • 半小时打造七夕传统文化网站:Qoder AI编程实战记录
  • Ansible配置文件
  • 2025第五届人工智能、自动化与高性能计算国际会议 (AIAHPC 2025)
  • YUM配置
  • 适配欧拉操作系统
  • 高频面试题:说一下线程池吧?(线程池原理,核心参数,创建方式,应用场景都要说到才能让面试官心服口服)
  • 什么是AQS?
  • Xposed框架实战指南:从原理到你的第一个模块
  • R语言使用随机森林对数据进行插补
  • 【Java基础】Java数据结构深度解析:Array、ArrayList与LinkedList的对比与实践
  • 【HarmonyOS NEXT】打包鸿蒙应用并发布到应用市场
  • 构建生产级 RAG 系统:从数据处理到智能体(Agent)的全流程深度解析
  • Linux 网络数据收发全栈工具书:从 nc、socat 到 iperf3 的 Buildroot 路径与跨平台实战
  • 开心实习之第三十二天
  • Python爬虫实战:Uiautomator2 详解与应用场景
  • Android SystemServer 系列专题【篇四:SystemServerInitThreadPool线程池管理】
  • android 事件分发源码分析
  • STL库——vector(类函数学习)
  • 【51单片机】萌新持续学习中《矩阵 密码锁 点阵屏》
  • 矩阵初等变换的几何含义
  • 血缘元数据采集开放标准:OpenLineage Integrations Apache Spark Configuration Usage
  • 重写BeanFactory初始化方法并行加载Bean
  • 信息网络安全视角下的在线问卷调查系统设计与实践(国内问卷调查)