2

C++ では、ネストされた for ループを使用して、同じ名前を持つオブジェクトのペアを一致させています。プログラムの実行には長い時間がかかると予想していましたが (数千の文字列を比較すると)、プログラムが進行するにつれて、プログラムの実行速度が遅くなります。最初の 20% の文字列を数分で比較しますが、約 30% に達すると、1 つの文字列を他の文字列と照合するのに約 60 秒かかります。

フィールド「feas」、「eff」、「numIdeas」の適切な値を含む「新しいデータ」と、一致する「新しい」パートナーと共通の「データ」フィールドを共有する古いデータがあります。新しいデータと古いデータは同じ順序ではなく、現在の順序に意味があるため、並べ替えることができません。最善の方法は、それを「力ずく」で通すことだと思いました。私が言ったように、それらは特定の順序ではないので、ループ反復の極端な減速は私を混乱させました. 私が知る限り、速度は一定に保たれるべきです。

for(int i=0; i< newDO.getNumItems(); i++)
{
    Item newItem = newDO.getItem(i);

    for(int k=0; k < oldDO.getNumItems(); k++)
    {
        Item oldItem = oldDO.getItem(k);
        if(oldItem.getType()==1)
        {
            bool same = testStrings(oldItem.getData(), newItem.getData());

            if(same)
            {
               oldItem.setFeas(newItem.getFeas());
               oldItem.setEff(newItem.getEff());
               oldItem.setNumIdeas(newItem.getNumIdeas());
               break;
            }
        }
    }
}

testStrings私はこの関数を書きませんでしたが、実際の問題は見られませんでした。この関数は、文字列 (約 5 ~ 20 文字) を取得し、スペースと「(」を取り除きます。

(私が理解しているように、私の前の人は、それらを解析している関数が一部のデータから '(' を適切に削除していないことに気付く前に、何千ものファイルをインポートしていました。文字列は等しかった)。

bool testStrings(string s1, string s2)
{
    string s1def ="";
    for(int i=0; i<s1.length(); i++)
    {
        if(s1[i]!=' ' || s1[i]!=')'){s1def+=s1[i];}
    }
    string s2def = "";
    for(int i=0; i<s2.length(); i++)
    {
        if(s2[i]!=' ' || s2[i]!=')'){s2def+=s2[i];}
    }
    if(s1def == s2def){return true;}
    else{return false;}
}

どんな洞察も本当に役に立ちます。

ありがとう。

4

4 に答える 4

3

1) a) 実際のコードをもっと見ること、および b) データセットを理解することなしに、確かなことは何も言えません。

2)何かを「追加」しているようにも、構造を「成長」しているようにも見えません。

...しかし(これは単なる推測です)....

3) 両方の配列がソートされているとしましょう: array1 = {1, 2, 3, ... 999}; 配列 2 = {1、3、4、... 1001}。

初期のイテレーションでは、すぐに「ブレイク」します。たとえば、array1[0] は、一度ループする前に array2[0] と一致します。

ただし、後の反復では、探しているアイテムを見つけるために、内側のループを 100 回以上実行する必要があります。

おそらく、全体の問題は、a) 反復実行 b) 線形検索 c) 順序付けられたデータ セットの実行です。

繰り返しますが、ただの推測です。

私見では...

于 2012-08-04T05:56:25.047 に答える
-1

どのようにパフォーマンスを測定しましたか? 実際、このような動作には多くの理由 (アルゴリズムの問​​題、CPU キャッシュ、コンパイラの設定) が考えられますが、ソース コードと実際の文字列データを参照せずに質問に答えるのは非常に困難です。文字列比較アルゴリズムの実装ですか?

于 2012-08-04T05:50:45.817 に答える