我有一个问题,找到算法所需的大内存量是什么意思?
喜欢那个和大o操作之间的区别是什么?
E.g
一个问题问道 给定以下伪代码,使用初始化的二维数组A,两个维度的大小为n:for i <- 1 to n do
for j <- 1 to n-i do
A[i][j]= i + j
内存的大符号不会是n ^ 2而且计算也是n ^ 2吗?
答案 0 :(得分:13)
Big-Oh是关于某些东西如何根据其他东西增长(技术上是对某些东西增长的限制)。最常见的介绍用法是某些是 fast 算法根据输入的大小运行的方式。
根据输入的大小,没有任何内容表明您无法使用某些内容使用了多少内存。
在您的示例中,由于数组中有一个存储桶用于i
和j
中的所有内容,因此空间需求增长为O(i*j)
,即O(n^2)
但是如果您的算法反而跟踪最大总和,而不是每个数组中每个数字的总和,则运行时复杂性仍为O(n^2)
,而空间复杂度将保持不变,仅作为算法需要跟踪当前i,当前j,当前最大值和被测试的最大值。
答案 1 :(得分:3)
Big-O内存顺序意味着执行算法所需的字节数随着处理的元素数量的增加而变化。在您的示例中,我认为Big-O顺序是n平方,因为数据存储在大小为nxn的正方形数组中。
大O操作顺序意味着执行算法所需的计算次数如何随着处理的元素数量的增加而变化。
答案 2 :(得分:2)
是的,你是对的,上面的伪代码的空间和时间复杂度是n ^ 2。
但是对于下面的代码,空间或内存复杂度为1,但时间复杂度为n ^ 2。 我通常会在代码中完成任务,这会给你内存的复杂性。
for i&lt; - 1 to n do
for j <- 1 to n-i do
A[0][0]= i + j
答案 3 :(得分:1)
老实说,我从来没有听说过“记忆大O”但我很容易猜到它只是松散地与计算时间相关 - 可能只设置了下限。
作为一个例子,很容易设计一个使用n ^ 2内存和n ^ 3计算的算法,但我认为不可能反过来做 - 你不能计算n复杂的n ^ 2数据
您的算法的复杂度为1/2 * n ^ 2,因此O(n ^ 2)
答案 4 :(得分:0)
如果将A
赋予您的算法,则空间复杂度为O(1)。在现有的2D数组上进行迭代并将值写入现有的内存位置不会使用额外的内存。
但是,如果算法分配 A
,则空间复杂度为O(n 2 )。
时间复杂度均为O(n 2 )。