Public implementation of ropes in C#?

前端 未结 4 1324
南旧
南旧 2021-02-02 18:12

Is there a public implementation of the Rope data structure in C#?

4条回答
  •  滥情空心
    2021-02-02 18:31

    The BigList class from Wintellect Power Collections (a C# data structure library) is somehow similar to rope: 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

    I measured its performance and it performs pretty well in "start of string inserts":

    const int InsertCount = 150000;
    
    var startTime = DateTime.Now;
    var ropeOfChars = new BigList();
    for (int i = 0; i < InsertCount; i++)
    {
        ropeOfChars.Insert(0, (char)('a' + (i % 10)));
    }
    Console.WriteLine("Rope 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);
    

    Results:

    Rope time: 00:00:00.0468740
    StringBuilder time: 00:00:05.1471300
    

    But it performs not well in "middle of string inserts":

    const int InsertCount = 150000;
    
    var startTime = DateTime.Now;
    var ropeOfChars = new BigList();
    for (int i = 0; i < InsertCount; i++)
    {
        ropeOfChars.Insert(ropeOfChars.Count / 2, (char)('a' + (i % 10)));
    }
    Console.WriteLine("Rope 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);
    

    Results:

    Rope time: 00:00:15.0229452
    StringBuilder time: 00:00:04.7812553
    

    I am not sure if this is a bug or unefficient implementation, but "rope of chars" is expected to be faster that StringBuilder in C#.

    You can install Power Collections from NuGet:

    Install-Package XAct.Wintellect.PowerCollections
    

提交回复
热议问题