0

私は、単語内のすべてのサブワードを通過して見つける再帰アルゴリズムを持っています (以下のアルゴリズム)。私のアルゴリズムの問​​題は、フェッチ リクエストでコア データをスパム送信することであり、これにより実行が非常に遅くなります。

これを行うためのより良い方法はありますか?、または私はより長い時間で立ち往生しています.

- (NSMutableArray *)subwordPermutations:(NSMutableArray *)permutationArray subWord:  (NSMutableString *) subWord {

    if ([subWord length] == 1)
        return permutationArray;

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Word"];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"alphaSortedWord == %@", subWord];
    [fetchRequest setPredicate:predicate];

    JGTAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;

    NSError *error;
    [permutationArray addObjectsFromArray:[managedObjectContext   executeFetchRequest:fetchRequest error:&error]];

    if (error)
        NSLog(@"%@", [error localizedDescription]);

    for (int i = 0; i < [subWord length]; i++) {

        NSMutableString *temp = [NSMutableString stringWithFormat:@"%@", subWord];
        [temp deleteCharactersInRange:NSMakeRange(i, 1)];

        permutationArray = [self subwordPermutations:permutationArray subWord:temp];
    }

   return permutationArray;
}

編集: 言い忘れましたが、コア データのオブジェクトには、単語とアルファベット順に並べ替えられた単語の 2 つの文字列プロパティがあります。

4

1 に答える 1

0

特定の文字列の部分文字列を(再帰的に)作成し、部分文字列ごとにフェッチ要求を実行して、その文字列がデータベースにあるかどうかを確認しているようです。

単一のフェッチ リクエストを高速化するには、Core Data モデル インスペクタで「alphaSortedWord」属性 をインデックス化してみてください。

バッチで作業することにより、パフォーマンスが確実に向上するはずです。最初にサブワード候補を配列に収集し (おそらく 100、最適なバッチ サイズを見つける必要があります)、次に述語を使用してフェッチ リクエストを実行します。

NSArray *candidates = ...; // array of subword candidates
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"alphaSortedWord IN %@", candidates];

その候補リストのデータベース内のすべての単語を検索します。次に、候補の次の配列を作成して続行します。

于 2013-10-14T07:54:26.157 に答える