Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 时空权衡是否有一般的理论限制?_Algorithm_Complexity Theory_Theory - Fatal编程技术网

Algorithm 时空权衡是否有一般的理论限制?

Algorithm 时空权衡是否有一般的理论限制?,algorithm,complexity-theory,theory,Algorithm,Complexity Theory,Theory,在许多算法中,人们可以发现时间上的改进常常被更多的内存需求所占用。例如,使用缓存可以通过将结果保存在内存中来加速计算 是否存在类似于阿姆达尔定律的“时空权衡”的理论限制,限制计算并行化的速度 例子 假设:我们将忽略调用堆栈的大小。 为了说明时空权衡的工作原理,让我们考虑一下斐波那契序列计算 可以计算出第n个斐波那契序列。使用以下等式的元素: fib(n) = fib(n-1) + fib(n-2) fib(1) = fib(2) = 1 注意,要计算第n个元素,我们需要计算前2个元素。为了计

在许多算法中,人们可以发现时间上的改进常常被更多的内存需求所占用。例如,使用缓存可以通过将结果保存在内存中来加速计算

是否存在类似于阿姆达尔定律的“时空权衡”的理论限制,限制计算并行化的速度

例子 假设:我们将忽略调用堆栈的大小。
为了说明时空权衡的工作原理,让我们考虑一下斐波那契序列计算
可以计算出第n个斐波那契序列。使用以下等式的元素:

fib(n) = fib(n-1) + fib(n-2)
fib(1) = fib(2) = 1 
注意,要计算第n个元素,我们需要计算前2个元素。为了计算每一个,我们需要为每一个计算两个之前的值,以此类推

直截了当的实施应该是:

function fib(n) {
  if (n == 1 || n == 2)
    return 1;
  return fib(n-1) + fib(n-2);
}
让我们使用N=6的图形来可视化: 请注意,有些计算是重复的: 加速算法的方法是记住重复计算的结果并重用它们一个是以空间换取时间

这种权衡的实施:

const resultsCache = [1,1];
function fib(n) {
  if (resultsCache[n])
    return resultsCache[n];
  fibN = fib(n-1) + fib(n-2);
  resultsCache[n] = fibN;
  return fibN;
}
问题:
上述示例中的“时间-空间权衡”是否有任何理论限制?这是我们可以通过使用更多空间来加快算法速度的程度?

您可以缓存每次操作两次或多次的结果,但必须至少执行一次。这是我能想到的极限。我不确定是否有这样的理论。另一方面,内存也是有限的,随着数据的增多,内存的管理也变得越来越复杂,所以我认为你达到了与并行处理相同的限制。哦,“时间缓存空间”是一回事,但“时间-空间”可能太复杂了,无法应用到一个普遍规律中。想想哈希表和其他。你可以考虑在这个问题上问。理论极限不是预先计算每个可能输入的结果并将其存储在内存中,导致简单的查找吗?是有理论限制的,是的。例如,排序的最佳情况是O(n),因为您必须至少查看每个元素一次,以确保它位于正确的位置。没有任何内存量允许您比O(n)更快地排序。