我是一名本科计算机科学专业的学生,想要从事该学科的研究。我想知道是否有一种实用的方法来感受渐近的复杂性(大哦和所有)并看看算法如何比其他
答案 0 :(得分:1)
关于算法,数学以及asymptotic computational complexity,Big O notation(problem和compare)以及其他类似内容的阅读书籍的良好开端。
一种实用的方式来感受渐近的复杂性(大哦和所有)并看看算法如何比其他更好
好主意好像在看the charts,就像这里一样。但是,最好的方法就是检查。 :)
让我举个例子(c++11)。
问题:我们有一个杆长n,我们可以免费切割它。不同的长度,不同的成本。如何赚取最多?
数据:我们有一张费用表(总是整数)和两个函数。
<强>代码:强>
constexpr unsigned int m = 50; // any m>=n
const std::array<unsigned int, m+1> costs {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 666}};
//whatever values, costs[0] = 0
unsigned int cut_rod(unsigned int);
unsigned int cut_rod2(unsigned int);
int main(void)
{
unsigned int n, option;
std::cin >> n >> option;
std::cout << (option==2 ? cut_rod2(n) : cut_rod(n)) <<'\n';
}
cut_rod是简单的暴力选项。它具有 O(n)内存,考虑了一系列成本(加上递归)。
unsigned int cut_rod(const unsigned int x)
{
if(x == 0)
return costs[x];
unsigned int best = 0;
for(unsigned int i = 1; i <= x; ++i)
best = std::max(best, costs[i] + cut_rod(x-i));
return best;
}
cut_rod2类似,并且具有 O(n)内存,在O表示法中隐藏了两倍大的const(如果递归正在跳过)。
unsigned int cut_rod2(const unsigned int x)
{
static std::array<unsigned int, m+1> calculated;
if(x == 0 || calculated[x] != 0)
return calculated[x];
unsigned int best = 0;
for(unsigned int i = 1; i <= x; ++i)
best = std::max(best, costs[i] + cut_rod2(x-i));
return (calculated[x] = best);
}
正如我们所看到的,差异很小,至少在代码中是这样。现在我们可以编译它。
g ++ -std = c ++ 11 -O2 -Wall -Wextra -pedantic source.cpp
只需检查,运行并查看时间。为了更好的效果,我建议使用相同的n和其他函数make file1.in和file2.in。比你可以使用时间。
时间./our_program.out&lt;文件$。在
我建议您使用将创建file_ $ i_1.in和file_ $ i_2.in的脚本。编辑文件可能很累人。检查一下!
在您看一下分析之后。
如前所述,记忆的复杂性相对于杆的长度是线性的。每次递归检查杆长度比他父亲少,所以它是线性的。阵列也是。两种情况都相同。
记忆:O(n)
时间复杂性更加拉长。
让我们从第一个函数开始。假设 T(i)为参数i的函数调用次数。比起容易,对于我执行i-1孩子,女巫表演...(T(0)= 0):
{{0}}
渐近计算复杂度:Θ(2 n )
在第二个中,函数计算的计算结果不会是两倍。因此,当我们询问i时,计算了女巫,我们在 O(1)时间内回答。对于从1到n的所有i,我们问我时间,这很容易证明复杂性,但是不难看出;)它是Θ(n 2 )
渐近计算复杂度:Θ(n 2 )
我坚信,如果你检查了不同n的程序持续时间,你会清楚地感受到不同渐近复杂性之间的差异。 :)