时间复杂度是指算法执行语句执行的次数。

常见的时间复杂度有以下几种:

描述

时间复杂度

常数阶

O(1)

对数阶

O(logn)

线性阶

O(n)

线性对数阶

O(nlogn)

平方阶

O(n²)

立方阶

O(n³)

n次方阶

O(mⁿ)

指数阶

O(2ⁿ)

阶乘阶

O(n!)

(1) O(1)

O(1)是常量级时间复杂度的一种表示方法,并非只执行一行代码。

代码执行时间不是随着n的增大而增大,这样的代码的时间复杂度都是O(1)。

注意:通常只要算法中不存在循环、递归,即使代码有很多行,时间复杂度仍是O(1)

(2) O(logn)、O(nlogn)对数阶时间复杂度

int i = 1;

while(i<=n){

i=i*2;

}

代码line3是执行次数最多的,只要算出第3行执行的次数,它代表的就是整个代码的时间复杂度。i从1开始取值,每一次循环乘以2。可以看到 i=i*2是一个等比数列,即:2º 2¹  2² ...... 2^k = n。只要算出k是多少,就是执行的次数了  2^k=n -->k=log2n,所以时间复杂度应该为O(log2n)。

int i = 1;

while(i<=n){

i=i*5;

}

很容易就能看出来,应该是O(log5n)。但是上面的O(log2n)和O(log5n)可以通过换底公式换成以2为底的对数,且可以忽略系数,所以都记做 O(logn)。

关于O(nlogn),就是把上面的代码在循环执行n遍了。其中归并排序、快速排序的时间复杂度就是O(nlogn)

(3)O(m+n)、O(m*n)

1. 加法法则(量级最大法则):总复杂度等于量级最大的那段代码的复杂度。

public static Integer getSum(Integer n){

int sum1 = 0;

int sum2 = 0;

for (int i = 0; i < 1000; i++){

sum1 += i;

}

for (int i = 0; i < n; i++){

for (int j = 0; j < n; j++){

sum2 += i*j;

}

}

return sum1 + sum2;

}

sum1和sum2分别是 O(n)和O(n²),对于这三个,我们取量级最大的O(n²),所以总的时间复杂度就等于量级最大的那段代码的时间复杂度。

2.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积 。

public static Integer getSum(Integer n){

int sum = 0;

for (int i = 0; i < n; i++){

sum += func(i);

}

return sum;

}

public static Integer func(Integer x){

int sum = 0;

for (int i = 0; i < x; i++){

sum += i^2;

}

return sum;

}

func()函数的时间复杂度是 T1(n)=O(n),如果先把func()函数看成简单的操作,则getSum()函数的时间复杂度是T2(n)=O(n),所以整个getSum()函数的时间复杂度是T(n)=T2(n)*T1(n)=O(n*n)=O(n^2)

3.循环不仅与n有关,还与执行循环所满足的判断条件有关。

public static Integer func(Integer x, Integer[] arr){

int sum = 0;

int i=0;

while (i < x && arr[i]!=1)

{

i++;

sum += arr[i];

}

return sum;

}

在此循环,如果arr[i]不等于1的话,时间复杂度是O(n)。如果arr[i]等于1的话,则循环执行一次判断跳出,时间复杂度是O(1)。

常见算法的时间复杂度以及空间复杂度如下:

附:

链表实现与时间复杂度分析

数组算法时间复杂度

红黑树的插入和遍历时间复杂度分析

java数组的时间复杂度_java时间复杂度计算相关推荐

  1. java数组设置结束_Java 数组最佳指南,快收藏让它吃灰

    两年前,我甚至写过一篇文章,吐槽数组在 Java 中挺鸡肋的,因为有 List 谁用数组啊,现在想想那时候的自己好幼稚,好可笑.因为我只看到了表面现象,实际上呢,List 的内部仍然是通过数组实现的, ...

  2. java数组末尾添加元素_java数组添加元素,java数组如何添加一个元素

    java数组如何添加元素 向数组里添加一个元素怎么添加,这儿总结有三种方法: 1.一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度. 但有个可以改变大小的数组为ArrayLis ...

  3. java数组的声明_Java数组定义常用方法

    Java数组定义常用方法 Java中的数组.是一种简单的线性数据存储结构.他用牺牲自动扩展大小来换取与集合相比的唯一优势--查询效率的提升.Java中的数组有什么类型?我们要怎么定义这些数组呢?下面跟 ...

  4. java数组长度定义_java怎么定义数组的长度?java中的数组长度问题

    之前对Java中的数组一直是一知半解,特别是数组中的长度问题.今天对这个问题也算是小有理解,算是对java数组的有了更进一步的了解吧.不说了,先来例子再说:package com.test; publ ...

  5. java 数组对象长度_Java中的数组长度:关于Java中数组长度的所有信息

    Java中的数组可以包含多个元素,这取决于对象是如何创建的.为了让用户执行不同的操作,必须知道数组的长度.这篇关于"Java中的数组长度"的文章旨在让我们熟悉用于获取数组长度的操 ...

  6. java数组希尔排序及时间复杂度

    希尔排序是由插入排序延伸而来的,因为插入排序的最后一个数要是最小数就要把它一步一步的插入到最前面,太浪费时间,所以希尔排序是对他进行分组,让它们每次隔一半进行交换(即每次相邻数组长度一半的两个数进行比 ...

  7. java数组的插入排序以及时间复杂度

    插入排序的思想是把前面的排好依次往下进行遍历,发现比最后一个数小的把它插入排好序的最后一个数的前面,此时排好的数组可能已经不再有序,就对它进行维护,以此重复上述操作 具体步骤:定义一个指针i,再定义一 ...

  8. java数组相似度_Java 计算两个字符串的相似度

    问题 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程度.我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把"a&qu ...

  9. java 数组怎么求和_java数组求和怎么解决?有哪些方式?

    Java经典题目之一,数组的各种求和,今天小编就用一些例子带大家了解一下其中详情. 基础求和#include using namespace std; //数组求和 //方法一:时间复杂度为O(n), ...

最新文章

  1. Mastering Algorithms with C中文版附带源码说明
  2. React学习笔记2:React面向组件编程
  3. php-fpm 进程通讯,PHP-FPM进程模型解析
  4. ubuntu18.04.4 中 下载 github 代码 并创建 python 虚拟环境virtualenv
  5. 邮件防伪SPF,反垃圾邮件
  6. SpringBoot(配置druid数据源、配置MyBatis、事务控制、druid 监控)
  7. 服务链路追踪(Spring Cloud Sleuth)
  8. P3978 [TJOI2015]概率论(生成函数)
  9. Ajax解析laravelJSON,3分钟短文:Laravel请求体内JSON格式数据的处理办法
  10. db2导入发生错误显示不是绝对路径_python编程常见错误总结
  11. Spark记录-Scala记录(基础程序例子)
  12. 【数据分析】脑图简介数据处理
  13. mysql知识点拾遗梳理
  14. 10个痛点:IT部门如何面对边缘计算
  15. MySQL基础3-SQL语言
  16. c语言编程运行符号是什么,c语言编程用的符号有哪些
  17. python抽签小程序
  18. 【渝粤题库】陕西师范大学800010 经济地理学
  19. php 设置针式打印机纸张,针式打印机设置方法 针式打印机打印连续纸设置技巧【图文】...
  20. Java 下数据业务逻辑开发技术 JOOQ 和 SPL

热门文章

  1. HTML-jQuery入门
  2. 数学建模:9 多元线性回归分析
  3. C#操作Word模板文件 替换并重新生成
  4. 【日拱一卒行而不辍20220926】自制操作系统
  5. 小程序登录授权获取用户信息
  6. 终于把PID的原理搞懂了
  7. 数字图像处理笔记(一)——图像存储空间,分辨率,图像内插
  8. 生成模型-解码策略小结
  9. LeetCode 每日一题1006. 笨阶乘
  10. 介绍python中几种遍历列表的for循环方法