一个 iOS 搜索引擎,允许在大量数据中搜索元素时出现错误。许多开发者会执行对 CoreData 数据库或 NSArray 的 predicate 进行过滤的 fetch 请求。
许可研究是简化搜索步骤的一个替代方案。优点:
搜索类型 | 时间(ms) | 数据结构 |
---|---|---|
精确搜索 | 200 | 使用谓词 |
精确搜索 | 2800 | 使用许可研究(ExactScoringOperation*) |
精确搜索 | 100 | 使用许可研究(HeuristicScoringOperation*) |
精确搜索 | 700 | 使用许可研究(HeurexactScoringOperation*) |
容错搜索 | 不可能... | 使用谓词 |
容错搜索 | 2800 | 使用许可研究(ExactScoringOperation*) |
容错搜索 | 100 | 使用许可研究(HeuristicScoringOperation*) |
容错搜索 | 700 | 使用许可研究(HeurexactScoringOperation*) |
它是 Smith-Waterman 算法 的自定义实现。该算法的目的是获得最佳局部对齐。使用相似性矩阵来容忍错误。
[[PermissiveResearchDatabase sharedDatabase] setDatasource:self];
-(void)rebuildDatabase
- (void)addObject:(id)obj forKey:(NSString *)key;
- (void)addObjects:(NSArray *)obj forKey:(NSString *)key;
- (void)addObjects:(NSArray *)objs forKeys:(NSArray *)keys;
- (void)addObjects:(NSArray *)objs forKeyPaths:(NSArray *)KeyPaths;
- (void)addManagedObject:(NSManagedObject *)obj forKey:(NSString *)key;
- (void)addManagedObjects:(NSArray *)objs forKey:(NSString *)key;
- (void)addManagedObjects:(NSArray *)objs forKeys:(NSArray *)keys;
- (void)addManagedObjects:(NSArray *)objs forKeyPaths:(NSArray *)KeyPaths;
示例
///PermissiveResearchDatabase datasource
-(void)rebuildDatabase
{
NSString *jsonPath = [[NSBundle mainBundle] pathForResource:@"data5000"
ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:jsonPath];
NSError *error = nil;
id json = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
[[PermissiveResearchDatabase sharedDatabase] addObjects:json forKeyPaths:@[@"name",@"gender",@"company",@"email"]];
self.searchedList = json;
}
-(NSInteger)customCostForEvent:(ScoringEvent)event
示例(默认值)
-(NSInteger)customCostForEvent:(ScoringEvent)event
{
switch (event) {
case ScoringEventPerfectMatch:
return 2;
break;
case ScoringEventNotPerfectMatchKeyboardAnalyseHelp:
return 1;
break;
case ScoringEventNotPerfectBecauseOfAccents:
return 2;
break;
case ScoringEventLetterAddition:
return -1;
break;
default:
break;
}
return NSNotFound;
}
[[PermissiveResearchDatabase sharedDatabase] setDelegate:self];
[[PermissiveResearchDatabase sharedDatabase] searchString:searchedString withOperation:ScoringOperationTypeExact];
#pragma mark PermissiveResearchDelegate
-(void)searchCompletedWithResults:(NSArray *)results
{
dispatch_async(dispatch_get_main_queue(), ^{
self.findedElements = results;
[self.tableView reloadData];
});
}
[[ScoringOperationQueue mainQueue] cancelAllOperations]
HeuristicScoringOperation *ope = [[HeuristicScoringOperation alloc] init];
ope.searchedString = searchedString;
SearchCompletionBlock block = ^(NSArray *results) {
dispatch_async(dispatch_get_main_queue(), ^{
self.findedElements = results;
NSLog(@"finded elements %@", results);
});
};
[ope setCustomCompletionBlock:block];
[[ScoringOperationQueue mainQueue] addOperation:ope];
算法的复杂度非常不同。启发式评分操作 < 确切评分操作 << 精确评分操作
ExactScoringOperation
HeuristicScoringOperation
HeurexactScoringOperation