原地算法
一句话总结就是: 原地算法不依赖额外的资源或者依赖少数的额外资源,仅依靠输出来覆盖输入的一种算法操作。
维基百科中的伪代码示例:
假设要将具有 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
这样既节省了存储器空间又加快了运算速度。
原地算法的python实现

题目:移除元素
我的做法:for循环正序编译错误,原因是正向的话如果后面那个数字和前面已删除的数字相同,后面数字的索引会变成之前已删除数字的索引,但是正在遍历的索引已经检查过这个索引了,会过掉,倒着就不会有覆盖现象了。
网友评论