2017-12-18 358 views
-1

这里是该函数的每个部分中的最坏的情况下:优化这个小功能,这将在运行C的倍数量庞大

  • while循环运行53402倍时size等于9
  • 这意味着find_square()每个呼叫调用find_square()本身53402次,直到row == size,在此情况下是9

所以呼叫到find_square()总数为因此(53,402)^ 10 = 188 quattuordecillion。

这甚至不是最终功能的全部,但如果它已经很慢了,我想先解决它。显然这是一个可笑的数量的电话,但我真的不能看到它的方式。我愿意接受任何想法,这里的任何帮助都会很棒,谢谢!

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]; 
    } 
} 
+3

没有足够的上下文。谈论性能和手动优化,没有考虑到特定的系统,并不是真正有意义的。 – Lundin

+0

你想要什么样的环境? – numberjak

+1

您是否考虑过“动态编程”方法? – babon

回答

1

你有关创建“字的正方形”的评论暗示要打印或以其他方式报告9⨉9广场,其中每行和每列是grouped_dict一个字。在这种情况下,至少应该从find_square返回,此时填充的字符包含不可能用单词完成的部分行或列。

一种方法是在调用fill_row来检查列后,在find_square中添加代码。在fill_row之后,每列至少部分被填满。对于每列,检查grouped_dict中是否至少有一个词与目前列相匹配。如果没有,则从find_square返回而不尝试再填充。

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

  • 排序grouped_dict所以它是搜索匹配的是快。

  • 索引grouped_dict以复杂的方式更快地搜索匹配。

  • 交替填充行和列以尝试增加可能会尽快显示无法完成状态的冲突。

  • 使用通过检查grouped_dict限制可能发现部分匹配填充下一行或列时企图。

  • 重点关注grouped_dict中的偶尔字母作为关键点。

+1

除非我错了,否则代码*有*可观察到的效果;它修改'square'数组中的值。 –

+0

@JimMischel:谢谢,我错过了。我编辑过。 –