【发布时间】:2015-09-23 12:42:49
【问题描述】:
这是我对 karatsuba 算法的实现,
它在删除部分被注释时效果很好,但是当我将它插入代码时,它会导致错误的输出!
(例如对于测试 n=5,a=b={1, 2, 3, 4, 5})
void conv(int a[], int b[], int c[], int n)
{
if (n == 1)
{
c[0] = a[0]*b[0];
return;
}
int *C0 = new int[n];
int *C1 = new int[n];
int *C2 = new int[n];
conv(a, b, C0, n/2);
conv(a + n/2, b + n/2, C1, n/2);
for (int i = 0; i < n/2; i++)
a[i] += a[i + n/2], b[i] += b[i + n/2];
conv(a, b, C2, n/2);
for (int i = 0; i < n/2; i++)
a[i] -= a[i + n/2], b[i] -= b[i + n/2];
for (int i = 0; i < n; i++)
{
c[i] += C0[i];
c[i + n] += C1[i];
c[i + n/2] += C2[i] - C1[i] - C0[i];
}
/* delete[] C0;
delete[] C1;
delete[] C2;*/
}
删除有什么问题?我是否以错误的方式释放了分配的内存?
提前致谢!
【问题讨论】:
-
使用
std::vector<int>。 -
您的代码中有一个可疑的部分:您在 c 向量中设置了 i+n 处的值。这是向量 a、b 和 c 的范围(我猜是 n,但没有说明)。
-
a 和 b 的大小为 n,但 c 的大小为 2n。 (我们将大小为 n 的 c 传递给 new n = n/2 的调用)
-
看起来您在使用 C0 / C1 / C2 数组之前没有完全初始化它们。
-
你没有问,但无论如何我要告诉你:像这样动态分配和删除你的工作空间使得 Karatsuba 比简单的逐字节乘法要慢。相反,您应该在递归的顶层分配三个大数组,并使用动态指针指向这些数组。这必须小心。
标签: c++ algorithm memory-management dynamic-memory-allocation