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()---检测数组元素中是否有元素符合指定条件. ...
随机推荐
- 利用socket编程在ESP32上搭建一个TCP客户端
通过之前http://www.cnblogs.com/noticeable/p/7636582.html中对socket的编程,已经可以知道如何通过socket编程搭建服务器和客户端了,现在,就在ES ...
- java基本思想
面向对象 众所周知,面向对象编程思想是java的基本思想.java的整个体系和技术实现都是以这个思想为基础.(这个通过类和接口能看出来,后面提到) 对这个事情的认知度甚至变成了很多公司的面试标准.比如 ...
- Nuget下载 MySql.Data 连接MySql数据库
打开VS项目,右键项目选择 右上角搜索框中搜索 MySql.Data 然后可以选择安装,但是可能会出现这个提示 这是因为版本的问题,所以,自己去官网重新下载,我这里选择的是这个版本, 官网地址: ht ...
- eclipse设置html js css自动提示
eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclipse自带的插件,无需另外安装插件,具体步骤如下 1.打开eclipse→Window ...
- [转帖]linux下查找文件及查找包含指定内容的文件常用命令。
linux下查找文件及查找包含指定内容的文件常用命令. https://blog.csdn.net/yangyu19910407/article/details/18266821 最简单的查找 fin ...
- 用css美化select框
先上代码: .selectData{ height: 0.42rem; position: absolute; right:.28rem; top:.30rem; //去边框 border: none ...
- (六)Cookie 知识点总结 (来自那些年的笔记)
如果你想要转载话,可不可以不要删掉下面的 作者信息 呀!: 作者:淮左白衣 写于 2018年4月18日18:47:41 来源笔者自己之前学javaWeb的时候,写的笔记 : 目录 如果你想要转载话,可 ...
- CSS之cursor用法
cursor: url('~ROOT/shared/assets/image/vn-text-cursor-31-49.png') 22 22, nw-resize; 另外还有一个 cursor: g ...
- 【爬虫集合】抖音API分析
1. 分析接口 Charles注册码 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 抖音API分析 抖音.猫眼网页 ...
- .net core下对于Excel的一些操作及使用
原文:.net core下对于Excel的一些操作及使用 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.cs ...