2017-12-18 275 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:謝謝,我錯過了。我編輯過。 –