0

配列を作成するときに NSSortDescriptor を使用して配列をソートできることはわかっていますが、既に存在する配列を取得して、既にソートされているかどうかを確認する事前に構築された方法はありますか?

そうでない場合、私はこれを自分で行うことができる2つの方法を考えることができます:

  1. この質問のコード。
  2. 古い配列から新しい配列を作成しますが、新しい配列を作成するときに NSSortDescriptor を使用してから、2 つの配列が等しいかどうかを確認します。

私のコードの最適化は少しさびているので、これらの 2 つの方法のどちらが優れているでしょうか (高速/最も安定)? または、これらのいずれよりも優れていることを確認できる別の方法はありますか?

4

2 に答える 2

1

あなたが参照する質問は、アルゴリズムが O(n) であり、可能な限り高速であると述べています。一般に、並べ替えは常にそれよりもコストがかかります。入力がすでにソートされている場合に限り、バブルソートなどの一部のアルゴリズムでは O(n) だけを取ります。

したがって、提案 (1) は常に提案 (2) を上回ります。後者はソートのコストと等価テストのコストを足したものであり、等価テスト自体は O(n) であるためです。

可変配列があり、それがソートされているかどうかを維持したい場合は、ソートされたときにフラグを設定し、追加時にフラグをリセットします。

于 2012-10-10T17:52:22.043 に答える
-1

ここでの別の方法は、NSMutableArray をサブクラス化することです。これには、配列をソートするときに設定する BOOL ソート プロパティがあります。

サブクラス化したくない場合は、配列にキーを設定できます。これは同じことを示し、それを渡すと配列に残ります。

// create array
NSMutableArray* array = [NSMutableArray arrayWithCapacity:1];
[array setValue:NO forKey:@"sorted"];

//... insert values
//... sort

// check if sorted
BOOL sorted = [array valueForKey:@"sorted"];

// add a new value to the array
[array addObject:obj];
[array setValue:NO forKey:@"sorted"];
于 2012-10-10T19:34:53.000 に答える