2017-06-05 53 views
1

會是什麼樣的複雜性(大O符號)以下功能:尋找複雜 - 斯威夫特

func sortList(_ thresholdValue: Int) -> [Int] { 
    var currentValue = thresholdValue 
    //Values is an array of integers - [Int] 
    var valArr = values.sorted { $0 > $1 } //should be a merge sort O(nlogn) 


    for i in 0...valArr.count-1 { 
     if valArr[i] < currentValue { 
      currentValue = currentValue - valArr[i] 

     } else { 
      let tempArr = filter(valArr[0...i-1], currentValue) // O(n) - array splicing 

      if tempArr.count > 0, let updatedValue = tempArr.first { 
       currentValue = currentValue - updatedValue 

       valArr = updateArr(array: valArr, fromIndex: valArr.index(of: updatedValue)!, toIndex: i) 

       currentValue = thresholdValue 

      } else { 
       currentValue = thresholdValue - valArr[i] 

      } 
     } 
    } 

    return valArr 
} 

func updateArr<T>(array: Array<T>, fromIndex: Int, toIndex: Int) -> Array<T>{ 
    var arr = array 
    let element = arr.remove(at: fromIndex) // O(n) 
    arr.insert(element, at: toIndex) // O(n) 

    return arr 
} 

func filter(_ tempArr:ArraySlice<Int>,_ currentValue : Int) -> [Int]{ 
    for value in tempArr { // O(n) 
     if let index = values.index(of: value) { 
      tempArr.remove(at: index) // O(n) 
     } 
    } 

    return tempArr.filter { $0 <= currentValue }.sorted { $0 > $1 } //O(n) O(mlogm) 
} 

上述函數試圖重新排列的整數,以致元素的序列(而不是子陣列)總計小於或等於k的值。一旦序列完成,一個新的序列(在同一個陣列中)的總和小於或等於k。我爲每個可能的執行添加了可能的複雜性(不是O(1))。

回答

1

我相信你的代碼的結構可以更簡單地認爲是這樣的:

sort values (O(nlogn) operation) 
loop over values (O(n) operation) 
    if some condition is satisfied 
    perform O(1) operation 
    else 
    perform O(n) operation 
    if some condition is satisfied 
     perform O(n) operation (updateArr) 
    else 
     perform O(1) operation 

首先你執行排序,那麼你遍歷你的輸入,並基於該循環執行O(n)的操作一些條件。在這種情況下最糟糕的情況是,如果您在循環內執行了多次與您的輸入大小相關的O(n)操作。在這種情況下,循環的時間複雜度爲O(n *(n-m)),其中m是與您的輸入大小相關的非常數​​,這是您在循環中不執行O(n)操作的次數。這簡化爲O(n^2 - n * m),即O(n^2)。你的循環的複雜度比你的循環更大,所以你最終的複雜度是O(n^2)。