多次使用 realloc 获取未知大小数组的好方法吗
Is it a good way to take an unkown-size array with using realloc many times
我将读取一个文件,其中包含一个大小未知的数组
像那样
1, 2, 3, ....
5、6、8 ....
该算法使用起来安全且快速吗?
array =NULL; /* for realloc */
for(i=0;fgets(line,256,input) != NULL ;++i){
array =(double**)realloc(array,sizeof(double*)*(i+1));
value =strtok(line,selector);
for(j=0;value != NULL;++j){
array[i] =(double*)realloc(array[i],sizeof(double)*(j+1));
sscanf(value,"%lf",&array[i][j]);
value =strtok(NULL,selector);
}
}
关于速度:您的算法具有二次复杂度 O(n^2)
,其中 n
是每行值的数量或行数。这效率不高。
此问题的正常解决方法是跟踪两个大小,即分配数组的大小和当前正在使用的元素数。通过仅增加当前使用的元素数量(当然,并将值存储在正确的位置)或首先 realloc()
将数组 两次 [=26] 来添加一个值=] 当前大小。这样做的结果是,即使 n
非常大,数组中的平均元素也只会被复制一次。这将复杂度降低到 O(n)
.
当然,如果您的数组中只有大约十个条目,那么所有这些都是无关紧要的。但是你要求的是速度。
关于安全性:我看到的唯一风险是您通过创建大量临时对象来将您的地址 space 碎片化,这些临时对象只是为了在下一次迭代。这 可能 导致长 运行 中的内存饥饿增加,但实际上不可能精确衡量这种影响。
我将读取一个文件,其中包含一个大小未知的数组 像那样
1, 2, 3, ....
5、6、8 ....
该算法使用起来安全且快速吗?
array =NULL; /* for realloc */
for(i=0;fgets(line,256,input) != NULL ;++i){
array =(double**)realloc(array,sizeof(double*)*(i+1));
value =strtok(line,selector);
for(j=0;value != NULL;++j){
array[i] =(double*)realloc(array[i],sizeof(double)*(j+1));
sscanf(value,"%lf",&array[i][j]);
value =strtok(NULL,selector);
}
}
关于速度:您的算法具有二次复杂度 O(n^2)
,其中 n
是每行值的数量或行数。这效率不高。
此问题的正常解决方法是跟踪两个大小,即分配数组的大小和当前正在使用的元素数。通过仅增加当前使用的元素数量(当然,并将值存储在正确的位置)或首先 realloc()
将数组 两次 [=26] 来添加一个值=] 当前大小。这样做的结果是,即使 n
非常大,数组中的平均元素也只会被复制一次。这将复杂度降低到 O(n)
.
当然,如果您的数组中只有大约十个条目,那么所有这些都是无关紧要的。但是你要求的是速度。
关于安全性:我看到的唯一风险是您通过创建大量临时对象来将您的地址 space 碎片化,这些临时对象只是为了在下一次迭代。这 可能 导致长 运行 中的内存饥饿增加,但实际上不可能精确衡量这种影响。