2012-06-19 120 views
0

我使用比較兩個數組的標準方式,但它的速度慢,只是做一個標準的O(n^2) 你們可以看到問題嗎?比較數組緩慢

diffArray: function (arr1, arr2, observableArray, mapping) { 
     //We cant sort orginal arrays 
     var o = arr1.slice(0); 
     var n = arr2.slice(0); 

     // sort both arrays (or this won't work) 
     var sorter = function (left, right) { 
      return mapping.key(left) - mapping.key(right); 
     }; 
     o.sort(sorter); n.sort(sorter); 

     // declare temporary variables 
     var op = 0; var np = 0; 
     var added = []; var removed = []; 

     // compare arrays and add to add or remove lists 
     while (op < o.length && np < n.length) { 
      if (mapping.key(o[op]) < mapping.key(n[np])) { 
       // push to diff? 
       removed.push(o[op]); 
       op++; 
      } 
      else if (mapping.key(o[op]) > mapping.key(n[np])) { 
       // push to diff? 
       added.push(n[np]); 
       np++; 
      } 
      else { 
       this.diffMembers(o[op], n[np]); 
       op++; np++; 
      } 
     } 

     // add remaining items 
     if (np < n.length) 
      added = added.concat(n.slice(np, n.length)); 
     if (op < o.length) 
      removed = removed.concat(o.slice(op, o.length)); 

     ko.utils.arrayForEach(removed, function (item) { 
      this.itemDeleted(item, mapping); 
     }.bind(this)); 


     ko.utils.arrayForEach(added, function (item) { 
      if (observableArray.concurrencyExtendOptions) { 
       this.itemAdded(observableArray, item, mapping); 
      } 
     } .bind(this)); 
    } 

注: 映射對象只是一個輔助對象的用戶提供到比較陣列,ARR1和ARR2對象是標準JS陣列而observableArray是展開的淘汰賽陣列

它是基於一個C#代碼示例,所以也許在JS中的排序算法不是很好?

回答

1

不知道它會回答你,真的,但這裏是我使用數組diff

Array.prototype.diff = function(arr) { 
    return arr.map(function(v) { 
     if (!~this.indexOf(v)) return v; 
    }, this).filter(Boolean); 
}; 

用法:

arr.diff(otherArr); 

PS:太長被張貼評論...不確定它是否值得回答。
PS2:函數的原作者:@Esailija

+0

這就是一個經典的O(n^2)差異,編輯:最壞的情況下接近n^2 – Anders