Reverse数组以及大O表达式
这篇主要是对数组实现一个倒排序(比如数组1、2、3,最后输出3、2、1),当然实现这个功能是非常easy的事,但是这里需要引入另外一个很重要的概念-----如何计算一个算法的时间复杂度并学会用大O表达式。我记得之前有次面试,面试官让我写一个查找算法题,经过细心苦想后最终我简单的把它写出来了,然后面试官问我你这样实现那你的时间复杂度是O几呢?当时我一脸懵逼的问:“O几什么意思?时间复杂度我不太会算。”,接着面试官一脸惊诧,当然那场面试也以失败告终,所以在实际面试中只要问到算法相关的题基本上都会有这些知识,所以为了不让自己再丢脸,这里好好学习一下它。
首先来实现这个倒排序,基础代码如下:

接着来思考如何达到我们倒排序的目的呢,如下图:

有了思路之后下面则落实到具体代码上来,如何实现呢?其实也挺简单:用两个变量来表示要交换的数据位置,然后循环一一交换,每循环一次则将当前的数据位置进行改变,改变的思路是左边的位置每次加1,而右边的位置每次减1,这样随着不断循环数据也不断向中间靠扰,于是乎基于这样的思路写出代码:

编译运行:

程序完美实现,现在数组的元素个数是7个,那如果扩大到7000个、70000个呢?该程序能不能在有限的时间有限的内存中也能成功的运行呢?如何来考虑数据变大运行时间要多花多少这个问题呢?每个语句运行就相当于一个指令,而并非每个指令运行时间都会随数据变大而变大,像上面代码中:

下面来推算一下执行时间,并且引入大O表示法:


就拿1000个数据量来算,就要循环1000/2=500次,而这个1000我们用n表示,这时整个函数的运行时间为:

t(n) <= (n/2) * 10 + 2;
⇩
t(n) <= 5 * n + 2;(也就是说时间是随着n的增长而增长,是一个线性正比的关系)
而在计算机领域对于这样的问题可以这样表示:
t(n) <= c0 * n + c1;
而它可以用一个大O来表示它:O(n)
而关于什么是大O表达式,可以参考维基百科:

如图所有:它在分析算法复杂性方面是非常有用的【所以为啥面试官在你写完算法之后都爱问这个复杂度滴问题】,而常见的有下面这些形式化定义:

大O表示法常见的基于N的走势图如下图所示:

其中图中最陡的线则代表随着N越来时间复杂度最高,最耗时~
现在已经知道O(n)的意义了,之后会慢慢再学一些其它的大O表示表,这里再来看一下O(1)这种形式,如图第一项所描述,表示常数,那上面我们的代码中哪种是这样的呢?应该也能想到,常数就是不随n的变化而变化的,那对应代码最明显的就是数据元素的访问,如下:

这篇已经对大O进行引入了,之后还会不断深入了解~
Reverse数组以及大O表达式的更多相关文章
- 让操作javascript对象数组像.net lamda表达式一样
让操作javascript对象数组像.net lamda表达式一样 随着web应用程序的富客户端化.ajax的广泛使用及复杂的前端业务逻辑.对js对象数组.json数组的各种操作越来越多.越来越复杂. ...
- 剑指offer24:二叉树中和为输入整数值的所有路径。(注意: 在返回值的list中,数组长度大的数组靠前)
1 题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长 ...
- 日期类&&包装类&&System类&&Math类&&Arrays数组类&&大数据类
day 07 日期类 Date 构造函数 Date():返还当前日期. Date(long date):返还指定日期 date:时间戳--->距离1970年1月1日 零时的毫秒数 常用方法 日期 ...
- js 数组操作大集合
js数组的操作 用 js有非常久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目.用到数组的地方非常多.自以为js高手的自己竟然无从下手 ...
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- 150. Evaluate Reverse Polish Notation逆波兰表达式
[抄题]: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...
- 将数组A中的内容和数组B中的内容进行交换。(数组一样大)
将两个数组中的内容相互交换,必须是两个数组的内容一样大小. 思路: 结合两个整型变量之间的交换,同样可以用于内容一样大的数组.用异或关系相互交换. #include<stdio.h> in ...
- 警惕rapidxml的陷阱(二):在Android上默认内存池分配数组过大,容易导致栈溢出
上一篇随笔中提到了,rapidxml在每个xml对象中维护了一个内存池,自己管理变量的生存周期.看起来很好,但我们在实际使用中还是出现了问题. 项目中我们的模块很快写好了,在windows和linux ...
- js 数组方法大集合,各方法是否改变原有的数组详解
不会改变原来数组的有: concat()---连接两个或更多的数组,并返回结果. every()---检测数组元素的每个元素是否都符合条件. some()---检测数组元素中是否有元素符合指定条件. ...
随机推荐
- OpenCV计算机视觉实战(Python版)资源
疲劳检测 pan.baidu.com/s/1Ng_-utB8BSrXlgVelc8ovw #导入工具包 from scipy.spatial import distance as dist from ...
- VUE-CLI项目同一局域网手机通过IP访问电脑本地项目
0.找到config文件夹下的index.js文件,修改host内容为hots:'0.0.0.0',此时重新运行项目,则其他设备可以通过ip进行访问 1.首先确保电脑防火墙或者杀毒软件关闭,因为大多数 ...
- python 计算文件夹里所有内容的大小总和
计算文件夹里所有内容的大小总和 递归方法 '''计算文件夹的大小''' import os def dir_file_size(path): if os.path.isdir(path): file_ ...
- 学习笔记:oracle学习一:oracle11g体系结构之服务器结构、数据字典
目录 1.服务器架构 1.1 系统全局区SGA 1.1.1 高速数据缓冲区(database buffer cache) 1.1.2 重做日志缓冲区(redo log buffer cache) 1. ...
- [转帖]从壹开始前后端分离【重要】║最全的部署方案 & 最丰富的错误分析
从壹开始前后端分离[重要]║最全的部署方案 & 最丰富的错误分析 https://www.cnblogs.com/laozhang-is-phi/p/beautifulPublish-most ...
- NationalInstruments project
//using NationalInstruments.NI4882; //请将项目文件中的"AutoGenerateBindingRedirects"属性设置为true //ht ...
- 多线程(5) — JDK的并发容器
JDK提供了一些高效的并发容器,下面介绍几个 ConcurrentHashMap:这是个高效的并发HashMap,可以理解为一个线程安全的HashMap. CopyOnWriteArrayList:这 ...
- 方法区(关于java虚拟机内存的那些事)
<深入理解 java 虚拟机> 读书扩展 作者:淮左白衣 写于 2018年4月13日21:26:05 目录 方法区 图例(方法区中都保存什么) 类型信息 类型的常量池 (即运行时常量池) ...
- vue.js中 ,回车键实现登录或者提交表单!
vue的功能非常强大,但是我们作为一个后端开发人员,前端的东西不一定都弄的很明白,今天就给大家介绍一个回车提交表单的真实案例,达到回车登录的效果! @ keyup.enter 实现的效果 <in ...
- c++学习(三)------static数据与成员函数
疑惑: static类型成员是类的全局变量,所有类的实例都享有这个变量,或者说这个变量不属于任何一个类的实例. static类型变量可以为private,或public或其他(static数据可以被继 ...