我一直在研究一些排序算法,并且遇到了时间和空间复杂性之间的一些反比关系。例如,像选择排序这样的算法需要O(n ^ 2),但只需要恒定的空间,因为它可以在适当的位置完成。然而,像合并排序这样的算法具有O(nlogn)时间复杂度但需要O(n)空间。
我的问题是
是否存在将时间和空间复杂性相互关联的定理或定律?这种现象只存在于排序算法中,还是在其他问题上存在这种折衷?
随着现代RAM大小的大幅增加,将时空复杂性换成空间复杂性总是一个好主意吗?或者有时候降低时间复杂度会使空间复杂度过大。
答案 0 :(得分:1)
回答你的第一个问题 - 没有没有。这来自算法的个案分析。没有数学公式可以计算出时空复杂度的权衡。是的,它也存在于其他算法中。例如:考虑在数组中获取运行总和的问题 - 两者之间有更新。如果存储在O(n)
内存(数组)中,则复杂度为O(n)
,用于检索数组中某个范围内的特定和。但是,如果您保留具有O(4*n)
〜O(n)
空间复杂度的细分树,则会更新和检索O(logn)
。
不,不是。拥有巨大的空间复杂性不会弥补我们今天获得的额外内存。性能将受到内存访问等的限制。
有些情况下,时间复杂度的降低只能通过相对较高的空间复杂度来实现。例如,如果存储的数据是未压缩的,则需要更多空间,但访问时间比压缩存储数据时要小(因为压缩数据会减少占用的空间量,但运行解压缩算法需要一些时间) 。这取决于我们将面临的情况,并决定我们想要采用哪种解决方案。
答案 1 :(得分:0)
据我所知,没有与时间和空间复杂性权衡有关的明确法律。然而,各种算法问题都存在多种解决方案的趋势,其中一些需要较少的时间而牺牲空间,而另一些则需要更多的空间而牺牲时间。
在尝试优化算法时,通常情况下使用更多空间(例如以预计算的形式)会带来更好的时间性能。研究时间和空间的复杂性有助于观察这种趋势,但也可能会产生误导。举一个关于合并排序的例子:你实际上可以实现一个merge sort algorithm that requires a constant amount of memory。它甚至可以be an in-place sort。虽然空间复杂度降低了,虽然时间复杂度保持不变,但由于大的常数或线性时间因素(不计入O(n log n)
)而导致性能下降。
最优化速度的最常见情况是使用查找表,牺牲一些内存以避免重新计算。另一个例子是数据压缩:采用众多的图像或音频文件格式,它们各有利弊。
关于你的第二个问题,当然有些情况可能导致性能上升,导致内存需求激增。在视频游戏中找到例子并不困难,因为它们通常需要大量的计算资源。
答案 2 :(得分:0)
答案。
不,没有这样的定理。甚至没有排序。例如,heapsort有时间O(n log(n))
和O(1)
空间复杂度。
有各种各样的技术可以明确地随着时间的推移进行权衡。例如memoization。他们不是自由的,并不总是更好。请记住,有效的内存使用不仅仅是节省内存。从具有更好的内存局部性到减少通过线路的数据传输,它一直受益。作为一个例子,请看https://github.com/google/snappy,了解现实世界系统中人们如何选择使用更多CPU来节省内存,因为它可以让事情变得更快。
答案 3 :(得分:0)
没有定理,没有定律,但是有一种算法设计方法可以处理时空复杂性。我建议您寻找动态编程方法。
问题在于,对于某些问题,可能存在一些有趣的时空复杂性折衷,但对于某些问题,则不存在……
对于您自己的示例,只有当您看这两个孤立的示例时,时空复杂度的权衡才有意义。即,存在一种对具有O(n lg n)时间复杂度和O(1)空间复杂度的数组进行排序的算法-heapsort算法。