2010-11-16 18 views
2

J'ai un ensemble de chaînes, et j'ai besoin de construire un graphe où les chaînes sont les nœuds, et il y a un bord entre une paire de adjacentes chaînes.Construire le graphique des chaînes "adjacentes"

Pour les chaînes A et B sont dit être à côté si en ajoutant, supprimant, ou le remplacement d'un seul caractère de A (quel que soit la position), vous obtenez B.

Par exemple scar et car sont adjacentes (en enlevant la s de scar), sont donc car et far (remplaçant c avec f) et sont donc far et farm (ajout m).

Est-il possible de le faire en moins de O(n^2)?

Répondre

6

Vous devez calculer n(n - 1)/2 = O(n^2) entrées dans la matrice d'adjacence (les entrées sont 1 si Levenshtein distance vaut 1 et 0 sinon). Il n'y a aucun moyen d'éviter cela.

(Notez que donné n, je peux trouver un alphabet et une collection de mots sur cet alphabet tel que tous n mots sont voisins et le graphique serait complet.)

+0

Comme la distance d'édition est une distance, la l'inégalité triangulaire tient. Je pense que dans le cas général vous pouvez partitionner l'espace en gardant récursivement les sous-ensembles avec la distance <= 2 au dernier point examiné comme candidats, et les rejeter pour calculer les autres éléments de l'AM. Dans le pire des cas, tous les éléments resteront dans le même sous-ensemble pour toujours. –

+0

C'est le point de mon exemple graphique complet. C'est le pire des cas. – jason

+0

Le graphique ne doit pas être stocké en tant que matrice d'adjacence. – Nabb

5

Je pense que ce n'est pas possible.

Dans le pire des cas, tous les mots sont voisins. Exemple 6 mots = {chat, gras, rat, mat, assis, à}.

Dans cet exemple, vous devez établir (n) * (n-1)/2 = 6 * 5/2 = 15 arêtes.

Vous avez donc besoin d'opérations O (n^2) pour configurer les bords dans le pire des cas ... peu importe le nombre de comparaisons ou de boucles dont vous avez besoin, vous ne pouvez pas améliorer cela.