Edit3: Tối ưu hóa bằng cách giới hạn việc khởi tạo mảng thành chỉ số lẻ. Cảm ơn bạn @Ronnie!C khởi tạo một mảng số nguyên lớn (rất) với các giá trị tương ứng với chỉ mục
Chỉnh sửa2: Cảm ơn tất cả, có vẻ như tôi không thể làm gì được nữa.
Chỉnh sửa: Tôi biết Python và Haskell được triển khai bằng các ngôn ngữ khác và ít nhiều hoạt động giống như tôi đã từng làm, và mã C tuân thủ sẽ đánh bại chúng bất kỳ ngày nào. Tôi chỉ tự hỏi nếu tiêu chuẩn C (hoặc bất kỳ thư viện) có tích hợp chức năng để làm điều này nhanh hơn.
Tôi đang thực hiện một rây thủ trong C sử dụng thuật toán Eratosthenes' và cần phải khởi tạo một mảng số nguyên kích thước tùy ý n 0- n. Tôi biết rằng trong Python bạn có thể làm:
integer_array = range(n)
và thế là xong. Hoặc trong Haskell:
integer_array = [1..n]
Tuy nhiên, tôi dường như không thể tìm thấy một phương pháp tương tự như thực hiện trong C. Các giải pháp tôi đã đi lên với khởi sự lặp mảng và sau đó qua nó, gán mỗi giá trị cho chỉ số tại thời điểm đó, nhưng nó cảm thấy vô cùng hiệu quả.
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;
}
Có cách nào tốt hơn để thực hiện việc này không? (không, dường như không có!)
Tại sao điều này không hiệu quả? Điều này có vẻ hoàn toàn tối ưu. Bất kỳ trình biên dịch hợp lý nào cũng sẽ không gặp khó khăn trong việc tìm ra mã này và thực hiện nó theo bất kỳ cách nào là tốt nhất cho nền tảng đó. –
Nó chỉ có vẻ như nếu có nên có một số cách để khởi tạo mảng với các giá trị từ 0 đến n nhanh hơn.Vì tôi đang xem xét các mảng có kích thước tùy ý, điều này có thể sẽ làm chậm thuật toán, ngay cả khi nó được triển khai trong mã C đã biên dịch. – Dalton
Tại sao bạn nghĩ một số cách khác sẽ nhanh hơn? Điều gì có thể là tối ưu phụ về mã này? Bạn đã làm sạch và rõ ràng đã nói với trình biên dịch những gì bạn muốn, những gì sẽ ngăn chặn nó tạo ra các mã hiệu quả nhất để đạt được hiệu ứng đó? –