2013-10-14 72 views
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; 
} 

編輯:我忘了提及,核心數據中的對象有兩個字符串屬性,單詞和按字母順序排序的單詞。

+0

你做了什麼來檢查你沒有反覆調用'subwordPermutations:'具有相同的'subWord'? – Wain

回答

0

看來你(遞歸)創建一個給定的串子,併爲每個子 執行讀取請求,以檢查是否該字符串是在數據庫中。

要加快單個讀取請求時,你可以嘗試使「alphaSortedWord」屬性 收錄在覈心數據模型檢查。

您一定要通過分批工作得到了性能改進:在陣列 收集子詞考生第一(也許100,你必須找出最佳的批量大小),然後執行與謂詞獲取請求

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

查找該候選列表的數據庫中的所有單詞。 然後創建下一個候選人陣列並繼續。

+0

謝謝!我實現了批處理想法,它將時間從11秒縮短到僅超過200毫秒。奇蹟般有效! – odrega

+0

你的先生是真正的上帝。我所做的只是,按照你的建議,檢查該索引框,就像某種魔法一樣,它將其縮小到20毫秒。我無法開始說我多麼感激。 – odrega