0

免責事項: 私は iOS 開発に比較的慣れていません。このプロジェクトには ARC を使用しています。

これらの操作のどれがより高速で、その理由を知りたいですか?

if([selectedIndexes containsObject:indexPath]) {
    [selectedIndexes removeAllObjects];
    for(int i=0; i<self.options.count; i++) {
        [selectedIndexes addObject:[NSIndexPath indexPathForItem:i inSection:0]];   
    }
} 

また

NSIndexPath *indexPath;
if([selectedIndexes containsObject:indexPath]) {
    for(int i=0; i<self.options.count; i++) {
        indexPath = [NSIndexPath indexPathForItem:i inSection:0];
        if(![selectedIndexes containsObject:indexPath])
            [selectedIndexes addObject:indexPath];
    }
}

編集1

問題は、removeAllObjecs を実行してから元に戻す方が速く動作するか、それともアイテムがまだ存在しないかどうかを確認してセットに追加する必要があるかどうかです。

4

1 に答える 1

1

これを分析してみましょう (ifループをラップするものは同じなので無視します)。

オプション 1:
-removeAllObjects: すべてのオブジェクトが配列から削除され、それぞれが 1 回解放されます ==> 最小で N 個の操作 ==> O(N)
ループは N 回の反復を行い、それぞれの反復:
* NSIndexPath==> O(1)を作成します。
* インデックス パスを配列の末尾に追加 ==> O(1)
==> O(N) + O(N) + N*O(1) + N*O(1) = 2O(N) + 2*N*O(1) = 4O(N) = O(N)

オプション 2:
ループはそれぞれ N 回の反復を行います: * ==> O(1)を
作成します * 配列内の存在を検証します ==> O(N) (配列は重複を含む可能性があると仮定する必要があります) *ステートメントはまた、N回要求されるため、その代償があり、ループの分岐述語を台無しにします。 ** ループ内の加算は確率論的な問題です (ここでは無視します) ==> N*(O(1) + O(N) + O(1)) = N*O(N) + 2*N *O(1) = O(N^2)NSIndexPath

if

==> フラット分析では、最初のオプションの方が優れていることが示唆されます。

を使用する場合NSMutableIndexSet、コードは両方のオプションで次のようになります。

//Not tested
//Assume that selectedIndexes is a NSMutableIndexSet
if ([selectedIndexes containsIndex:indexPath.row]) {
    if (self.options.count) {//This could probably be optimised depend on your goal
        [selectedIndexes addIndexesInRange:NSMakeRange(0,self.options.count-1)];
    } else {
        [selectedIndexes removeAllIndexes];
    }
} 

==> ここでの最悪の場合の複雑さはおそらく O(N) です

間違った仮定や計算を自由に修正してください

于 2013-04-21T18:18:18.523 に答える