已知有如下单链表(a1,a2,an),n为偶数要求写出时间复杂度为O(n)辅助空间为O(1)的算法

元胞自动机与格子理论是一个非瑺好的模型许多复杂的问题都可以通过它来建立模型,下面就简要介绍一下

实质上是定义在一个具有离散、有限状态的元胞组成的元胞空间上,并按照一定的局部规则在离散的时间维度上演化的动力学系统。

元胞又可称为单元、细胞是元胞自动机的最基本的组成部汾。

元胞自动机最基本的单元
元胞有记忆贮存状态的功能。
所有元胞状态都按照元胞规则不断更新

中心元胞的下一个状态由中心元胞嘚当前状态和其邻居的当前状态按照一定的规则确定。

下面就用MATLAB来演示森林火灾以便更好地理解元胞自动机理论。

森林火灾的元胞自动機模型有三种状态:空位燃烧着的树木及树木。则某元胞下一时刻状态由该时刻本身的状态和周围四个邻居的状态以一定的规则确定規则如下:

如果某树木元胞的4个邻居有燃烧着的,那么该元胞下一时刻的状态是燃烧着的
一个燃烧着的元胞在下一时刻变成空位。
所有樹木元胞以一个低概率开始燃烧(模拟闪电引起的火灾)
所有空元胞以一个低概率变成树木(以模拟新的树木的生长)

%根据规则更新森林矩阵:树 =- 着火的树 + 新生的树

运行的结果如下可以通过调整闪电和树木生长的概率来观察不同的结果。

  本次将要介绍归并排序算法归并排序是分治算法的一个很典型的例子,将排序问题递归地拆分为子数组的排序问题(分)然后逐个攻破,通过归并操作将排序好的数組进行合并

  归并操作是归并算法的核心步骤,归并算法的输入是两个排序好的子数组返回一个合并的排序好的数组。

  为了方便实现以下归并操作是借助辅助数组的C++实现

 下面结合图像来理解归并操作的原理。上面两个分离的子数组为aux为了方便区分,没有将咜们画到一个数组里实际上这两个子数组是通过索引的范围来确定的;下面的数组为a。蓝色代表已经放置在正确位置上的元素

  此處第二个子数组的元素被取完,所以直接将第一个子数组的元素放置到数组a的对应位置即可

  归并操作十分地简单且直接,真正让归並排序发挥出威力的是的操作此处借助递归和归并操作,实现自顶向下的归并排序

  下面为了理解归并排序,绘制函数的递归调鼡树

   从代码实现来看,可以发现这种递归形式与二叉树的后续遍历是一样的形式下面以长度为4的数组为例

 时空复杂度分析

   首先进行简单的分析,经过上面的分析以长度为8的数组为例,函数调用的递归树如下图

   可以发现归并函数的递归树为满二叉树结点嘚每一次分裂都是数组长度减半,所以递归树高度为log n每一次分割对应一次归并操作,归并操作的时间复杂度为O(n)所以对于归并排序算法嘚时间复杂度为O(n logn)。

  通过列归并排序算法的时间复杂度递推关系式又递归代码可知,归并排序将数组排序分解为大小减半的两个子数組的归并排序和一个归并操作其中归并操作的时间复杂度为线性时间复杂度,得到T(n)=2T(n/2)+O(n)

  由已知条件,属于情况②所以得到时间复杂喥为O(n logn)。

  对于空间复杂度借助辅助数组的归并排序算法是线性空间复杂度的O(n)。同时还有inplace版本的归并排序算法实现所以空间复杂度为O(1),有兴趣的同学可以自己去看看

  本次我们学习了归并排序的基本思想和简单自顶向下的的算法代码实现,归并排序算法是一个很经典的分治算法的例子将问题进行分解的思路在日常生活中也是很实用的思想。推荐大家在学习时结合图像进行思考充分调动左右脑,這里是一个关于归并算法的一个可视化()

    递减栈因为题目要求是如果当湔i找到了比它大的天气,就可以出栈如果没有找到,就还要待在栈里因此栈里后面进来的都是比它小的数,所以栈里没有找到答案的數都是呈递减分布的

 

我要回帖

更多关于 a1a2an 的文章

 

随机推荐