如何解决如何使用恒定大小的数组而不是calloc来编写此递归代码?
我写了下面的递归多项式乘法,a(x)* b(x)= c(x),算法“ ka2”,方法是使用动态内存分配,即使用calloc,malloc,free exc。输入是两个多项式a(x)和b(x),分别由这两个多项式的系数数组和这两个数组的系数“ n”的数量表示。乘法的结果是c的系数矩阵。
“ ka2”是一种递归算法,在每个递归调用中,它将多项式除以两个相等数量的部分,并将它们相乘。对于“基本情况”,多项式的次数为零(即n = 1),并且乘法变成简单的整数乘法。我的代码正常工作。但是我需要它在“更少的时间”内工作并使用“更少的周期数”。
我的问题是:为了使我的代码更省时,我听说使用calloc是免费的。不好这就是为什么我需要摆脱calloc,malloc和free exc。而我想使用稳定大小的数组,因为我已经知道n的值是固定的,例如n = 512。我该如何使用此信息(n = 512固定的信息)并编写下面的递归代码而没有动态内存分配?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <x86intrin.h>
#include <stdint.h>
void copy(int *source,int *destination,int from,int to){
int i,j;
for( i=from,j=0; i<to; i++,j++)
destination[j] = source[i];
}
void sum(int *a,int *b,int *sum,int n){
int i;
for( i=0; i<n; i++)
sum[i] = a[i] + b[i];
}
int * ka2(int a[],int b[],int n){
int *c = calloc((2*n-1),sizeof(int));
/* base case */
if(n == 1){
*c = a[0] * b[0];
return c;
}
int n2 = n/2;
int *a0 = malloc(n2*sizeof(int));
int *a1 = malloc(n2*sizeof(int));
int *b0 = malloc(n2*sizeof(int));
int *b1 = malloc(n2*sizeof(int));
copy(a,a0,n2);
copy(a,a1,n2,n);
copy(b,b0,n2);
copy(b,b1,n);
int *sum_a0_a1 = malloc(n2*sizeof(int));
int *sum_b0_b1 = malloc(n2*sizeof(int));
sum(a0,sum_a0_a1,n2);
sum(b0,sum_b0_b1,n2);
int *p1 = ka2(a0,n2);
int *p2 = ka2(sum_a0_a1,n2);
int *p3 = ka2(a1,n2);
int i;
for( i=0; i<n-1; i++){
c[i] += p1[i];
c[i+n2] -= p3[i];
}
for( i=n+n2-2; i>=0 ; i--){
c[i+n2] -= c[i];
}
for( i=0; i<n-1; i++){
c[i+n2] += p2[i];
}
free(a0);
free(a1);
free(b0);
free(b1);
free(sum_a0_a1);
free(sum_b0_b1);
free(p1);
free(p2);
free(p3);
return c;
}
int main(){
int n;
printf("Enter n: ");
scanf("%d",&n);
int *a = malloc(n*sizeof(int));
int *b = malloc(n*sizeof(int));
int i;
printf("Enter the coefficients of a: ");
for( i=0; i<n; i++)
scanf("%d",a+i);
printf("Enter the coefficients of b: ");
for( i=0; i<n; i++)
scanf("%d",b+i);
printf("\n");
clock_t begin_t = clock();
int *c = ka2(a,b,n);
clock_t end_t = clock();
double total_t = (double)(end_t - begin_t) / CLOCKS_PER_SEC;
printf("The coefficients of ab are:\n");
for(i=0; i<2*n-1; i++)
printf("%d ",(c[i]%3+3)%3 );
printf("\n");
printf("\n");
printf("Total execution time: %f\n",total_t);
free(a);
free(b);
free(c);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。