1

シナリオ: iOS/Objective-C アプリケーション。数十から数千のエントリを収集して、タイムスタンプ順に並べる必要があります。ここまでは簡単です。ディスクリプタでソートされた NSArray です。

ただし、配列にアクセスして、時間範囲ごとに複数のエントリを選択できる必要があります (開始/終了時刻がどのエントリにも正確に対応していない可能性があります)。そして、これは、セットアップ時間とアクセス時間の両方で、適度にパフォーマンスに敏感です。

私が思い付くことができる最善の方法は、配列をソートし、開始点/終了点のバイナリ検索を行うことです。これは確かに実行可能であり、おそらく十分に高速です。ただし、それはまったく「感じ」ません (理由はわかりませんが)。

他のアイデアはありますか?

4

1 に答える 1

1

1)配列をソートします(オプションですが、必要だと言いました)

2) バイナリ検索の代わりに、NSPredicate を使用して、関心のあるエントリを見つけます。

これは、タイムスタンプを持つ独自のクラスに適応する必要がある私のプロジェクトの 1 つからのサンプル コードです。

// this is the property wher you store the data
@property NSArray *data;

// this is a custom struct to hold to timestamp values, the min and max 
typedef struct CMTTimeStampRange {
  UInt64 min, max;
} CMTTimeStampRange;

// return a sub array with only the objects between two time stamps
- (NSArray *)samplesInTimeStampRange:(CMTTimeStampRange)timeStampRange
{
  NSArray *tsRange = @[@(timeStampRange.min), @(timeStampRange.max)];
  NSPredicate *filter = [NSPredicate predicateWithFormat:@"timeStamp BETWEEN %@",tsRange];
  NSArray *samples = [self.data filteredArrayUsingPredicate:filter];
  return samples;
}

アップデート

上記のこのスニペットは、投稿された質問に対する簡単な解決策を提供することを目的としており、高性能コードを意図したものではありません。高いパフォーマンスを得るには、Core Foundation (CFArray) と C 関数を使用することをお勧めします。CFArray には、並べ替えられた CFArray のバイナリ検索である関数 CFArrayBSearchValues があるため、独自の関数を実行する必要はありません。

于 2013-08-28T17:50:17.657 に答える