Existe-t-il une implémentation publique de la structure de données Rope en C#?Implémentation publique des cordes en C#?
Répondre
Pour ce que ça vaut, here is an immutable Java implementation. Vous pourriez probablement le convertir en C# en moins d'une heure.
Je ne suis pas au courant d'une implémentation Rope (bien qu'il y en ait probablement une!), Mais si vous êtes seulement après avoir fait la concaténation, StringBuilder fera le travail.
Très vrai ici. J'ai fait une implémentation en C# il y a quelque temps où j'utilisais une 'liste chaînée' de tableaux de chars et quoi qu'il arrive, elle ne pouvait pas battre la classe StringBuilder. Le problème survient lorsque vous essayez de relier les deux pour la concaténation, vous n'avez pas accès à quelques méthodes natives auxquelles la classe StringBuilder a accès pour allouer un tampon et copier les caractères. – esac
@esac - pourriez-vous poster votre Mise en œuvre de C# (espérons-le sous licence de type LGPL/BSD)? Nous pourrions peut-être étudier quelques stratégies supplémentaires pour perf. – torial
@torial: malheureusement je n'ai plus ça. Je l'ai fait pour le prototypage lorsque j'étais sur l'équipe Windows de Microsoft, donc même si je l'avais, je ne pouvais pas le partager, désolé! – esac
La BigList<T>
classe de Wintellect Collections électriques (une bibliothèque de structure de données C#) est en quelque sorte similaire à la corde: http://docs.pushtechnology.com/docs/4.5.7/dotnet/externalclient/html/class_wintellect_1_1_power_collections_1_1_big_list_3_01_t_01_4.html
j'ai mesuré ses performances et il reste très bien « début d'inserts de chaîne »:
const int InsertCount = 150000;
var startTime = DateTime.Now;
var ropeOfChars = new BigList<char>();
for (int i = 0; i < InsertCount; i++)
{
ropeOfChars.Insert(0, (char)('a' + (i % 10)));
}
Console.WriteLine("Rope<char> time: {0}", DateTime.Now - startTime);
startTime = DateTime.Now;
var stringBuilder = new StringBuilder();
for (int i = 0; i < InsertCount; i++)
{
stringBuilder.Insert(0, (char)('a' + (i % 10)));
}
Console.WriteLine("StringBuilder time: {0}", DateTime.Now - startTime);
Résultats:
Rope<char> time: 00:00:00.0468740
StringBuilder time: 00:00:05.1471300
Mais il exécute pas bien dans « milieu de str ing inserts ":
const int InsertCount = 150000;
var startTime = DateTime.Now;
var ropeOfChars = new BigList<char>();
for (int i = 0; i < InsertCount; i++)
{
ropeOfChars.Insert(ropeOfChars.Count/2, (char)('a' + (i % 10)));
}
Console.WriteLine("Rope<char> time: {0}", DateTime.Now - startTime);
startTime = DateTime.Now;
var stringBuilder = new StringBuilder();
for (int i = 0; i < InsertCount; i++)
{
stringBuilder.Insert(stringBuilder.Length/2, (char)('a' + (i % 10)));
}
Console.WriteLine("StringBuilder time: {0}", DateTime.Now - startTime);
Résultats:
Rope<char> time: 00:00:15.0229452
StringBuilder time: 00:00:04.7812553
Je ne suis pas sûr que ce soit un bug ou la mise en œuvre unefficient, mais" rope of chars
"devrait être plus rapide que StringBuilder
en C#.
Vous pouvez installer des collections d'alimentation de NuGet:
Install-Package XAct.Wintellect.PowerCollections
- 1. cordes Multiplication en C#
- 2. Cordes en C-tête des fichiers
- 3. Liste des cordes en Freemarker
- 4. cordes combinant Obj-C
- 5. multiples cordes remplace en Objective C
- 6. Objective-C Cordes
- 7. Cordes en Objective C pour Iphone
- 8. Cordes en C, comment obtenir sousChaîne
- 9. implémentation logsumexp en C?
- 10. Implémentation des filtres Photoshop en C#
- 11. Implémentation du filtrage des couleurs en C#
- 12. Implémentation Tribool en C#
- 13. Cordes en Python 3
- 14. Implémentation d'IntSetArray en C++
- 15. rotation des cordes
- 16. Existe-t-il une implémentation publique de compression LZSS en C# ou pouvant être utilisée en C#?
- 17. Implémentation d'un glyphe en C
- 18. cordes Extrait en python
- 19. Cordes Reconstituer en Python
- 20. Implémentation NFA/DFA en C#
- 21. Implémentation d'AES-XTS en C#
- 22. Implémentation d'un arbre en C++
- 23. Implémentation des attributs C# et des métadonnées
- 24. Malheurs de cordes en C# - ayant un. à côté d'un "
- 25. Retirez de cordes en .net
- 26. Implémentation des relations d'équivalence en C++ (using boost :: disjoint_sets)
- 27. Implémentation arborescente utilisant des listes d'enfants en C++
- 28. Eviter le blocage en utilisant une interface publique non virtuelle et des verrouillages en C++
- 29. Implémentation des fonctions de rappel dans C
- 30. C#: chaîne publique publique ToString() VS chaîne de substitution publique ToString()
Si vous avez un scénario dans lequel cette structure de données est plus optimale qu'un constructeur de chaîne, je serais curieux de savoir ce qu'il est. D'après mon expérience, les structures de données par câble ne sont presque jamais une victoire sur la vitesse brute des opérations de cordes natives ou de construction de cordes dans des cas typiques, donc je suis très intéressé de voir des scénarios réalistes où c'est gagnant. –
Je suis tellement curieuse que vous êtes ... c'est pourquoi il y a une autre question! – luvieere
Pour une tâche, je veux commencer à partir d'une chaîne vide, puis insérer un caractère au milieu d'une chaîne pour des millions de fois. Une chaîne ne sera pas efficace dans ce cas. La corde n'a peut-être pas raison sous sa forme originale, mais nous pouvons l'adapter à mon application particulière. – user172818