(二十)原地算法

在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部份覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。

维基百科中的伪代码示例:

假设要将具有 n 项内容的数组 a 翻转过来。一种看似简单的方法是创建一个大小相等的新数组,用适当的顺序填充副本,然后再删除:

 function reverse(a[0..n-1])
     allocate b[0..n-1]  # 额外设定一个数组
     for i from 0 to n-1 # 从 0 到 n-1 遍历数组 a
         b[n -1 - i] := a[i] 
     return b

这种方法虽然简单,但是需要 O(n) 的额外空间以使数组 a 和 b 同时可用。此外,分配存储空间和释放存储空间通常是缓慢的操作。如果我们不再需要数组 a 的话,可使用原地算法,用它自己翻转的内容来覆盖掉原先的内容。这样,无论数组有多大,它都只需要辅助变量 i 和 tmp:

 function reverse_in_place(a[0..n-1])
     for i from 0 to floor((n-2)/2)
         tmp := a[i]
         a[i] := a[n − 1 − i]
         a[n − 1 − i] := tmp

这样既节省了存储器空间又加快了运算速度。

Leecode:https://leetcode-cn.com/problems/game-of-life/

在不另加数组空间基础上,在原数组上进行修改,但不影响其状态

细胞变化有四种状态:死--活、活-死、活-活、死-死

在状态不变时,保持原样

死-活:记做-1 

活-死:记做2 

这样用活>0,(1,2)

死 <0

就能判断细胞原来是什么样的

最终遍历一次数组,将2,-1 的修改为0、1

 

posted @ 2019-07-24 20:27  测试开发分享站  阅读(219)  评论(0编辑  收藏  举报