J'ai un programme dans lequel j'ai besoin de calculer plusieurs fois la distance de Levenshtein entre les paires de mots (l'un d'entre eux est fixe), et plusieurs fois peuvent aller de 1000 à 120000 pour chaque mot fixe. Puisque je veux optimiser ce programme autant que possible, j'ai pensé à implémenter ces calculs dans l'assemblage. Le problème est que je ne sais rien à propos de l'assemblage, sauf pour la théorie et que cela peut représenter de grandes améliorations de la vitesse. Quelqu'un peut-il m'aider s'il vous plaît ou me fournir le code d'assemblage pour cette distance? Aussi, comment puis-je appeler l'assembly à partir d'un module C#?distance Levenshtein (ou Damerau-Levenshtein, si possible!) Est
0
A
Répondre
1
Vous pouvez facilement utiliser un BK-tree pour créer un arbre de recherche si Levenshtein est suffisant. Damarau-Levenshtein can not be used with a metric tree.
Vous n'avez pas besoin d'écrire cette implémentation en assembleur ou C#, vous pouvez aller loin en utilisant du code et des pointeurs non sécurisés.
- Lire et cache
str.Length
, ce sont des invocations de méthode (très probablement inline/optimisé) - Accédez à vos chaînes avec des pointeurs.
fixed(char* ptrX=strX, ptrY=strY) ...
- Vous pouvez créer votre table/tableau/état en int [rows * cols] au lieu de int [rows] [cols] et utiliser des pointeurs pour lire/écrire.
int[] state = new int[rows*cols]
fixed(int* ptrState=state)
- Vous avez vraiment pas besoin de plus de deux lignes dans votre table d'état, vous avez celui que vous lisez à partir, et celui que vous écrivez. Puis échangez les pointeurs et lisez ce que vous venez d'écrire.
- Je crois que vous pouvez optimiser en supprimant des préfixes identiques/suffixes
L('catz', 'cats') == L('z', 's') == 1
L('rats', 'cats') == L('r', 'c') == 1
Questions connexes
- 1. Calcul d'une distance relative Levenshtein - logique?
- 2. Question sur la distance de Levenshtein
- 3. Optimisation de l'algorithme de distance de Levenshtein
- 4. Implémentation de la distance Levenshtein en python
- 5. Algorithme de distance de Levenshtein meilleur que O (n * m)?
- 6. Comment implémentez-vous la distance Levenshtein dans Delphi?
- 7. en utilisant la distance levenshtein pour générer l'extrait
- 8. Levenshtein Généralisation pour les graphiques?
- 9. Est-il possible de trouver la distance entre deux routeurs?
- 10. si/switch - "si $ var est 'a' ou est 'b' ou est« c" etc
- 11. Quelqu'un peut-il repérer le bug dans ma mise en œuvre à distance Damerau-Levenshtein?
- 12. Puis-je utiliser ActiveRecord pour trouver des lignes basées sur la plus proche-correspondance (distance levenshtein)
- 13. Essayer d'utiliser la distance de Levenshtein dans la requête T-SQL - Optimiser l'aide SVP
- 14. Façon d'implémenter "Obtenir toutes les chaînes avec une distance Levenshtein inférieure à X"
- 15. est-il possible de savoir si un dijit est affiché ou non?
- 16. Est-il possible de vérifier si un appareil est jailbreaké?
- 17. Est-il possible dans DB2 ou dans une base de données de détecter si la table est verrouillée ou non?
- 18. déterminer si dropdownlist est sélectionné ou non
- 19. détection de plagiat en utilisant l'algorithme de damerau levenshtein
- 20. si l'utilisateur est déjà connecté ou non?
- 21. Vérifier une page Web à distance pour voir si son ASCII ou binaire
- 22. De meilleures métriques de distance en dehors de Levenshtein pour les ensembles de mots ordonnés et le clustering suivant
- 23. Est-il possible de se connecter si une classe dans la machine virtuelle Java est utilisée?
- 24. Est-il possible de savoir avec certitude si un navigateur Web navigue ou non?
- 25. est un gestionnaire de formulaire html possible ou existe actuellement, si oui comment l'utiliser?
- 26. Si UITextField ou NSString est vide
- 27. Comment savoir si l'applet ou l'application est
- 28. Vérifiez si ftp est complet ou non?
- 29. Déterminer si ELMAH est activé ou non?
- 30. Déterminer si l'application est WinForms ou WebForms
Un compilateur bonne C peut produire des performances proches de celle de l'assemblage. De plus, vous pouvez lui demander de produire le fichier d'assemblage intermédiaire pour inspecter et détecter les inefficacités grossières (généralement causées par la peur des alias du compilateur: vous pouvez ensuite les corriger au niveau C en copiant certaines variables globales dans des variables locales auxquelles il est clair il n'y a pas d'alias). –
Peut-être que vous devriez d'abord implémenter ceci en C# (ou utiliser une bibliothèque C#) avant d'apprendre le langage assembleur. Après tout, le code C# peut être assez rapide pour vos besoins. –
Etant donné que vous ne connaissez pas l'assemblage, ce n'est probablement pas le meilleur choix, car l'optimisation du code d'assemblage nécessite une bonne connaissance de l'assemblage et du matériel en question. –