3

NSArrayiPhoneでインタラクティブなオートコンプリートを行うために大きな(19kアイテム)をフィルタリングすると、パフォーマンスの問題が発生します。

現在、ユーザーが検索ボックスに文字を入力するたびにNSPredicate、別のスレッドでを使用して配列のフィルタリングを開始し、結果を表示します。もちろん、ユーザーが2番目のキーをタブで押す前にiPhoneがフィルタリングを完了するにはデータセットが大きいため、ユーザーが1〜2秒間入力を停止するまで、プレビューは表示されません。

[Computer Science Babble、この部分はスキップしても問題ありません]フレームワークが行っているのは、配列内のすべてのアイテムにNSPredicateを適用することです。したがって、O(n)が必要です。nは配列アイテムの数です。ただし、より効率的なアプローチを使用して、O(log(n))で問題をより解決できるはずです。つまり、リストをO(n * log(n))で1回ソートし(これは開発時に実行できます)、そのリストO(log(n))のどこに検索文字列を挿入する必要があるかを調べ、アイテムが検索文字列O(m)で始まらないまでそこにあります。m << nアルゴリズムを使用して、効率的なO(log(n)+ m)が得られます。DAWGの方がさらに良いでしょうが、ツールキットでそのようなものを見たのを覚えていません。[/ Computer Science Babble]

配列に通知する組み込みの方法がある場合、フィルターがテストしているのとまったく同じフィールドで並べ替えられるため、並べ替えられた配列にフィルターを効率的に適用できるのではないかと思いました。

解決

個々の文字を、その文字で始まるキーを持つアイテムの配列にマップする辞書を使用して、非常に単純な検索インデックスを作成しました。少なくとも私のユースケースでは、これは瞬時の表示オートコンプリートを実現するのに十分な最適化でした。

4

1 に答える 1

2

データが何らかの方法で並べ替えられている場合は、配列を複数の小さな配列に分割することをお勧めします。したがって、AG、HM、NZアレイがある可能性があります。

または、すべてをコアデータまたはSQLiteデータベースに詰め込み、クエリを使用して処理を高速化します。このような大規模なデータセットを処理している場合、インデックス付きデータベースの選択は、メモリ内のデータをフィルタリングするよりもはるかに効率的です。

もう1つの提案は、トライを作成することです。これにより、すべてがはるかに良くなります。それらは作成するのに少し手間がかかりますが:

http://en.wikipedia.org/wiki/Trie

于 2012-06-21T14:41:33.670 に答える