2009-12-07 9 views
12

Existe-t-il une implémentation publique de la structure de données Rope en C#?Implémentation publique des cordes en C#?

+6

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. –

+0

Je suis tellement curieuse que vous êtes ... c'est pourquoi il y a une autre question! – luvieere

+2

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

Répondre

14

Pour ce que ça vaut, here is an immutable Java implementation. Vous pourriez probablement le convertir en C# en moins d'une heure.

+0

Cool, merci! – luvieere

+3

Heh, ceci est une référence dans l'article de wikipedia l'affiche liée à! :) –

+1

@Vinko: J'aime l'ironie. Attendez ... * est * cette ironie? Je ne sais plus jamais. – Randolpho

13

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.

+0

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

+1

@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

+0

@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

2

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