2013-10-14 2 views
0

J'ai un algorithme récursif qui parcourt et trouve tous les sous-mots dans un mot (algorithme ci-dessous). Le problème avec mon algorithme est qu'il spams des données de base avec des demandes de récupération, et cela le fait fonctionner très lentement.Recherche efficace d'un objet spécifique dans les données de base

Y a-t-il une meilleure façon de le faire?, Ou suis-je bloqué avec les temps plus longs.

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

EDIT: J'ai oublié de mentionner, l'objet dans les données de base a deux propriétés de chaîne, le mot et le mot classés par ordre alphabétique.

+0

Qu'avez-vous fait pour vérifier que vous n'appelez pas de manière répétée 'subwordPermutations:' avec le même 'subWord'? – Wain

Répondre

0

Il semble que vous créiez (récursivement) des sous-chaînes d'une chaîne donnée, et pour chaque sous-chaîne exécutez une requête d'extraction pour vérifier si cette chaîne est dans la base de données.

Pour accélérer une seule demande d'extraction, vous pouvez essayer de faire l'attribut « alphaSortedWord » Indexé dans l'inspecteur du modèle de données de base.

Vous devriez certainement obtenir une amélioration de la performance en travaillant en lots: Collectionnez les candidats sous-mots dans un tableau premier (peut-être 100, vous devez connaître la taille du lot optimale), puis exécutez une requête d'extraction avec le prédicat

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

pour trouver tous les mots de la base de données pour cette liste de candidats. Puis créez le tableau suivant de candidats et continuez.

+0

Merci! J'ai mis en œuvre l'idée de lot, et cela a réduit le temps de 11 secondes à un peu plus de 200 millisecondes. Fonctionne comme un charme! – odrega

+0

Vous êtes un vrai dieu. Tout ce que j'ai fait était, comme vous le recommandiez, de vérifier cette boîte d'indexation, comme une sorte de magie qu'il réduit à 20 millisecondes. Je ne peux pas commencer à dire combien je suis reconnaissant. – odrega

Questions connexes