2016-08-18 17 views
1

を設定し、より良い(より最適化や高速化技術)コードです:効率的な挿入技術:: C++

検索+

for(int i = 0; i < A.length(); i++){ 
    set<char> s; 
    s.insert(A[i]); 
    len = 1; 
    for(int j = i+1; j < A.length(); j++){ 
     if(s.find(A[j]) == s.end()){ 
      s.insert(A[j]); 
     } 
     else{ //Duplicate char found so break 
      break; 
     } 
     len++; 
    } 
    if(len > maxm) maxm = len; 
    s.clear(); 
} 

あるいは、

を挿入挿入+使用戻るペアー

for(int i = 0; i < A.length(); i++){ 
    set<char> s; 
    pair<set<char>::iterator, bool> ret; 
    s.insert(A[i]); 
    len = 1; 
    for(int j = i+1; j < A.length(); j++){ 
     ret = s.insert(A[j]); 
     if(ret.second == false) break; //using *pair* returned from set::insert 
     len++; 
    } 
    if(len > maxm) maxm = len; 
    s.clear(); 
} 

私の意見では、set::findの余分なオーバーヘッドを取り除くので、後でもっと最適化されたように見えます。私の見解は正しいですか?どちらをお勧めしますか?

+0

2番目のバージョンでは、結果のチェックをスキップすることもできます。 '(ret.second..'、要素がすでに存在する場合は何も起こりません。) –

+0

@dau実際にこのコードを解決するために書いたのは、 、 繰り返し文字を持たない最長の部分文字列の長さを見つける "。だから、反復文字を見つけると直ぐにループを抜け出す必要があります。 –

+0

あなたは順序付けられた構造体を必要とせず、' unordered_set 'はハッシュマップとして実装されており、' set'の木に比べて速くなります。実際には別のコンテナを使わなくても 'O(n)'の1回のパスで実行できます。あなた:) –

答えて

2

番目のバージョンは少しビットより速く(VS 2015、デバッグのx86)である:

A.length() == 564 
1) 62ms 
2) 56ms 

std::set::insertはすでに可能重複を見つけるために、そのコンテナを検索ため、2番目のバージョンは少し速くなる理由があります。つまり、最初のバージョンではセットを2回検索し、2番目のバージョンでは1回検索します。

最適化を有効にすると、両方のバージョンで時間が1ms未満に短縮されるため、基本的には「問題ではありません」ということに注意してください。

+0

デバッグモードのベンチマークは何かを教えてくれますか? – SpamBot

+0

@SpamBotいいえ、そうではありません。差を強調するために追加しました – Rakete1111

関連する問題