修改函数输入参数是一种不好的做法吗?

3

我一直在Leetcode上解决问题。

我发现通过“原地”解决问题(即更新输入列表而不返回新列表)通常很容易将空间复杂度从O(n)降低到O(1)。

然而,我怀疑修改输入可能是一种不好的做法。

我找到了一个人这样说的例子(请参见底部评论):https://leetcode.com/problems/circular-array-loop/discuss/94183/simple-on-solution-with-o1-space-complexity

那么,修改参数真的是一种不好的做法吗?为什么会这样?

谢谢。


1
通常情况下,这是一种不好的做法,除非有充分的理由。优化通常是一个很好的理由,如果一开始就有优化的必要的话。解决以优化为重点的在线问题通常是进行优化的一个很好的理由,所以一切都没问题 ;) - zvone
1个回答

2
  • 如果你正在为面试做准备,请不要这样做
  • 如果你正在学习算法/数据结构/计算机科学,请不要这样做
  • 如果你对竞技编程感兴趣,请这样做 :)

有些人将O(1)空间视为“额外空间”,而其他人则将其视为您最终使用的内存,而不管分配情况如何。我认为前者是过度拟合指标的例子,因为在实践中,您仍然使用O(n)的内存;只是这部分内存不属于您,并且现在调试变得更加困难(特别是如果您破坏了&引用参数)。分配一个“偷来”的空间副本会使您的算法的空间复杂度为O(2 * n),但仍然是O(n)。
每当人们询问涉及递归的解决方案时,关于调用堆栈是否计入空间复杂度的问题就会出现同样的辩论。即使您没有明确分配它,它仍然是内存:如果使用过多,仍然可能导致超时错误或内存超限。
关于我在答案开头的玩笑话:没有面试官会称赞修改函数参数所带来的额外复杂性,尤其是考虑到隐藏状态是导致生产代码库腐化的原因。此外,很多人进入算法领域后常常过分担心100毫秒与50毫秒解决方案之间的差异,尽管服务器存在如此大的变异性,以至于有些天等效解决方案可能需要300毫秒,而过早进行优化会削弱代码编程艺术(我自己也曾经历过这种情况)。
然而,就像生活中的大多数事物一样,在非常高的水平上我们会回到原点,一旦你开始使用像DMOJ、CodeForces等严格的在线评测系统,人们会开始做一些荒谬的事情,时间限制非常紧迫,每一点优化都有可能让你在比赛中获胜。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接