【时间复杂度】定义与计算方法

文章目录

  • 1.什么是时间复杂度?
  • 2.时间复杂度类别
    • 2.1 常量阶 O(1)
    • 2.2 对数阶 O(log n)
    • 2.3 线性阶 O(n)
    • 2.4 线性对数阶 O(n log n)
    • 2.5 平方阶 O(n^2^)

1.什么是时间复杂度?

时间复杂度是计算机科学中用来描述算法执行时间效率的一个概念。它表示了算法执行时间与输入数据量之间的关系,通常用大O符号(Big O notation)来表示。

在这里插入图片描述

2.时间复杂度类别

复杂度排序:
O(1) < O(log n) < O(n) < O(n log n) < O(n2) < O(2n) < O(n!)

2.1 常量阶 O(1)

public class ArrayAccessExample {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        // 访问数组的第一个元素,时间复杂度为 O(1)
        System.out.println(array[0]);
    }
}

代码不会因为n输入的多少时间发生改变,只执行一次。故为O(1)。

2.2 对数阶 O(log n)

public class SimpleBinarySearchExample {
    public static void main(String[] args) {
        // 一个已排序的数组
        int[] sortedArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int target = 5;
        boolean found = binarySearch(sortedArray, target);
        if (found) {
            System.out.println("Element found in the array.");
        } else {
            System.out.println("Element not found in the array.");
        }
    }
    
    public static boolean binarySearch(int[] array, int target) {
        int left = 0;
        int right = array.length - 1;
        while (left <= right) {
            // 找到中间索引
            int mid = left + (right - left) / 2;
            
            // 检查中间元素
            if (array[mid] == target) {
                return true; // 找到目标值,返回true
            } else if (array[mid] < target) {
                left = mid + 1; // 调整左边界
            } else {
                right = mid - 1; // 调整右边界
            }
        }
        
        // 如果循环结束时没有找到目标值,则返回false
        return false;
    }
}

时间复杂度按照 对数级 递减。

2.3 线性阶 O(n)

public class LinearComplexityExample {
    public static void main(String[] args) {
        // 定义一个数组
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        // 计算数组元素的总和
        int sum = calculateSum(array);
        System.out.println("The sum of the array elements is: " + sum);
    }
    
    public static int calculateSum(int[] array) {
        int sum = 0;
        // 遍历数组,累加每个元素
        for (int i = 0; i < array.length; i++) {
            sum += array[i];
        }
        return sum;
    }
}

因为数组中的每个元素都被访问了一次,所以这个函数的时间复杂度是O(n),其中n是数组的长度。

2.4 线性对数阶 O(n log n)

public class QuickSort {

    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            // 找到基准值的位置
            int pivotIndex = partition(arr, low, high);
            // 递归排序左半部分
            quickSort(arr, low, pivotIndex - 1);
            // 递归排序右半部分
            quickSort(arr, pivotIndex + 1, high);
        }
    }

    private static int partition(int[] arr, int low, int high) {
        // 选择最后一个元素作为基准
        int pivot = arr[high];
        int i = low; // 比基准小的元素的索引

        for (int j = low; j < high; j++) {
            // 如果当前元素小于或等于基准
            if (arr[j] <= pivot) {

                // 交换 arr[i] 和 arr[j]
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
            }
        }
        // 交换 arr[i+1] 和 arr[high] (或基准)
        int temp = arr[i];
        arr[i] = arr[high];
        arr[high] = temp;

        return i ;
    }

    // 测试快速排序
    public static void main(String[] args) {
        int[] arr = {10, 7, 8, 9, 1, 5};
        int n = arr.length;

        quickSort(arr, 0, n - 1);

        System.out.println("Sorted array: ");
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

快速排序法的平均时间复杂度为O(n log n)

如果基准值每次都能将数组分成大致相等的两部分,那么递归树的深度将是log n,每次分区操作的时间复杂度是O(n),因此总体的时间复杂度是O(n log n)
但在最坏的情况下(比如数组已经是正序或逆序时),时间复杂度会退化为O(n2)

2.5 平方阶 O(n2)

public class PairProductExample {
    public static void main(String[] args) {
        // 定义一个数组
        int[] array = {1, 2, 3, 4, 5};
        // 计算并打印所有可能的数对乘积
        printPairProducts(array);
    }
    
    public static void printPairProducts(int[] array) {
        int n = array.length;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 打印当前数对的乘积
                System.out.println("Product of pair (" + array[i] + ", " + array[j] + ") = " + (array[i] * array[j]));
            }
        }
    }
}

外循环遍历数组的每个元素,而内循环则遍历数组中的每个元素,与外循环的当前元素形成一对,并计算它们的乘积。因为这两个循环都是线性的,所以总体的时间复杂度是O(n^2)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

借助调试工具理解BLE协议_3.Windows BLE调试工具

1.调试工具下载 Windows BLE调试工具是一款运行在Windows下的BLE调试软件&#xff0c;实现了扫描、连接、获取BLE设备上的服务以及向服务写入和读取数据的功能。图1是Windows BLE调试工具主界面。资源地址&#xff1a; https://download.csdn.net/download/mecompu/86508009?…

CogVLM2多模态开源大模型部署与使用

CogVLM2多模态开源大模型部署与使用 项目简介 CogVLM2 是由清华大学团队发布的新一代开源模型系列。2024年5月24日&#xff0c;发布了Int4版本模型&#xff0c;只需16GB显存即可进行推理。2024年5月20日&#xff0c;发布了基于llama3-8b的CogVLM2&#xff0c;性能与GPT-4V相当…

AI时代下的智能商品计划管理

在时尚产业迅猛发展的今天&#xff0c;商品计划已成为品牌运营不可或缺的一环。优秀的服装品牌通过精心策划的商品计划&#xff0c;不仅致力于为消费者提供独特且符合其需求的产品&#xff0c;同时也在不断探索如何更有效地整合企业资源&#xff0c;确保从设计、研发、采购到生…

可视化数据科学平台在信贷领域应用系列二:数据清洗

上一篇文章中&#xff0c;某互联网银行零售信贷风险建模专家使用数据科学平台Altair RapidMiner——完成了数据探索工作&#xff0c;《可视化数据科学平台在信贷领域应用系列一&#xff1a;数据探索》。本次这位建模专家再次和大家分享数据准备的第二步骤&#xff0c;数据清洗。…

揭秘HubSpot集客营销:如何吸引并转化全球潜在客户

随着全球数字化浪潮的推进&#xff0c;企业出海已经成为许多公司扩大市场、增加品牌曝光度的重要战略。HubSpot集客营销作为一种以客户为中心、数据驱动的营销策略&#xff0c;为企业在海外市场的成功提供了强有力的支持。作为HubSpot亚太地区的合作伙伴&#xff0c;NetFarmer将…

小熊家务帮day5-day7 客户管理模块1 (小程序认证,手机验证码认证,账号密码认证,修改密码,找回密码等)

客户管理模块 1.认证模块1.1 认证方式介绍1.1.1 小程序认证1.1.2 手机验证码登录1.1.3 账号密码认证 1.2 小程序认证1.2.1 小程序申请1.2.2 创建客户后端工程jzo2o-customer1.2.3 开发部署前端1.2.4 小程序认证流程1.2.4.1 customer小程序认证接口设计Controller层Service层调用…

TCP三次握手、四次分手

TCP三次握手、四次挥手 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;用于在网络上建立可靠的数据传输通道。在TCP/IP协议族中&#xff0c;TCP负责在数据传输过程中提供可靠性和完整性保证。TCP…

python协程入门实战详解

本章将以通俗易懂、贴合实际的方式介绍以下内容&#xff1a; 协程是什么&#xff0c;有什么特点&#xff0c;协程的优势是什么如何理解事件和事件循环协程的创建方式&#xff0c;如何控制协程的并发量在协程中使用aiohttp发送HTTP请求aiohttp案例协程中的异常处理&#xff0c;…

flowable工作流 完成任务代码 及扩展节点审核人(实现多级部门主管 审核等)详解【JAVA+springboot】

低代码项目 使用flowable 工作流 完成任务代码 详解 可以看到 complete()方法 传递了流程变量参数var 前端传递此参数就可以实现 流程中 审批 更新流程变量参数var 也可以进行更多扩展 实现流程中更新表单内容功能 启动流程实例代码 实现对于流程自定义 动态节点审核人 功…

五款效率软件助你事半功倍

1、&#x1f517; 亿可达 作为一款自动化工具&#xff0c;亿可达被誉为国内版的免费Zaiper。它允许用户无需编程知识即可将不同软件连接起来&#xff0c;构建自动化的工作流程。其界面设计清新且直观&#xff0c;描述语言简洁易懂&#xff0c;使得用户可以轻松上手。 2、&…

剪画小程序:干货丨3款照片转换成动漫形象的工具,赶紧收藏!

打开工具剪画&#xff0c;主页找到“照片转动漫”功能&#xff0c;上传图片即可转为漫画照片 有多种动漫模型&#xff0c;包括动漫、普通、艺术风、素描风等&#xff0c;还有更多趣味玩法如黏土风、3D风、Jade(玉石风)、WaterColor&#xff08;水彩风&#xff09;等等 照片就漫…

Redis之常用实战场景

1.Redis数据丢失场景 1.1 持久化丢失 采用RDB或者不持久化&#xff0c;就会有数据丢失&#xff0c;因为是手动或者配置以快照的形式来进行备份。 解决: 启用AOF&#xff0c;以命令追加的形式进行备份&#xff0c;但是默认也会有1s丢失&#xff0c;这是在性能与数据安全性中寻…

HTML、HTML5一览

文章目录 HTML简介标签基本标签格式化文本链接图像块级元素列表表格框架表单实体 HTML5 此篇用于优化csdn第一篇文章 HTML 简介 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言&#xff0c;而是一种标记语言…

sublime如何写python

推荐一款好用且轻量级的编辑器——sublime—text3&#xff0c;sublime现在支持的语言有很多。 右边弹出的列表可以往下拉&#xff0c;亮点是支持了python&#xff0c;而且不需要安装任何的python环境&#xff0c;直接下载sublime就可以编写python代码并运行了。 使用方法&…

Java面经——SpringCloud微服务

SpringCloud SpringCloud的五大组件 注册中心网关远程调用负载均衡熔断降级 谈谈你对SpringCloud的理解 SpringCloud是为了解决微服务架构中出现的一系列服务治理难题的而提出的一套规范&#xff0c;统一了标准。降低了微服务架构的开发难度。有了 Spring Cloud 这样的技术生…

Three.js——基础纹理、凹凸纹理、法向贴图、环境贴图、canvas贴图

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

linux嵌入式设备测试wifi信号强度方法

首先我们要清楚设备具体链接在哪个wifi热点上 执行&#xff1a;nmcli dev wifi list rootubuntu:/home/ubuntu# nmcli dev wifi list IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS > * 14:EB:08:51:7D:20 wifi22222_5G Infr…

香橙派安装 opencv 4.9.0

香橙派Orange AI Pro / 华为昇腾310 使用源码方式安装opencv 4.9.0 下载源码到香橙派 https://opencv.org/releases/ 解压 unzip opencv-4.9.0.zip进入解压后的文件 cd opencv-4.9.0创建构建目录build mkdir build进入目录 cd build使用cmake配置后续的构建环境 cmake -D…

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(二)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失拖放取消的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初…