昨天我們透過「破題引導提問法」,學會了在寫代碼前先挖掘約束與邊界條件。然而在實際面試或工程場景中,寫出正確解答只是及格線,面試官或架構審查最常接著問的一句話往往是:
「請問你這段代碼的時間複雜度與空間複雜度是多少?能再優化嗎?」
許多開發者對於漸進符號(Big-O Notation)的直覺往往只停留在「一層迴圈是 O(n)、兩層是 O(n²)」。一旦遇到遞迴(Recursion)、二分搜尋(Binary Search)或涉及集合動態擴容(Dynamic Array Resizing)時,就很難給出精確評估。
今天我們就來探討:如何利用 ChatGPT 作為演算法助教,逐行拆解時間與空間開銷,精準掌握複雜度推導邏輯。
當你寫完一段解法,或想評估別人的代碼時,不要只問「這段複雜度是多少?」,而是要求 AI 依照「計算機科學的嚴謹步驟」逐步拆解:
【複雜度分析提示詞範本】
請扮演計算機演算法助教。請針對以下代碼進行詳細的複雜度評估:
[貼上代碼區塊]
請依序回答以下四點:
很多時候我們以為代碼只有一層迴圈,時間複雜度就是線性 O(n),但其實暗藏隱形開銷。
[實測問題範例]
給定一個字串清單,將所有單字組裝成一個由逗號分隔的句子:
[Java 初學者常見解法]
public class StringConcatDemo {
public static String buildSentence(String[] words) {
String result = "";
for (int i = 0; i < words.length; i++) {
result += words[i]; // 每次字串相加
if (i < words.length - 1) {
result += ",";
}
}
return result;
}
}
將這段代碼交給 AI 依模板分析後,得到的深度剖析如下:
透過 AI 指出瓶頸後,我們要求它提供最優解法,並重新評估:
[Java 優化解法:使用 StringBuilder]
public class StringConcatOptimized {
public static String buildSentence(String[] words) {
if (words == null || words.length == 0) {
return "";
}
// 預先估算容量,減少內部 char[] 擴容次數
StringBuilder sb = new StringBuilder(words.length * 10);
for (int i = 0; i < words.length; i++) {
sb.append(words[i]);
if (i < words.length - 1) {
sb.append(",");
}
}
return sb.toString();
}
}
透過 AI 分析複雜度時,請記住以下三條心法:
今天我們掌握了利用 AI 深度推導時間與空間複雜度的架構化流程,學會了揪出看似線性但實則平方級別的隱形開銷。