¿Hay una implementación pública de la estructura de datos Rope en C#?Implementación pública de cuerdas en C#?
Respuesta
Por lo que vale, here is an immutable Java implementation. Probablemente puedas convertirlo a C# en menos de una hora.
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.
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
@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
@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
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
- 1. get SecKeyRef de base 64 cuerdas
- 2. Juego de cuerdas?
- 3. C#: cadena pública pública ToString() VS cadena de anulación pública ToString()
- 4. Encriptación RSA en C#: ¿Qué parte define la clave pública?
- 5. C#: Cuerdas con los mismos contenidos
- 6. C++ Implementación de funciones virtuales?
- 7. para cuerdas en Webview
- 8. Lista de cuerdas en Freemarker
- 9. implementación logsumexp en C?
- 10. implementación genérica en C
- 11. Implementación de ECC en C
- 12. Implementación de cola en C#
- 13. Implementación de RAII en C#
- 14. Implementación de MVar en C?
- 15. Implementación de memmove en C
- 16. Cuerdas largas Lua en fslex
- 17. Implementación de la derivada en C/C++
- 18. C# Implementación de Math.Sqrt
- 19. R * ¿Implementación de C?
- 20. decodificación permutado en inglés Cuerdas
- 21. XML para cuerdas en Java
- 22. SQL con cuerdas
- 23. ¿Cómo combinar dos cuerdas en ramita?
- 24. C++ - Sobrecarga Constructor - privada y pública
- 25. implementación merge sort en C++
- 26. puntero inteligente Implementación en C
- 27. ¿Funciones de cuerdas de hormiga?
- 28. Implementación de cola de prioridad en C
- 29. "printf" en impresiones de cuerdas galimatías
- 30. Equivalente para cuerdas pop
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. –
Tengo tanta curiosidad como tú ... ¡por eso surge otra pregunta! – luvieere
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