微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用恒定大小的数组而不是calloc来编写此递归代码?

如何解决如何使用恒定大小的数组而不是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 举报,一经查实,本站将立刻删除。