2011-11-02 3 views
4

Fond:
Mon groupe CSS360 tente de créer une application Android qui comprendra une fonction de recherche automatique. Les données que nous allons chercher se composent d'environ 7000 entrées, et seront stockées dans une base de données SQLite sur le téléphone lui-même. L'approche la plus évidente serait de faire une recherche linéaire de la base de données après chaque caractère que l'utilisateur tape, puis de renvoyer une liste de suggestions qui sont des extensions alphabétiques potentielles de la requête de l'utilisateur. Cependant, cela semble être plutôt inefficace et nous cherchons de meilleures alternatives. Dans une autre de mes classes aujourd'hui, mon instructeur a brièvement discuté de la structure de données trie, et a mentionné qu'il est souvent utilisé pour stocker des dictionnaires entiers. Les entrées dans un trie peuvent être récupérées en temps logarithmique (par opposition au temps linéaire pour un ancien tableau régulier), donc cela semble être un excellent outil pour nous d'utiliser! Malheureusement, nous sommes déjà au-dessus de nos têtes sur ce projet, et aucun d'entre nous ne sait vraiment comment y arriver. Tous ceux que nous avons codés à ce jour sont des applications de console de base pour nous apprendre les bases de la programmation. Nous essayons tous d'apprendre la plate-forme Android dans une semaine en regardant des vidéos YouTube, et en différant la base de données à l'un des gars de notre groupe qui a une expérience SQL quelconque. Nous pourrions sérieusement utiliser quelques pointeurs!Trie préréglée

Questions:

  • Lors de la création d'une structure arborescente, est-il possible d'avoir une pré-rempli toute la structure? IE: générer une ligne de code pour chaque noeud utilisé, de sorte que toute la structure sera déjà en mémoire au démarrage du programme? Ma pensée ici est que cela nous évitera de devoir régénérer l'intégralité de la base de données à chaque démarrage du programme. Si oui, existe-t-il un moyen facile d'obtenir ces milliers de lignes de code dans notre programme? IE: Une sorte de script qui convertit les fichiers de base de données en un fichier texte géant de commandes java qui peuvent être copiées et collées dans Eclipse?
  • Y aura-t-il une quantité considérable de frais généraux si nous effectuons une recherche dans la base de données directement au lieu d'utiliser une sorte de liste interne ou de structure de données? Devrions-nous copier les noms de la base de données et les rechercher dans le programme pour notre fonction de remplissage automatique?
  • Si cela s'avère techniquement trop difficile pour nous, et que nous devons recourir à une recherche linéaire régulière, la performance sera-t-elle sensiblement affectée?
  • Nos plans actuels sont d'exécuter la fonction d'auto-complétion chaque fois que l'utilisateur entre un caractère, puis d'attendre que la fonction retourne avant de leur permettre de continuer à taper. Les seuls programmes que nous avons écrits jusqu'à présent fonctionnent de manière synchrone. Que devrions-nous savoir pour que cette fonction fonctionne de manière asynchrone? Compte tenu de nos capacités novices et des exigences auxquelles nous devons déjà répondre, cela serait-il trop difficile sur le plan technique pour nous?

Répondre

0

sqlite devrait être en mesure de desservir cette fonctionnalité d'auto-complétion raisonnablement bien. Je recommande d'utiliser leurs index internes pour ré-implémenter la roue. Si vous avez besoin de faire ce dernier, sqlite ne va probablement pas vous aider une fois que vous avez fait ce travail.

Si vous voulez rechercher une sous-chaîne, alors full text search est probablement votre meilleur choix.

Si vous voulez seulement compléter le début du mot, il suffit d'utiliser leur indexes vanille devrait être plus que suffisant. Si la performance est un problème, alors attendez jusqu'à ce qu'ils tapent trois caractères avant de faire la requête. Définissez une limite sur vos résultats pour les réponses rapides.