2009-12-07 12 views
12

Ropeのデータ構造体はC#で公開されていますか?C#でのロープの公開実装?

+6

あなたは、このデータ構造は文字列ビルダより最適なシナリオを持っている場合、私はそれが何であるかを知りたいだろう。私の経験では、ロープのデータ構造は、典型的なケースではネイティブの文字列やストリングビルダの処理速度に勝ることはほとんどありませんでした。そのため、実際のシナリオを見て非常に興味があります。 –

+0

私はとても好奇心が強いので、別の質問があるのです! – luvieere

+2

1つのタスクでは、空の文字列から始め、文字列の途中に何百万回も文字を挿入したいと考えています。この場合、文字列は効率的ではありません。ロープは元の形では正しくないかもしれませんが、私はそれを私の特定のアプリケーションに適応させることができます。 – user172818

答えて

14

その価値は、here is an immutable Java implementationです。あなたはおそらくそれを1時間未満でC#に変換することができます。 Wintellectパワーコレクション(C#のデータ構造ライブラリー)から

+0

クール、ありがとう! – luvieere

+3

こんにちは、これはウィキペディアの記事にリンクされているポスターです! :) –

+1

@Vinko:私は皮肉が大好きです。待って... *そのアイロニーですか?私はもう分からない。 – Randolpho

13

私はロープの実装を認識していませんが(おそらく1つありますが)、連結した後であればStringBuilderがその仕事をします。

+0

ここでは本当です。私はC言語で実装しましたが、以前はchar配列の 'リンクリスト'を使用していましたが、StringBuilderクラスに勝てなかったのです。 StringBuilderクラスがバッファを割り当て、文字をコピーするためにアクセスできるネイティブメソッドのいくつかにアクセスすることができません。 – esac

+1

@esac - C#の実装(うまくいけば、LGPL/BSD型ライセンスの下で)?おそらく、perfのためのいくつかの追加の戦略を調べることができます。 – torial

+0

@ torial:残念ながら私はもうそれを持っていません。私はマイクロソフトのWindowsチームにいるときにプロトタイプを作成するためにこれを行いました。私がそれを持っていても、私はそれを共有できませんでした、ごめんなさい! – esac

2

BigList<T>クラスはロープに何とか似ています 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

私はその性能を測定し、それが「文字列の挿入の開始」にかなりよく実行します。

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

結果:

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

しかし、それはSTRの途中」でよくない行い、 INGの挿入 ":

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

結果:

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

私はこれはバグかunefficient実装ですが、あればわからない" rope of charsは、「C#でStringBuilderこと速くなることが期待されます。

あなたはNuGetから電源のコレクションをインストールすることができます。

Install-Package XAct.Wintellect.PowerCollections 
関連する問題