我有一个递归算法,可以查找单词中的所有子词(下面的算法)。我的算法的问题在于它使用获取请求来发送核心数据,这使得它运行得非常慢。
有没有更好的方法来做到这一点?或者我坚持了更长的时间。
- (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;
}
编辑:我忘了提及,核心数据中的对象有两个字符串属性,单词和按字母顺序排序的单词。
答案 0 :(得分:0)
似乎您(递归地)创建给定字符串的子字符串以及每个子字符串 执行获取请求以检查该字符串是否在数据库中。
要加快单个获取请求,您可以尝试制作“alphaSortedWord”属性 核心数据模型检查器中的索引。
您应该通过批量工作获得性能提升: 首先在数组中收集子候选词候选(可能是100,你必须找出最佳的批量大小),然后用谓词执行获取请求
NSArray *candidates = ...; // array of subword candidates
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"alphaSortedWord IN %@", candidates];
查找数据库中该候选列表的所有单词。 然后创建下一个候选数组并继续。