2017-07-09 11 views
3

私はC++を比較的新しく使用しています。私はコーディングの問題を練習していて、文字列を回文に変換することに関連していました。パフォーマンス - 文字列コンストラクタを使用し、連結を使用して

Iはベクトルでアルファベットのカウントを記憶し、後でこのようなパリンドロームを生成した -

string palindrome_string; 
for (short i = 0; i < 26; ++i) { 
    alphabet_count[i] /= 2; 
    for (short j = 0; j < alphabet_count[i]; ++j) 
     palindrome_string += string(1, static_cast<char>('a' + i)); 
} 

しかし、特定のテストケース(のみ2.10^5 e S含有入力)のために、プログラムを超えましたメモリの制限は256 MBです。次に、このステートメントで内部ループを置き換えました。

palindrome_string += string(alphabet_count[i], static_cast<char>('a' + i)); 

このプログラムは約2.4 MBしか使用しないで正常に動作しました。

これは、コンカチネーションとコンストラクタ関数を使用した場合のパフォーマンスに関連しているかどうかを確認したい場合は、それが可能な理由は何ですか?そしてthe successful onethe failed one(10テストケース) - それは問題にした場合、それが助け場合

、私はMS VC++ 2010

でプログラムをコンパイルし、ここでの提出(コード)があります。

+0

このように追加すると、繰り返しごとに新しい割り当てが得られる可能性があります。おそらく毎回わずかに大きなスライスを割り当てることは、あなたのアロケータには悪いケースです。しかし、それはそれが悪いことを得ることはまだ驚くべきことです。 – zch

+0

@zch合意。あなたがそれを構築するとき、文字列はあるメモリ空間であらかじめ割り当てられています。 OPは単純な文字列で文字列構造を置き換えることができます:palindrome_string + = 'a' + i; – texasbruce

+0

実際には、一時ストリングを構成するポイントはありません。 'palindrome_string.append(static_cast ( 'a' + i)、alphabet_count [i])'は同じことをします。 – VTT

答えて

0

std::stringは、償却された一定時間を達成する方法でメモリを割り当てる必要があります。 hereと記載されているように、より多くのスペースが必要となるたびに、2倍の単純な実装が可能です。

内側ループのpalindrome_stringに何かを追加するたびに、その文字列がメモリを再割り当てする可能性があります。しかし、私はそれがひどいことがどうなるかは分かりません。つまり、上記の単純な実装で内部ループの繰り返しでメモリが2倍になったとしても、次の繰り返しの多くでスペースを再割り当てする必要はありません。

+0

私は当初、 'char'は1バイトと考えていました。 2.10^5文字の場合、私はそれが〜200 KB以上を取るべきではないと思ったが、明らかにそのようには機能しないし、それはどのようにMBで行かれたのか、それでも私は混乱する。 – PalashV

+0

私はあなたの質問に答えたことを知った、良いニュース@ PalashV〜 – gsamaras

+0

ありがとう。私は次の2〜3日間それを理解することができませんでした。問題は何の反応も得られませんでしたが、ある日、ループが故障する可能性があることをクリックしました。私はそれを再読した、そして、私は間違っていた、今回はすべてだった。:( あなたの時間をありがとう。:) – PalashV

0

問題はパフォーマンスではなく、内側のループでした。 jはタイプshortであり、alphabet_count[i]はタイプlongであるため、そのようになっています。

関連する問題