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

悟的复杂度分析

复杂度分析:

                时间复杂度(算法中的基本操作的执行次数);

                空间复杂度。

时间复杂度:

实际上我们计算时间复杂度时,我们其实并不需要计算准确的执行次数,只需要大概的执行次数,因此我们在这里使用大O的渐进表示法。常见的时间复杂度O(1), O(N²), O(N),         O(logN)。

大O符号:

是用于描述函数渐进行为的数学符号。

推导大O阶方法:

1.用常数1取代运行时间中的所有加法常数;

例:

计算下面代码的时间复杂度

void f(int N)
{int count = 0;for(int k = 0; k < 100; ++k){++count;}
}

答案:O(1)

注:确定的常数次,都是O(1)。

2.在修改后的运行次数函数中,只保留最高阶项;

例:

计算下面代码的时间复杂度

void f(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", count);
}

答案:O(N²)

注:准确的执行次数:N² + 2 * N + 10

     随着N的增大,这个表达式中N²对结果的影响最大

3.若最高阶项存在且不是1,则去除与这个项相乘的常数。得到的结果就是大O阶。

例:

计算下面代码的时间复杂度

void f(int N)
{int count = 0;for (int k = 0; k < 2 * N; ++k){count++;}int M = 10;while (M--){++count;}printf("%d", count);
}

答案:O(N)

特殊情况:

例一:

计算下面代码的时间复杂度

void f(int N, int M)
{int count = 0;for (int k = 0; k < N; k++){++count;}for (int k = 0; k < M; k++){++count;}
}

答案:O(M + N)

注:假如给了条件:M远大于N,答案是O(M);M和N差不多大,O(M)或O(N)。

例二:

计算下面代码的时间复杂度

const char* s(const char* str, char cha)
{while (*str != '\0'){if (*str == cha){return str;}++str;}return NULL;
}

假设字符串长度是N。

答案:O(N)

注:有些算法的时间复杂度存在最好,平均,最坏情况:

        最坏:O(N)

        平均:O(N/2)

        最好:O(1)

在实际中一般情况关注的是算法的最坏运行情况。

例三:

计算下面代码的时间复杂度

void B(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){break;}}
}

答案:O(N²)

注:第一趟冒泡:N

       第二趟冒泡:N - 1

       ........ 

      第N趟:1

以上是个等差数列,所以准确的次数是(N+1)*N/2

时间复杂度为O(N²)

例四:

计算下面代码的时间复杂度

int B(int* a, int n, int x)
{assert(a);int begin = 0;int end = n;while (begin < end){int mid = begin + ((end - begin) >> 1);if (a[mid] < x){begin = mid + 1;}else if (a[mid] > x){end = mid;}else{return mid;}}return - 1;
}

答案:O(logN)

注:假设找了X次

2的X的平方 = N

X=logN

因为有很多地方不好写底数,所以一般省略简写成logN。 

例五:

计算下面代码的时间复杂度

long long f(size_t N)
{return N < 2 ? N : f(N - 1) * N;
}

答案:O(N²)

注:递归调用了N次,每次递归运算--》O(1)

整体就是O(N)。

http://www.lryc.cn/news/276940.html

相关文章:

  • 《网络是怎样连接的》2.5节图表(自用)
  • java 音乐会售票平台系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目
  • 鸿蒙开发解决agconnect sdk not initialized. please call initialize()
  • 秋招阿里巴巴java笔试试题-精
  • 018、通用集合类型
  • 【Leetcode】236.二叉树的最近公共祖先
  • C#,入门教程(11)——枚举(Enum)的基础知识和高级应用
  • java SSM水质历史数据可视化设计myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • C++推箱子游戏开发
  • Kotlin函数式接口
  • 2024年1月9日学习总结
  • Nacos使用MySQL8时区问题导致启动失败
  • 在k8s集群中部署多nginx-ingress
  • SLF4J Spring Boot日志框架
  • mysql之导入导出远程备份
  • Java虚拟机ART 读书笔记 第2章 深入理解Class文件格式
  • 编程基础 - 初识Linux
  • c yuv422转yuv420p
  • 计算机网络 - 路由器查表过程模拟 C++(2024)
  • 实现pytorch版的mobileNetV1
  • vue多tab页面全部关闭后自动退出登录
  • 记一个集群环境部署不完整导致的BUG
  • Go zero copy,复制文件
  • http协议九种请求方法介绍及常见状态码
  • 详解flink exactly-once和两阶段提交
  • Qt/QML编程学习之心得:QDbus实现service接口调用(28)
  • 前端nginx配置指南
  • 接口测试到底怎么做,5分钟时间看完这篇文章彻底搞清楚
  • 显示管理磁盘分区 fdisk
  • Hyperledger Fabric 管理链码 peer lifecycle chaincode 指令使用