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

java数据结构(复杂度)

 一.时间复杂度和空间复杂度

1.时间复杂度

衡量一个程序好坏的标准,除了能处理各种异常,还有就是时间效率,当然,对于一些配置好的电脑数据处理起来就是比配置低的高,但从后期发展来看,当数据量足够庞大时,对于时间效率的作用就显得十分重要了。

1.大O渐进表示法

  Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.println("H");
            }
        }
        for (int i = 0; i < n; i++) {
            System.out.println("w");
        }
        for (int i = 0; i < 3; i++) {
            System.out.println("w");
        }

我们来看一下这个代码的运行次数。

运行次数:n*n + n +3

 在计算时间复杂度时我们会优先忽略掉对整体影响不大的值,如该运行次数中的3,我们将其忽略,另外因为n平方为指数函数,相比于n这个常函数,指数函数能更好的表达时间复杂度,所以我们将其忽略。

2.推导方法

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

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

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

具体怎么用呢?

比方说我们的上一个代码时间复杂度就是O(n^2)。

  Scanner scanner = new Scanner(System.in);
        int  n = scanner.nextInt();
        for (int i = 0; i < 2*n; i++) {
            System.out.println("j");
        }
        System.out.println("Hello");

这个代码是:2*n + 1.时间复杂度是O(n);

for (int i = 0; i < 100; i++) {
            System.out.println("Hello");
        }

运行次数:100,时间复杂度:O(1);

Scanner scanner = new Scanner(System.in);
        int  n = scanner.nextInt();
        int m = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            System.out.println("j");
        }
        for (int i = 0; i < m; i++) {
            System.out.println("Hello");
        }

运行次数:m+n,时间复杂度:O(m+n);

  int[] array = {1,2,3,4,5,6,7,8,9,0};
        Scanner scanner = new Scanner(System.in);
        int  n = scanner.nextInt();
        scanner.nextLine();
        int left = 0;
        int right = array.length - 1;
        while(left < right){
            int mid = left + (right - left) / 2 ;
            if ( n > mid){
                left = mid;
            }
            if (n < mid){
                right = mid;
            }
            if (n == mid){
                System.out.println("找到了是:" + mid);
                break;
            }

我们发现次数为x次时,n / 2^x = 1,所以时间复杂度为O(log n) ;

int fib (int N) {
return N < 2 ? N : factorial(N-1) * N;
}

次数为n次,所以时间复杂度为O(n);

int fibonacci(int N) {
return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}

 

我们发现它实际上是这样执行的我们用红色圈出来的那部分没有遵循我们之前的规则,但由于时间复杂度是估算的,所以我们也就忽略了着误差。我们发现程序执行的次数是一个等差数列,所以我们用到了等差数列的求和公式,再根据大O推到得出时间复杂度为O(N^2);

空间复杂度

空间复杂度算的是临时开辟了多少空间,多少个变量。

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;
}

开辟了常数个变量,所以空间复杂度为O(1);

long factorial(int N) {
return N < 2 ? N : factorial(N-1)*N;
}

 开辟了N个变量,所以为O(n);

相关文章:

  • object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别
  • R语言零基础系列教程-01-R语言初识与学习路线
  • LinuX---Shell正则表达式
  • Redis能否替代MySQL作为主数据库?深入解析两者的持久化差异与适用边界——基于AOF持久化与关系型数据库的对比
  • Java多线程——线程同步
  • 【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现
  • 从零实现Kafka延迟队列:Spring Boot整合实践与原理剖析
  • Golang倒腾一款简配的具有请求排队功能的并发受限服务器
  • 【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式
  • 系统架构设计师—案例分析—数据库篇—关系型数据库设计
  • 蓝桥杯Python赛道备赛——Day5:算术(一)(数学问题)
  • NO.39十六届蓝桥杯备战|结构体八道练习|加号小于号运算符重载|自定义排序(C++)
  • 如何设计可扩展、高可靠的移动端系统架构?
  • 选择循环汇编
  • 2023华东师范大学计算机复试上机真题
  • PHP中的命令行工具开发:构建高效的脚本与工具
  • 具身沟通——机器人和人类如何通过物理交互进行沟通
  • C# 模块里cctor函数: mono_runtime_run_module_cctor
  • c语言笔记 字符串函数---strcmp,strncmp,strchr,strrchr
  • Django REST Framework 中 ModelViewSet 的接口方法及参数详解,继承的方法和核心类方法,常用查询方法接口
  • 透视社会组织创新实践中的花开岭现象:与乡村发展的融合共进
  • 玉渊谭天丨卢拉谈美国降低对华关税:中国的行动捍卫了主权
  • 国际能源署:全球电动汽车市场强劲增长,中国市场继续领跑
  • 国台办:民进党当局刻意刁难大陆配偶,这是不折不扣的政治迫害
  • 小米SU7 Ultra风波升级:数百名车主要求退车,车主喊话雷军“保持真诚”
  • 美国三大指数全线高开:纳指涨逾4%,大型科技股、中概股大涨