Edit3:通过将数组的初始化限制为仅奇数来优化。谢谢@Ronnie!
Edit2:谢谢大家,好像没有其他我可以做的了。
编辑:我知道Python和Haskell是用其他语言实现的,或多或少地执行我所遵循的相同操作,并且编译的C代码将在任何一天击败它们。我只是想知道标准C(或任何库)是否具有更快的内置函数。
我正在使用Eratosthenes算法在C中实现素数筛,并且需要初始化从0到 n 的任意大小 n 的整数数组。我知道在Python中你可以做到:
integer_array = range(n)
就是这样。或者在Haskell:
integer_array = [1..n]
然而,我似乎无法找到在C中实现的类似方法。我已经提出的解决方案初始化数组然后迭代它,在该点将每个值分配给索引,但它感觉不可思议低效的。
int init_array()
{
/*
* assigning upper_limit manually in function for now, will expand to take value for
* upper_limit from the command line later.
*/
int upper_limit = 100000000;
int size = floor(upper_limit / 2) + 1;
int *int_array = malloc(sizeof(int) * size);
// debug macro, basically replaces assert(), disregard.
check(int_array != NULL, "Memory allocation error");
int_array[0] = 0;
int_array[1] = 2;
int i;
for(i = 2; i < size; i++) {
int_array[i] = (i * 2) - 1;
}
// checking some arbitrary point in the array to make sure it assigned properly.
// the value at any index 'i' should equal (i * 2) - 1 for i >= 2
printf("%d\n", int_array[1000]); // should equal 1999
printf("%d\n", int_array[size-1]); // should equal 99999999
free(int_array);
return 0;
error:
return -1;
}
有更好的方法吗? (不,显然没有!)
答案 0 :(得分:10)
我提出的解决方案初始化数组然后迭代它,在那个时候将每个值分配给索引,但它感觉非常低效。
您可以减少代码行数,但我认为这与“效率”无关。
虽然Haskell和Python中只有一行代码,但在幕后发生的事情与C代码的作用相同(在最好的情况下;根据它的实现方式,它可能会执行得更糟)。 / p>
有一些标准的库函数可以用一个常量值填充一个数组(虽然我不打赌,但它们可能会表现得更好),但这不适用于此。
答案 1 :(得分:9)
在优化分配方面,更好的算法可能是更好的选择: -
这应该可以加快速度。