大O表示法和时间复杂度
学数据结构和算法的目的 => 实现程序的高速运行,那么必然要了解复杂度。
复杂度分为两个维度:时间、空间。在开发过程中,我们希望时间和内存消耗都越少越好,但很多时候无法做到兼顾,需要在时间和空间之间做出取舍已达到最佳状态。
对复杂度的计算一般采用事前分析估算的方法,即大O表示法。
接下来让我们进入复杂度的学习!
大O表示法——概念
由保罗·巴赫曼在《解析数论》中首先引入。它描述的是一个函数数量级的渐进上界,即算法最坏的情况。
某个算法的复杂度达到了这个问题复杂度的下界,即为最佳算法。
比如:从大小为100的存放数字的数组中找到10,我们需要从头到尾遍历,那么这个是时间复杂度就为 Ο(n),(这里n=100,下面讲解为何为Ο(n))。若10不是数组最后一项,我们在<100次的时候就找到 ,可跳出循环,所以,大O表示法描述的是最坏的情况。
说明:1. 决定算法复杂度的,是执行次数最多的语句;
2. 复杂度的得出,忽略了常量,低次幂和最高次幂的系数;
3. 加法法则:总复杂度量级最大的那段代码的时间复杂度;
3. 乘法法则:嵌套代码的复杂度等于内外代码复杂度的乘积。
大O表示法——四种常用的时间复杂度
度量一个程序片段的执行时间
度量一个程序的执行时间通常有两种方法
事后统计的方法
事前分析估算的方法 => O
Ο(1)<Ο(log2(n))<Ο(n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)
我们可以用 console.time(''mark) console.timeEnd(''mark) 来查看执行时间
1. Ο(1):(常数阶)如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数;
let a = 1;
let b = 2;
let temp = a;a = b;
b = temp;
2. Ο(logn):(对数阶)(以2为底n的对数)当数据增大 n 倍时,耗时增大 logn 倍(比如,当数据增大 256 倍时,耗时只增大 8 倍);
例子:二分查找就是 O(logn)的算法,每找一次排除一半的可能。
let i = 1;while(i <= n) {i *= 2; // 每次循环,i变大2倍,即排除一半可能
}
3. Ο(n):(线性阶)数据量的增大几倍,耗时也增大几倍;
for(i = 1; i <= n; i++) {...
}
4. Ο(n^2):(平方阶)数据量增大 n 倍时,耗时增大 n 的平方倍;
for(i = 1; i <= n; i++) {for(j = 1; j <= n; j++) {...}
}
本文章持续完善中......
大O表示法和时间复杂度相关推荐
- JAVA(4)学习笔记:JVM虚拟机上的栈、大驼峰命名法和小驼峰命名法、实参和形参、重载方法、调用栈、递归练习(汉诺塔+斐波那契数列)、数组的定义、数组的初始化、增强for循环。
接上次的博客:JAVA学习(3)--知识整理以及一些简单程序(猜数字游戏.求各种自幂数.求出一个数字的二进制位中1的个数.获取一个数二进制序列中所有的偶数位和奇数位.求公约数的多种实现方式.输入密码程 ...
- 命名规则之大驼峰命名法和小驼峰命名法
大驼峰命名规则又称骆驼式命名法(Camel-Case),是电脑程式编写时的一套命名规则(惯例).是指混合使用大小写字母来构成变量和函数的名字. 程序员们为了自己的代码能更容易的在同行之间交流,所以多采 ...
- 寻找数组中第K大的数,时间复杂度O(N)
给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 有道题目寻找第K大,我用这3种方法都做了一遍. 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大 ...
- 大驼峰命名法和小驼峰命名法
前言 我们在做项目的时候,命名格式必须统一,这样才会方便不同人之间的编码阅读!,所以今天就来说一下驼峰命名法! 骆峰式命名法(Camel-Case)是电脑程式编写时的一套命名规则(惯例). 骆峰式命名 ...
- 十大经典排序算法时间复杂度和空间复杂度总结
- 时间复杂度分析-大O表示法
开篇词 | 从今天起,跨过"数据结构与算法"这道坎 你好,我是王争,毕业于西安交通大学计算机专业.现在回想起来,本科毕业的时候,我的编程水平其实是很差的.直到读研究生的时候,一个师 ...
- 【数据结构与算法-java实现】一 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
今天开始学习程序的灵魂:数据结构与算法. 本文是自己学习极客时间专栏-数据结构与算法之美后的笔记总结.如有侵权请联系我删除文章. 我们都知道,数据结构和算法本身解决的是"快"和&q ...
- Facebook工程师告诉你,如何正确的阅读《算法导论》(CLRS)?
第一章 挺有趣的,不过你可以跳过. 第二章 2.1 插入排序--老实说,你应该知道所有主要的排序算法,而不仅仅是插入排序.这只是基本的知识,你永远不知道什么时候有用. 2.2 算法分析--你可以跳过简 ...
- 第k大元素(时间复杂度为O(n))
2201: 第k大元素 [命题人 : yancheng] 时间限制 : 1.000 sec 内存限制 : 128 MB 提交 解决: 156提交量: 1038统计 题目描述 输入一个整数数组,请求出 ...
最新文章
- SNMP 协议 OID的使用
- 用Leangoo敏捷看板工具管理 产品线路图
- 说说Request.Params[key]和Request[key]
- Linux Kernel TCP/IP Stack — L3 Layer — netfilter/iptables 防火墙
- 为CentOS 7安装VMware-tools
- oracle数据库赋权_oracle数据库用户之间授权
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
- 计算机英语应用研究,计算机英语辅助学习系统的研究与应用-软件工程专业论文.docx...
- PHP 显示本机的外网IP
- linux文件属性之用户和组基础知识
- 软件项目周报模板_一份高质量的职场工作周报,要这样写
- 简单的自动更新程序实现
- 使用Python把树莓派改造成一个语音助手
- 22. Declare data members private
- 神舟战神换cpu教程_神舟战神做工如何?神舟战神K650D-A29拆机图解教程
- 数据结构(一)、二叉树(BT),二叉查找树(BST),平衡二叉树(AVL树)
- java mpeg ps转mpeg-4_MPEG4格式转换器下载_枫叶MPEG4格式转换器(MPEG转换器) 9.0.5.0 共享版_极速下载站...
- XSS 之 haozi me 题解——人生第一份CSDN题解
- 浅谈C++11标准中的复制省略(copy elision,也叫RVO返回值优化)
- 动态表格中点击图片放大
热门文章
- java 音频转换_java实现音频转换
- 华为云CDN加速服务,如何助企业扬帆远航
- 关于大商创安装默认数据清空说明
- 关于银环蛇Z370主板的,M.2固态与SATA接口冲突的解决办法
- MySQL数据库零基础教学[超详细]
- FPS中子弹飞行轨迹随视点位置变化而变化的问题
- 关于毕业必须知道的知识之就业、派遣(1)
- 2java第一章复习总结
- quartz集群模式下qrtz_triggers表trigger_state变ERROR分析
- linux内存测试工具memtest,内存检测工具Memtest使用方法(图文教程)