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进行引入了,之后还会不断深入了解~

原文地址:https://www.cnblogs.com/webor2006/p/6727419.html