阿摩線上測驗 登入

申論題資訊

試卷:109年 - 109 經濟部所屬事業機構_新進職員甄試_資訊:1.資訊管理、2.程式設計#92856
科目:國營事業◆1.資訊管理 2.程式設計
年份:109年
排序:0

題組內容

六、給定一陣列名稱為 NUM,包含 n 個不重複整數(n > 2),請撰寫虛擬程式碼找出該陣 列 中 元 素 兩 兩 乘 積 最 大 者(即 Maximum pairwise product, 變 數名 稱 為 maxprod, maxprod = maximum (NUM[i] * NUM[j], i <> j) ),完成下列 2 項子題。

申論題內容

(二)請在演算法時間複雜度須為 O(n)的限制下,撰寫虛擬程式碼。(請注意,如作答內容之演算法時間複雜度經分析為 O(n2),本子題僅給 5 分)(15 分)

詳解 (共 2 筆)

詳解 提供者:蔡明勳
詳解 提供者:adamhsu622
以下為簡單的虛擬碼

int getmaxprod() {
    
    // max1,max2,min1,min2 儲存陣列索引值
    //
    
    // 找最大值
    //
    max1 <- 0                   // 假設 num[0] 為最大值    
    for i <- 1 to (n-1) do
        若 num[i] > num[max1] 則 max1 <- i
    end for
    
    swap(num[max1],num[0])      // 交換 num[max1]和 num[0]
 
    // 找次大值
    //
    max2 <- 1                   // 假設 num[1] 為次大值    
    for i <- 2 to (n-1) do
        若 num[i] > num[max2] 則 max2 <- i
    end for
    
    swap(num[max2],num[1])      // 交換 num[max2]和 num[1]
    prod1 <- num[0]*num[1]      // 計算第一組最大乘積
 
    // 找最小值
    //
    min1 <- 0                   // 假設 num[0] 為最小值    
    for i <- 1 to (n-1) do
        若 num[i] < num[min1] 則 min1 <- i
    end for
    
    swap(num[min1],num[0])      // 交換 num[min1]和 num[0]
 
    // 找次小值
    //
    min2 <- 1                   // 假設 num[1] 為次小值    
    for i <- 2 to (n-1) do
        若 num[i] < num[min2] 則 min2 <- i
    end for
    
    swap(num[min2],num[1])      // 交換 num[min2]和 num[1]
    prod2 <- num[0]*num[1]      // 計算第二組最大乘積
 
    // 最後結果
    //
    if prod1 > prod2 then
        maxprod <- prod1
    else
        maxprod <- prod2
 
    return maxprod;
}
過程用到四個迴圈,每個迴圈的時間複雜度為 O(n),
故加總起來還是為 O(n)