0

我有一个递归算法,它遍历并找到一个单词中的所有子单词(下面的算法)。我的算法的问题在于,它使用 fetch 请求向核心数据发送垃圾邮件,这使得它运行非常缓慢。

有没有更好的方法来做到这一点?还是我坚持更长的时间。

- (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;
}

编辑:我忘了提,核心数据中的对象有两个字符串属性,单词和按字母顺序排序的单词。

4

1 回答 1

0

您似乎(递归地)创建给定字符串的子字符串,并为每个子字符串执行一个提取请求以检查该字符串是否在数据库中。

为了加快单个获取请求,您可以尝试 在核心数据模型检查器中使“alphaSortedWord”属性索引。

您绝对应该通过批量工作来提高性能:首先在数组中收集候选子词(可能是 100,您必须找出最佳批量大小),然后使用谓词执行获取请求

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

查找该候选列表的数据库中的所有单词。然后创建下一个候选数组并继续。

于 2013-10-14T07:54:26.157 回答