Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化这个小函数,它将在C中运行大量次_C_Algorithm_Performance_Optimization - Fatal编程技术网

优化这个小函数,它将在C中运行大量次

优化这个小函数,它将在C中运行大量次,c,algorithm,performance,optimization,C,Algorithm,Performance,Optimization,以下是函数每个部分的最坏情况: 当size等于9时,while循环运行53402次 这意味着find_square()的每次调用都会调用find_square()自身53402次,直到row==size,在本例中为9 因此,对find_square()的调用总数为(53402)^10= 188四分之一 这甚至不是最终函数的全部,但是如果它已经这么慢了,我想首先修复它。显然,这是一个可笑的电话数量,但我真的看不到一个办法来解决它。我愿意接受任何想法,这里的任何帮助都会很好,谢谢 void fi

以下是函数每个部分的最坏情况:

  • size
    等于9时,
    while
    循环运行53402次
  • 这意味着
    find_square()
    的每次调用都会调用
    find_square()
    自身53402次,直到
    row==size
    ,在本例中为9
因此,对
find_square()
的调用总数为(53402)^10= 188四分之一

这甚至不是最终函数的全部,但是如果它已经这么慢了,我想首先修复它。显然,这是一个可笑的电话数量,但我真的看不到一个办法来解决它。我愿意接受任何想法,这里的任何帮助都会很好,谢谢

void find_square(char*** hashed_dict, char*** grouped_dict, char** square, int size, int row) {

    if (row == size) {
        return;
    }
    int i = 0;
    while (grouped_dict[size - 1][i] != NULL) {
        fill_row(square, row, size, grouped_dict[size - 1][i]);
        find_square(hashed_dict, grouped_dict, square, size, row + 1);
        i++;
    }
}

void fill_row(char** square, int row, int size, char* word) {

    for (int i = 0; i < size; i++) {
        square[row][i] = word[i];
    }
}
void find\u square(字符***散列、字符***分组、字符**square、整数大小、整数行){
如果(行==大小){
返回;
}
int i=0;
while(分组dict[size-1][i]!=NULL){
填充行(正方形、行、大小、分组的[size-1][i]);
查找平方(散列、分组、平方、大小、行+1);
i++;
}
}
空白填充行(字符**正方形,整数行,整数大小,字符*字){
对于(int i=0;i
您关于创建“字格”的评论意味着您想打印或以其他方式报告9⨉9个方块,其中每一行和每一列都是
grouped\u dict
中的一个单词。在这种情况下,如果到目前为止填充的字符包含无法用单词完成的部分行或列,则至少应该从
find_square
返回

一种方法是在检查列的
fill_row
调用之后,在
find_square
中添加代码。在
填充\u行
之后,每列至少部分填充。对于每一列,检查
grouped\u dict
中是否至少有一个单词与该列匹配。如果没有,则从
find_square
返回,不再尝试填充

这将极大地加快您的程序,但也可能进行其他优化。你应该考虑的事情包括:

  • 排序
    分组\u dict
    ,以便在其中快速搜索匹配项

  • 索引
    grouped_dict
    ,以复杂的方式搜索匹配项,甚至更快

  • 交替地填充行和列,试图增加可能显示无法更快完成状态的冲突

  • 使用通过检查
    grouped_dict
    找到的部分匹配,以限制填充下一行或列时尝试的可能性

  • 重点关注分组词典中的不常见字母


没有足够的上下文。在没有特定系统的情况下谈论性能和手动优化是没有意义的。你考虑过“动态编程”方法吗?什么是容器,某种哈希表?它是如何实施的?你为什么用三星编程代替ADT?结构定义在哪里?你优化什么系统?哪个编译器?等等。我认为我们不需要太担心编译器,直到我们可以将1e47减少到可管理的程度;)也就是说,不清楚这段代码的目标是什么-它解决了什么问题?如果你的算法需要
(53402)^10
递归调用,你需要一个更好的算法,而不是更快的代码。除非我弄错了,否则这段代码确实有明显的效果;它修改了
正方形
数组中的值。@JimMischel:谢谢,我错过了。我编辑过。