2017-05-23 43 views
-5

存在使用環路例如加入整數標準方式,最佳方式

sum =0; 
for(int i =0;i<arraySize;i++){ 
    sum+=array[i]; 
} 

上述邏輯的時間複雜度是O(n ),但是如果n非常大(考慮10^10),那麼計算需要更多時間。所以,請給我任何解決方案,以小於O(n)的時間複雜度工作。

+6

讓我們來看看:你想在一個數組,總結每一個元素......但你想要的東西比在陣列中查看每個元素更快,嗯......祝你好運!注意:你可以獲得更快的速度(例如,並行運行單獨的線程,在GPU上執行,使用指針算術代替索引等)......但是你不能*提高「算法複雜度」上)。 – paulsm4

+0

您可以通過多線程提高計算時間。 – Vic

+0

是的,那是不可能的。 – ktb

回答

-2

您可以通過始終保持數組總和的記錄來完成此操作。從一個空數組和一個空變量sum開始。然後,每當你添加一個項目到數組,相應地更新總和。

有兩個主要操作會影響數組數組的總和:向數組中添加一個新數字,並從數組中刪除一個數字。添加時,和會變成添加到新號碼的前一個總和。因此只需將新號碼的值添加到sum變量中即可。當刪除一個項目時,總和變成總和減去被刪除的數字。因此,從sum中減去正在刪除的項目的值。更多的操作可以執行,但它們都基於這兩個。

因此,您可以實施insert,popreplace 方法或函數來爲您抽象該作品。

因此,無論何時您添加或刪除一個項目,您都會通過一些O(1)算法重新計算總和。但是你可以訪問O(1)時間的總和,因爲總和在一個變量中。這當然要求你不要直接改變數組的值而不使用你的函數/方法。

不幸的是,我不太瞭解C和Java,並不足以提供實現。我希望從數據結構中勾勒出來有助於實現這一點。

編輯︰這是一個Python實現來顯示的概念。希望你能從中獲得核心。

class ArraySum: 
    ''' contains an array of numbers and a representation of the 
     sum, which is updated in each insert/pop/replace operation ''' 
    def __init__(self): 
     self._data = [] 
     self.sum = 0 

    def append(self, elem): 
    ''' add an item to the array''' 
     self.sum += elem # update sum 
     self._data.append(elem) # add to array 

    def pop(self, i=None): 
    ''' remove the item at index i of the array''' 
     if i is None: 
      i = len(self._data) 
     self.sum -= self._data[i] 
     return self._data.pop(i) 

    def replace(self, i, elem): 
    ''' replace the item at i by a new element''' 
     self.sum -= self._data[i] 
     self.sum += elem 
     self._data[i] = elem 

if __name__ == '__main__': 
    a = ArraySum() 

    a.append(4) 
    print(a.sum) # sum = 0 + 4 
    a.append(8) 
    print(a.sum) # sum = sum + 8 
    a.pop(1) 
    print(a.sum) # sum = sum - 8 
    a.replace(0, 1) 
    print(a.sum) # sum = sum - 4 + 1 
0

考慮塊

sum =0; 
for(int i =0;i<arraySize; i = i + 5){ 
    sum+=array[i]; 
    sum+=array[i+1]; 
    sum+=array[i+2]; 
    sum+=array[i+3]; 
    sum+=array[i+4]; 
} 

當然循環通過你需要正確地檢查出界。

在這個平凡的例子我懷疑有要作出的任何收益

+2

這並不會改變複雜性。 – Olaf

+0

不僅如此,當'arraySize%5'非零時,它會嘗試讀取超出範圍。 –

+0

@TobySpeight我的回答很清楚地表明*你需要正確檢查出界* –