这篇主要是对数组实现一个倒排序(比如数组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表达式的更多相关文章

  1. 让操作javascript对象数组像.net lamda表达式一样

    让操作javascript对象数组像.net lamda表达式一样 随着web应用程序的富客户端化.ajax的广泛使用及复杂的前端业务逻辑.对js对象数组.json数组的各种操作越来越多.越来越复杂. ...

  2. 剑指offer24:二叉树中和为输入整数值的所有路径。(注意: 在返回值的list中,数组长度大的数组靠前)

    1 题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长 ...

  3. 日期类&&包装类&&System类&&Math类&&Arrays数组类&&大数据类

    day 07 日期类 Date 构造函数 Date():返还当前日期. Date(long date):返还指定日期 date:时间戳--->距离1970年1月1日 零时的毫秒数 常用方法 日期 ...

  4. js 数组操作大集合

    js数组的操作 用 js有非常久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目.用到数组的地方非常多.自以为js高手的自己竟然无从下手 ...

  5. lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

    题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...

  6. 150. Evaluate Reverse Polish Notation逆波兰表达式

    [抄题]: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...

  7. 将数组A中的内容和数组B中的内容进行交换。(数组一样大)

    将两个数组中的内容相互交换,必须是两个数组的内容一样大小. 思路: 结合两个整型变量之间的交换,同样可以用于内容一样大的数组.用异或关系相互交换. #include<stdio.h> in ...

  8. 警惕rapidxml的陷阱(二):在Android上默认内存池分配数组过大,容易导致栈溢出

    上一篇随笔中提到了,rapidxml在每个xml对象中维护了一个内存池,自己管理变量的生存周期.看起来很好,但我们在实际使用中还是出现了问题. 项目中我们的模块很快写好了,在windows和linux ...

  9. js 数组方法大集合,各方法是否改变原有的数组详解

    不会改变原来数组的有: concat()---连接两个或更多的数组,并返回结果. every()---检测数组元素的每个元素是否都符合条件. some()---检测数组元素中是否有元素符合指定条件. ...

随机推荐

  1. Mac下用apache搭建一个局域网服务器

    一:由于MacOX系统下自带Apache环境,所以我们在Mac系统下用Apache配置. Mac系统:10.14.4 二:启动Apache 启动 在终端输入:sudo apachectl start验 ...

  2. Unity接入九游SDK学习与踩坑

    学习之路漫漫,应修之期远兮.持之以恒,方得始终. 这几日接入九游SDK,于浑浑噩噩中成长. 下面是步骤: 一:下载九游SDK 二:打开Android Studio新建一个工程,并且新建一个Androi ...

  3. 【转载】Globelmposter勒索病毒最新变种预警

    近日,深信服安全团队观察到Globelmposter勒索病毒又出现最新变种,加密后缀有Ares666.Zeus666.Aphrodite666.Apollon666等,目前国内已有多家大型医院率先发现 ...

  4. OpenGL学习笔记 之二 (色彩相关)

    参考: http://www.cnblogs.com/FredCong/archive/2012/10/13/2722893.html 使用RGB #include <glut.h> #i ...

  5. vue中的$attrs属性和inheritAttrs属性

    一.vue中,默认情况下,调用组件时,传入一些没有在props中定义的属性,会把这些“非法”属性渲染在组件的根元素上(有一些属性除外),而这些“非法”的属性会记录在$attrs属性上. 二.如何控制不 ...

  6. selenium3.0不兼容火狐的解决方案

    当直接调用火狐出现不兼容错误时,如何解决? 详看Message中提示:Expected browser binary location,but unable to find binary in def ...

  7. 基于SymmetricDS的多主一从数据库同步方案

    原文参照:https://blog.csdn.net/seattle0564/article/details/22096901 下面就记录下测试的一款第三方同步方案SymmetricDS(以下简称S) ...

  8. jira邮箱配置

    系统-邮件-外发邮件

  9. linux环境启动rocketmq服务 报connect to <10.4.86.6:10909> failed异常

    解决方式: 需要给Producer和Consumer的DefaultMQPushConsumer对象set这个参数,生产者和消费者都需要,否则不能正常消费消息: 这个问题解决后可能还会出现: conn ...

  10. 分布式架构下,session共享有什么方案么?

    分布式架构下,session共享有什么方案么? 会点代码的大叔 科技领域创作者 分布式架构下的session共享,也可以称作分布式session一致性:关于这个问题,和大家说一说解决方案(如果有其他的 ...