0

以下のようなプログラムを作成したいと考えています。

Create an NSArray populated with numbers from 1 to 100,000.
Loop over some code that deletes certain elements of the NSArray when certain conditions are met.
Store the resultant NSArray.

ただし、上記の手順は何度もループされるため、100,000 個の要素を持つこの NSArray をすばやく作成する方法が必要です。

それで、それを行う最も速い方法は何ですか?

for ループを使用して配列に繰り返しデータを入力する代わりの方法はありますか? これをすばやく実行できる NSArray メソッドなどはありますか?

あるいは、100,000 個の数字で NSArray を初めて作成することもできます。そして、メソッド arraywithArray を使用して、すべての新しい NSArray (ステップ 1 用) を作成しますか? (それはそれを行うより速い方法ですか?)

あるいは、私が望むものを達成するために、まったく別のことを考えているのかもしれません。

編集: 上記の投稿で NSArray を NSMutableArray に置き換えます

4

5 に答える 5

3

どの方法が最速かを事前に判断することは困難です。ブロックベースの機能が好きです。

NSMutableArray *array = ...; // your mutable array

NSIndexSet *toBeRemoved = [array indexesOfObjectsPassingTest:^BOOL(NSNumber *num, NSUInteger idx, BOOL *stop) {
    // Block is called for each number "num" in the array.
    // return YES if the element should be removed and NO otherwise;
}];
[array removeObjectsAtIndexes:toBeRemoved];

おそらく、正しく機能するアルゴリズムから始めて、プロファイリングに Instruments を使用する必要があります。

于 2012-10-23T02:34:41.143 に答える
2

あなたは見たいかもしれませんNSMutableIndexSet。数値の範囲を効率的に格納するように設計されています。

次のように初期化できます。

NSMutableIndexSet *set = [[NSMutableIndexSet alloc]
    initWithIndexesInRange:NSMakeRange(1, 100000)];

次に、たとえば、次のように123を削除できます。

[set removeIndex:123];

または、次のように400から409を削除できます。

[set removeIndexesInRange:NSMakeRange(400, 10)];

次のように、セット内の残りのすべてのインデックスを反復処理できます。

[set enumerateIndexesUsingBlock:^(NSUInteger i, BOOL *stop) {
    NSLog(@"set still includes %lu", (unsigned long)i);
}];

または、より効率的に、次のようになります。

[set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) {
    NSLog(@"set still includes %lu indexes starting at %lu",
        (unsigned long)range.length, (unsigned long)range.location);
}];
于 2012-10-23T02:45:21.047 に答える
2

ac 配列を使用して配列を作成し、そこから を作成するのが最も速いと確信していますNSArray(ベンチマークは近日公開予定)。数値を削除する方法によっては、最初のループでそれを行うのが最も速い場合があります。

const int max_num = 100000;
...
id *nums = malloc(max_num * sizeof(*nums));
int c = 0;
for(int i = 1; i <= max_num; i++) {
    if(!should_skip(i)) nums[c++] = @(i);
}
NSArray *nsa = [NSArray arrayWithObjects:nums count:c];

最初のベンチマークはやや意外でした。100M オブジェクトの場合:

NSArray alloc init:             8.6s
NSArray alloc initWithCapacity: 8.6s
id *nums:                       6.4s

したがって、配列の方が高速ですが、期待したほどではありません。

于 2012-10-23T02:27:38.880 に答える
0

ここで何をしているのかを再考することをお勧めします。なぜそのような配列が必要なのか自問してみてください。目的が任意の大きさの整数のコレクションを操作することである場合は、NSIndexSet(およびその可変の対応物)を使用することをお勧めします。

NSArray本当に最も効率的な方法でを操作したい場合は、この種のジョブ用に特に最適化された専用のサブクラスを実装する必要があります。

于 2012-10-23T02:41:41.533 に答える
0

高速列挙を使用して配列を検索できます。

for(NSNumber item in myArrayOfNumbers)
{
   If(some condition)
   {
        NSLog(@"Found an Item: %@",item);
    }
}
于 2012-10-23T02:22:16.037 に答える