时间复杂度与常见排列算法

你还在为时间复杂度不懂而担心吗???赶紧进来,这里手把手教你计算时间复杂度!!! 数据结构,时间复杂度的讲解,让我们对时间复杂度进一步的了解 阅读详情

一、时间复杂度概念

1、时间复杂度概念

提到时间复杂度,第一时间想到的是算法,简单说,算法就是你解决问题的方法,而你用这个方法解决这个问题所执行的语句次数,称为语句频度或者时间频度,记为T(n)。

什么是时间复杂度,算法中某个函数有n次基本操作重复执行,用T(n)表示。
现在有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。
记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
通俗一点讲,其实所谓的时间复杂度,就是找了一个同样曲线类型的函数f(n)来表示这个算法的在n不断变大时的趋势 。
当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。

2、计算时间复杂度的方法:

推导大O阶,我们可以按照如下的规则来进行推导,得到的结果就是大O表示法:
a.用常数1来取代运行时间中所有加法常数。
b.修改后的运行次数函数中,只保留最高阶项
c.如果最高阶项存在且不是1,则去除与这个项相乘的常数。

二、理解

1、常数阶:O(1)的算法是一些运算次数为常数的算法。例如:

    temp=a;
    a=b;
    b=temp;

上面语句共三条操作,单条操作的频度为1,即使他有成千上万条操作,也只是个较大常数,这一类的时间复杂度为O(1)。

int sum = 0,n = 100; //执行一次  
sum = (1+n)*n/2; //执行一次  
System.out.println (sum); //执行一次 

上面算法的运行的次数的函数为f(n)=3,根据推导大O阶的规则1,我们需要将常数3改为1,则这个算法的时间复杂度为O(1)。

2、线性阶:O(n)的算法是一些线性算法。例如:

    sum=0;                
    for(i=0;i<n;i++)      
        sum++;

上面代码中第一行频度1,第二行频度为n,第三行频度为n,所以f(n)=n+n+1=2n+1。所以时间复杂度O(n)。这一类算法中操作次数和n正比线性增长。

3、对数阶:O(logn) 一个算法如果能在每个步骤去掉一半数据元素,如二分检索,通常它就取 O(logn)时间。例如:

    int i=1; 
    while (i<=n) 
        i=i*2; 

上面代码设第三行的频度是f(n), 则:2^f(n)<=n;f(n)<=log₂n,取最大值f(n)= log₂n,所以T(n)=O(log₂n ) 。

4、平方阶:O(n²)(n的k次方的情况)最常见的就是平时的对数组进行排序的各种简单算法都是O(n²),例如直接插入排序的算法。

    sum=0;                
    for(i=0;i<n;i++)  
        for(j=0;j<n;j++) 
          sum++;

第一行频度1,第二行n,第三行n²,第四行n²,T(n)=2n²+n+1 =O(n²)

5、平方阶:O(n²)

for(int i = 0; i < n; i++){
    for(int j = i; j < n; j++){
        printf("%d ",i);
    }
}  
//运行次数为(1+n)*n/2
//时间复杂度O(n^2)

6、时间复杂度按n越大算法越复杂来排的话:

常数阶O(1)、对数阶O(logn)、线性阶O(n)、线性对数阶O(nlogn)、平方阶O(n²)、立方阶O(n³)、……k次方阶O(n的k次方)、指数阶O(2的n次方)。

O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)

三、其他

1、冒泡程序—平方阶

public void sort(int[] args)
{
    //第一层循环从数组的最后往前遍历
    for (int i = args.length - 1; i > 0 ; --i) {
        for (int j = 0; j < i; j++) {
            //保证在相邻的两个数中比较选出最大的并且进行交换(冒泡过程)
            if (args[j] > args[j+1]) {
                int temp = args[j];
                args[j] = args[j+1];
                args[j+1] = temp;
            }
        }
    }
}

上面算法的运行的次数函数为f(n)= (n-1)+(n-2)+(n-3)+(n-4)+…===>等差数列求和===> (n*(n-1))/2 ===>n^2/2-n/2===> f(n)=O(n^2)

2、选择排序

public void sort(int[] args)
{
    int len = args.length;
    for (int i = 0,k = 0; i < len; i++,k = i) {    n
        // 在这一层循环中找最小
        for (int j = i + 1; j < len; j++) {    n-1
            // 如果后面的元素比前面的小,那么就交换下标,每一趟都会选择出来一个最小值的下标
            if (args[k] > args[j]) k = j;
        }

        if (i != k) {
            int tmp = args[i];
            args[i] = args[k];
            args[k] = tmp;
        }
    }
}

上面算法的运行的次数函数为f(n)= (n-1)+(n-2)+(n-3)+(n-4)+…===>等差数列求和===> (n*(n-1))/2 ===>n^2/2-n/2===> f(n)=O(n^2)

3、插入排序

public static void insertSort(int a[]){
    int fn = 0;
    int n = a.length;
    int temp = 0;
    printfArray(a);
    for(int i = 1; i < n; i++){
        for(int j = i; j >0; j--){
            fn++;
            if(a[j] < a[j-1]){ // 交换
                temp = a[j];
                a[j] = a[j-1];
                a[j-1] = temp;
            }else{
                break;
            }
        }
        printfArray(a);
    }
    printfArray(a);
    System.out.println("语句频度:"+fn);
}

上面算法的运行的次数函数为f(n)= (n-1)+(n-2)+(n-3)+(n-4)+…===>等差数列求和===> (n*(n-1))/2 ===>n^2/2-n/2===> f(n)=O(n^2)

【Qualcomm高通音频】外部Codec调试流程_ES7243E 一、 调试大纲 调试正式开始之前,想办法获取以下信息:硬件设计原理图/Codec参考驱动代码/FAE联系方式。 1. 从硬件设计原理图,我们要获取到Codec芯片和CPU通过什么接口连接,包括数据传输接口、控制接口、reset和power引脚。 2. Codec参考驱动代码,一般正规的厂商都会提供的,至少也提供对应场景的寄存器配置。 接下来开始正式调试,大致分为以下流程: a. 数据... 阅读详情

相关推荐

【项目案例】前后端分离项目 【Web图书管理系统 】SpringBoot + Vue + Element UI + Mysql

Web图书管理系统

激流丶的博客 5397

什么是时间复杂度?

  时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数. 时间复杂度常用大O表述,不包括这个函数的低阶项和首项系数。   常见的时间复杂度    常见的算法时间复杂度由小到大依次为 .   时间复杂度的意义 究竟什么是时间复杂度呢?让我们来想象一个场景: 某一天,小灰和大黄同时加入了一个公司...... 一天过

残雪的剑的博客 3万+

手把手教你用Kokoro-82M-v1.1-zh搭建本地TTS服务(含WebSocket接口)

本文详细介绍了如何使用Kokoro-82M-v1.1-zh模型搭建本地TTS服务,包括环境配置、模型部署、WebSocket接口实现及性能优化。通过实战指南,开发者可以快速掌握本地部署TTS系统的关键技术,提升语音交互应用的开发效率。

weixin_30776273的博客 183

【数据结构】时间复杂度和空间复杂度

时间复杂度和空间复杂度笔记总结

Weraphael的博客 3849

【微信小程序开发与设计】垃圾智能分类小程序

垃圾分类是将来生活可持续发展的必需项。但是很多人由于缺乏垃圾分类知识,或是因为垃圾分类困难,费时费力,所以没有好好贯彻垃圾分类政策,此时设计一款方便于群众进行智能化垃圾识别分类的微信小程序就显得尤为必要。

Markelle_Fultz的博客 8245

YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml

全网最详细的YOLOv5源码解读之配置文件yaml。逐行注释,逐句讲解,一文带你了解yaml。小白必看!

路人贾的博客 1万+

什么是时间复杂度与空间复杂度

目录算法效率时间复杂度概念大O的线性表示法时间复杂度举例空间复杂度空间复杂度的定义空间复杂度举例 时间复杂度与空间复杂度是用来分析一个算法的效率的。 算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已

qq_45967533的博客 3万+

宇树科技嵌入式面试题及参考答案(春晚机器人的公司)

内存对齐是指在内存中为数据对象分配存储空间时,按照一定的规则将数据存储在特定的地址上,以提高内存访问效率。不同的数据类型在内存中都有其特定的对齐要求,例如,int类型通常要求 4 字节对齐,double类型通常要求 8 字节对齐。这意味着数据的存储地址必须是其对齐字节数的整数倍。如果不进行内存对齐,处理器在访问数据时可能需要进行多次内存访问,从而降低了访问效率。指令可以用于控制结构体内存布局,它允许程序员指定结构体成员的对齐方式。其基本用法是在结构体定义之前使用来指定对齐字节数n,其中n。

大模型大数据攻城狮的专栏 3225

《大话数据结构》-2-算法概念-基本概念-及实例-常见的时间复杂度所耗时间的大小排列

《大话数据结构》-2-算法概念-基本概念-及实例-常见的时间复杂度所耗时间的大小排列

weixin_45594172的博客 190

第95章 安全工程师:Shell 脚本实现安全扫描、漏洞检测、日志审计

随着网络安全威胁日益复杂,传统的手动安全管理已无法满足现代企业的安全需求。Shell 脚本为安全工程师提供了强大的自动化能力,能够实现 7×24 小时的安全监控、快速漏洞扫描、智能日志分析和实时威胁响应。本章将系统介绍如何使用 Shell 脚本构建完整的安全防护体系,从基线检查到实时监控,帮助你打造自动化的安全运维能力。

猪猪侠 90

小众但实用:Python爬取钉钉/企业微信消息,实现办公数据自动化采集(完整版)

钉钉/企业微信的办公数据自动化采集,属于「小众但极度实用」的Python技巧——它不像爬虫爬取电商/网页数据那样被广泛关注,但能直接解决职场人的「刚需痛点」,把每天1-2小时的手动数据整理工作,变成「一键自动化完成」。这套技巧的核心价值,不在于「技术有多高深」,而在于「能真正落地、能真正提升效率」—— 几行简单的Python代码,就能解放双手,让你从繁琐的重复工作中解脱出来,专注于更有价值的核心工作。更重要的是:所有的技术和代码,都是基于「合规合法」的前提,守住了技术的底线,也守住了职场的原则。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1931

常见的几种排序算法的时间复杂度

一. 排序算法的介绍 概述:排序也称排序算法,排序是将一组数据,依指定的顺序进行排列的过程。 排序的分类 (1) 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。 (2) 外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。 二. 时间复杂度的相关概念 度量一个程序(算法)执行时间的两种方法。 (1) 事后统计的方法 (2) 事前估算的方法 时间频度的介绍。 时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。

s19862388581的博客 8173

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1420

算法题 下一个排列

本文介绍了如何实现获取下一个排列的算法。给定一个整数序列,该算法将其重新排列成字典序中下一个更大的排列,若已是最大排列则返回最小排列。算法核心步骤为:1)从后向前找第一个降序位置;2)在右侧找第一个大于该位置的数并交换;3)反转右侧子数组使其升序。时间复杂度O(n),空间复杂度O(1)。关键点在于定位需要交换的位置并通过反转右侧保证最小增量。文章提供了详细算法思路、Java实现代码、过程示例和常见问题解答,帮助理解这一排列生成问题。

红血哥 739

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

算法及时间复杂度

算法的定义:算法是解决特定问题求解步骤的描述,在计算机中为指令的有限序列,并且每条指令表示一个或多个操作。 算法的特性:有穷性、确定性、可行性、输入、输出。 算法的设计要求:正确性、可读性、健壮性、高效率和低存储量需求。 算法的度量方法:事后统计方法(不科学、不准确)、事前分析估算方法。 时间复杂度的定义: 推导大O阶步骤:(3n²+2n+4) 1.用常数1取代运行时间中的所有加法常数...

wjx的博客 221

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

语句频度问题和算法得时间复杂度。

(2) k = 01    for (i = 1; i 2       for (j = i; j 3           k ++;}   K++得执行次数是n,n-1,n-2,....1的等差数列求和得,(n+1)*n/2等差数列求和公式:Sn=(a1+an)*n/2----------------------------------------------------------------

插上网络的翅膀 9781

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

常用算法的时间复杂度分析

按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),...,k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。时间复杂度:基本操作重复执行的次数的阶数 T(n)=o(f(n))以下六种计算算法时间的多项式是最常用的。其关系为:...

weixin_30527551的博客 518

算法时间复杂度

时间频度 基本介绍:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 举例:如下是计算1-n的和的两种算法 for(int i = 0;i<=n;i++){ sum+=i; } T(n) = n total = (1+n)*n/2; T(n) = 1 算法时间复杂度 ...

c梦的博客 725

算法的时间复杂度

算法时间复杂度的定义 定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的复杂度就是算法的时间量度,记做:T(n)=O(f(n))。他表示随着问题规模n的增大,算法执行时间按的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度。其中f(n)是问题规模n的某个函数。 这样用大O()记述时间复杂度的方法被称为大O记法。 一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。(要注意是增长) 推导大O阶方法 1.用常数1取代

Muzijin0129的博客 581

时间复杂度 简介

时间复杂度概念新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 概念 时间复杂度是同一问题可用不同算法解决,而一...

WQH_Boss的博客 289

回溯算法团灭排列/组合/子集问题

点击上方蓝字设为星标下面开始今天的学习~今天就来聊三道考察频率高,而且容易让人搞混的算法问题,分别是求子集(subset),求排列(permutation),求组合(combinatio...

程序员吴师兄的博客 851

c++算法之基本算法篇 - 排序与排列

C++标准库提供了强大的排序和排列工具,包括sort()、stable_sort()、partial_sort()等排序函数,以及next_permutation()等排列生成算法。这些工具支持自定义比较规则,适用于各种场景,如学生成绩管理、旅行路线规划等。使用时需注意算法选择(考虑时间复杂度和稳定性)、初始排序状态对排列生成的影响,以及自定义比较函数的正确性。对于大数据量,应考虑性能优化技巧如预分配内存。掌握这些核心算法能显著提升编程效率,是解决实际问题的利器。

巴巴博一巴巴博一巴巴博一 786

【ACM训练一】时间复杂度,递归和枚举

时间复杂度 浅显易懂的解释:https://blog.youkuaiyun.com/qq_41523096/article/details/82142747#commentsedit 常见时间复杂度(大O表示法) (1)O(1):常量阶,运行时间为常量 (2)O(logn):对数阶,如二分搜索算法 (3)O(n):线性阶,如n个数内找最大值 (4)O(nlogn):对数阶,如快速排序算法 (5)O(n^2):...

想到什么写什么 870
上一篇: Gradle日常开发技巧总结
下一篇: Android硬编解码MediaCodec使用笔记
艾特小王子
博客等级 码龄10年 6粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值