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

news2024/12/24 9:03:12

文章目录

  • 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.coloradmin.cn/o/1795022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python中的“点阵字体”

“点阵字体”是个啥&#xff1f;&#xff0c;在python中怎么使&#xff1f;在现在全面高清的 5 G 5G 5G时代&#xff0c;它还有用“武”之地&#xff1f; (笔记模板由python脚本于2024年06月01日 18:44:31创建&#xff0c;本篇笔记适合会基本编程的coder翻阅) 【学习的细节是欢…

Vue.js 与 TypeScript(1) :项目配置、props标注类型、emits标注类型

像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误。这减少了生产环境中的运行时错误&#xff0c;也让我们在重构大型项目的时候更有信心。通过 IDE 中基于类型的自动补全&#xff0c;TypeScript 还改善了开发体验和效率。 一、项目配置 1、在项目中添…

USB (1)

再看USB 其实回过头看USB 是可以和无线 有线(internet) 可以和PCIe 甚至AXI类比的 它们共通处在于都是communication 有限通信 有7层网络协议 在USB也是分层的 不同的协议,依赖的介质不一样 这就要求相应的Physical层处理 USB的physical层是基于Serdes的,所以有串并/并串的…

组装服务器重装linux系统【idrac集成戴尔远程控制卡】

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

内网安全--隧道技术代理技术

注:本文仅做技术交流,请勿非法破坏... 目录 项目: 1-Ngrok 用法 2-Frp 用法 3-Nps 用法 4-Spp 用法 工具: windows下: Proxifier(推荐~) Sockscap ccproxy Linux下: Proxychains 用法 http://t.csdnimg.cn/88Ew7 隧道技术&#xff1a;解决不出网协议上线的问…

ARM Linux 驱动开发学习之字符设备驱动开发

Linux 中的设备驱动程序是连接硬件设备和操作系统之间的重要桥梁&#xff0c;确保硬件设备能够在操作系统控制下正常工作。在 Linux 中&#xff0c;设备驱动主要分为三大类&#xff1a;字符设备驱动、块设备驱动和网络设备驱动。下面我将详细解释这三类驱动的特点、用途和区别。…

激活函数对比

激活函数 sigmoid / tanh / relu / leaky relu / elu / gelu / swish 1、sigmoid 优缺点 1) 均值!0&#xff0c;导致fwxb求导时&#xff0c;方向要么全正要么全负 可以通过batch批量训练来缓解 2) 输入值大于一定范围梯度就会消失 3) 运算复杂 2、tanh 优缺点 1) 均值0 2)…

To C道路越走越夯实,1688彻底变身了?

在偌大的电商市场&#xff0c;消费者都是专业的“掘宝者”&#xff0c;热衷于发现各种新奇商品和采购新通路。 拼多多、1688等平台也正是在这种情况下&#xff0c;成为消费市场的“宠儿”。其中&#xff0c;1688的发展路径较为独特&#xff0c;据天眼查&#xff0c;其为源头厂…

苍穹外卖笔记-07-菜品管理-增加、删除、修改、查询分页还有菜品起售或停售状态

菜品管理 1 新增菜品1.1 需求分析与设计1.2 代码开发文件上传新增菜品实现 1.3 功能测试 2 菜品分页查询2.1 需求分析和设计2.2 代码开发设计DTO类设计VO类Controller层Service层Mapper层 2.3 功能测试 3 删除菜品3.1 需求分析和设计3.2 代码开发Controller层Service层Mapper层…

Apple开发者证书创建完整过程

1.创建CSR文件: 打开钥匙串访问程序 选择从证书颁发机构请求 创建证书 保存CSR文件到桌面 成功如下: 开始创建证书: 选择

SDXL终于有了足够好的 Openpose 和 Scribble 模型可以使用了。

SDXL终于有了足够好的 Openpose 和 Scribble 模型可以使用了。 xinsir 发布的Openpose 和 Scribble 模型质量相当好&#xff0c;尤其是 Openpose。不过只支持姿态不支持面部。 再加上前几天的 Anyline 线条预处理器和 Canny 模型。SDXL 的生态在发布快一年的时候成熟了。 模…

QA测试开发工程师面试题满分问答26: Cookie、Session、Token和JWT的定义、区别和使用场景

这是一个非常常见的面试题,需要全面掌握 Cookie、Session、Token 和 JWT 的定义和使用场景,以及它们之间的区别。下面是一个详细的满分回答: Cookie: 定义: Cookie 是一种存储在客户端(通常是浏览器)的小型文本文件,用于在客户端与服务器之间保持会话状态。使用场景: 常用于保存…

sqli-labs 靶场 less-5、6 第五关和第六关:判断注入点、使用错误函数注入爆库名、updatexml()函数

SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它&#xff0c;我们可以学习如何识别和利用不同类型的SQL注入漏洞&#xff0c;并了解如何修复和防范这些漏洞。Less 5 SQLI DUMB SERIES-5 判断注入点&#xff1a;1. 首先&#xff0c;尝试正常的回显内容&#x…

Halcon 双相机标定与拼图(一)

一、概述 最近有一个多相机标定的项目&#xff0c;大概是4个相机来标定&#xff0c;同一坐标系&#xff0c;然后拼接图&#xff0c;之前双相机标定的时候也大概看看&#xff0c;所以今天就找了那个halcon 案例多学一下&#xff0c;后面我打算做一个对位贴合的东西&#xff0c;…

FreeModBusRtu移植 --stm32L431RCT6(小熊派)

文章目录 前言一、移植前需要的工作二、修改点讲解1.串口中断2.定时器3.保持寄存器4.测试 总结 前言 最近需要做一个modbus485的传感器&#xff0c;主要是用来做从机。之前做过主机的是stm标准库&#xff0c;那这次做一个HAL的从机协议栈&#xff0c;方便大家直接获取数据。 移…

迈入智能新纪元:智慧机房运维系统引领行业变革

在数字化飞速发展的今天&#xff0c;机房作为信息时代的“心脏”&#xff0c;其稳定运行对于企业的业务连续性至关重要。然而&#xff0c;传统的机房运维模式面临着诸多挑战&#xff0c;如响应速度慢、故障定位难、资源浪费大等问题。智慧机房运维系统&#xff0c;它将以智能化…

裁判文书:司法公正的“名片”

在法治社会的建设中&#xff0c;裁判文书不仅是法院裁判活动的产物&#xff0c;更是司法公正的重要体现。今天&#xff0c;我们就来聊聊裁判文书上的那些知识&#xff0c;带大家走进这个充满法律智慧的领域。 一、什么是裁判文书&#xff1f; 裁判文书&#xff0c;是人民法院…

【乐吾乐2D可视化组态编辑器】在线使用,快速入门

一、在线使用 乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 二、步骤 本教程将带领你快速体验2D可视化编辑器的全流程开发。 1.创建图纸 进入2d编辑器主界面后&#xff0c;主界面最中心为图纸面板&#xff0c;默认为空图纸&#xff0c;在界面左侧为组…

Paperless-Ngx文档管理系统结合内网穿透实现随时远程搜索查阅文本

文章目录 前言1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 Paperless-ngx是一个开源的文档管理系统&#xff0c;可以将物理文档转换成可搜索的在线档案&#xff0c;从而减少纸张的使…

工业级物联网边缘网关解决方案-天拓四方

随着工业4.0时代的到来&#xff0c;越来越多的企业开始寻求智能化升级&#xff0c;以提高生产效率、降低运营成本并增强市场竞争力。然而&#xff0c;在实际的转型升级过程中&#xff0c;许多企业面临着数据孤岛、设备兼容性差、网络安全风险高等问题&#xff0c;这些问题严重制…