2009-12-07 11 views
12

¿Hay una implementación pública de la estructura de datos Rope en C#?Implementación pública de cuerdas en C#?

+6

Si usted tiene un escenario en el que esta estructura de datos es más óptimo que un constructor de cadena, sería curioso saber lo que es. Según mi experiencia, las estructuras de datos de cuerdas casi nunca ganan con la velocidad bruta de las operaciones de cadenas nativas o constructoras de cuerdas en casos típicos, por lo que estoy muy interesado en ver escenarios realistas en los que sea una victoria. –

+0

Tengo tanta curiosidad como tú ... ¡por eso surge otra pregunta! – luvieere

+2

Para una tarea, quiero comenzar desde una cadena vacía y luego insertar un carácter en el medio de una cadena por millones de veces. Una cadena no será eficiente en este caso. La cuerda puede no ser correcta en su forma original, pero podemos adaptarla a mi aplicación particular. – user172818

Respuesta

14

Por lo que vale, here is an immutable Java implementation. Probablemente puedas convertirlo a C# en menos de una hora.

+0

Cool, gracias! – luvieere

+3

¡Heh, esta es una referencia en el artículo de la wikipedia al que está vinculado el póster! :) –

+1

@Vinko: me encanta la ironía. Espera ... * ¿es * esa ironía? Nunca más sé – Randolpho

13

No estoy al tanto de una implementación de la cuerda (aunque probablemente hay uno!), Pero si sólo después de hacer la concatenación, StringBuilder hará el trabajo.

+0

Muy cierto aquí. Hice una implementación en C# hace un tiempo en el que utilicé una 'lista enlazada' de matrices de caracteres y no importa qué, no podía vencer a la clase StringBuilder. El problema surge cuando intenta unirlos para la concatenación, no tiene acceso a un par de métodos nativos a los que la clase StringBuilder tiene acceso para asignar un búfer y copiar los caracteres en. – esac

+1

@esac - podría publicar su Implementación de C# (con suerte bajo una licencia de tipo LGPL/BSD)? Tal vez podríamos investigar algunas estrategias adicionales para perf. – torial

+0

@torial: desafortunadamente ya no tengo eso. Lo hice para prototipos cuando estaba en el equipo de Windows en Microsoft, así que incluso si lo tuviera, no podría compartirlo, ¡lo siento! – esac

2

La clase BigList<T> de Wintellect Potencia Colecciones (una biblioteca C estructura de datos #) es de alguna manera similar a la cuerda: 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

Medí su rendimiento y se lleva a cabo bastante bien en "inicio de insertos de cuerda":

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); 

resultados:

Rope<char> time: 00:00:00.0468740 
StringBuilder time: 00:00:05.1471300 

Pero no se realiza bien en "medio de str ing insertos ":

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); 

Resultados:

Rope<char> time: 00:00:15.0229452 
StringBuilder time: 00:00:04.7812553 

no estoy seguro si esto es un error o aplicación ineficiente, sino que" se espera rope of chars "para ser más rápido que StringBuilder en C#.

Puede instalar Potencia Colecciones de NuGet:

Install-Package XAct.Wintellect.PowerCollections