GPT問答

問題 1:在一個長度為 127 的已排序陣列中,使用二元搜尋法尋找 89,請列出最差情況下的每次比較索引及計算公式。
最差情況比較次數 = ceil(log2(127)) = 7
索引比較步驟:0~126 -> mid=(0+126)/2 -> 63, 64~126 -> mid=95, 64~94 -> mid=79, ... 最終找到索引 89
問題 2:設計一個程式,使用終極密碼遊戲自動猜數字 1~1000,要求最少次數找到答案,請寫出演算法流程及時間複雜度分析。
流程:每次猜中間值,若太大縮小上界,太小增加下界,重複直到找到答案。
時間複雜度 O(log2 n) ≈ 10 次最多。
問題 3:給定陣列 [34,7,23,32,5,62],請寫出使用快排(QuickSort)排序的每個分割步驟。
第一輪 pivot=32 → 左:[7,23,5] 右:[34,62]
第二輪左部分 pivot=23 → 左:[7,5] 右:[]
第三輪左左 pivot=5 → 左:[] 右:[7]
排序完成:[5,7,23,32,34,62]
問題 4:請解釋二元搜尋樹(BST)插入和搜尋的遞迴流程,並畫出插入數列 [50,30,70,20,40,60,80] 的樹狀圖。
插入: 若節點為 null,建立新節點;否則比較大小往左/右子樹遞迴。
搜尋: 比較當前節點,左/右遞迴直到找到或 null。
樹狀圖:
50 / \ 30 70 / \ / \ 20 40 60 80
問題 5:給定數列 [3,9,2,8,6,1,7],用 HeapSort 排序並列出最大堆構建和每次交換後堆狀態。
建堆: [9,8,7,3,6,1,2]
交換根與尾: [2,8,7,3,6,1,9]
調整堆: [8,6,7,3,2,1,9]
重複直到排序完成: [1,2,3,6,7,8,9]
問題 6:在排序後的陣列中實作插值搜尋(Interpolation Search),給陣列 [10,20,30,...,100] 搜尋 70,請計算每次 mid。
插值公式: mid = low + ((x - arr[low])*(high-low))/(arr[high]-arr[low])
第一次 mid=low + ((70-10)*(9-0))/(100-10)=0+6=6 → arr[6]=70,找到!
問題 7:描述 MergeSort 遞迴分解過程,給數列 [38,27,43,3,9,82,10] 展示每次拆分與合併。
拆分:[38,27,43,3] & [9,82,10]
左:[38,27] & [43,3]
左左:[38] & [27] → 合併[27,38]
右:[43] & [3] → 合併[3,43]
左總合併[3,27,38,43]
右:[9] & [82,10] → 合併[9,10,82]
最後合併: [3,9,10,27,38,43,82]
問題 8:解釋快速搜尋(QuickSelect)用於找第 k 大元素,並示範在陣列 [7,10,4,3,20,15] 找第 3 大。
選 pivot, 分區: [7,10,4] pivot=20, 右:20
目標 k=3 → 3rd 大在左部分 → 遞迴
最終找到第3大元素:10
問題 9:設計一個自動終極密碼程式,允許用戶設定範圍和最大嘗試次數,請描述流程與邏輯。
1. 用戶輸入 min, max, max_try
2. 設定初始 low=min, high=max
3. 使用二分策略,每次猜 mid=(low+high)/2
4. 若 mid>答案→high=mid-1, mid<答案→low=mid+1
5. 記錄嘗試次數,超過 max_try 結束
6. 若找到 mid=答案,輸出成功
問題 10:在 Node.js 中如何使用 Worker Threads 進行 CPU 密集型平行運算,請寫出範例程式。
const { Worker } = require('worker_threads'); function runService(workerData){ return new Promise((resolve, reject)=>{ const worker = new Worker('./worker.js', {workerData}); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', code => {if(code!==0) reject(new Error(`Exit ${code}`));}); }); }