是什么让这个程序进展缓慢? (C ++)

时间:2014-01-31 15:31:35

标签: c++ performance

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector< int > number;
    bool numbersAreCorrect = false;

    int input;

    while( cin >> input )
        number.push_back( input );

    vector< int > unique_number( number.size(), 0 );
    vector< int > repeated( number.size(), 1 );

    for( int i = 0; i < number.size(); i++ )
    {
        for( int j = i + 1; j < number.size() + 1; j++ )
        {
            if( number[ i ] != 0 && number[ i ] == number[ j ] )
            {
                repeated[ i ]++;
                unique_number[ i ] = number[ i ];
            }
            else
                unique_number[ i ] = number[ i ];

            if( j == number.size() )
            {
                for( int z = 0; z < number.size(); z++ )
                {   
                    if( number[ z ] == unique_number[ i ] )
                        number[ z ] = 0;
                }
            }
        }

    } 

    for( int i = 0; i < number.size(); i++ )
    {
        if( ( unique_number[ i ] != 0 && repeated[ i ] == 1 ) || ( unique_number[ i ] != 0 && repeated[ i ] % 2 != 0 ) )
        {   
            numbersAreCorrect = false;
            cout << unique_number[ i ] << endl;
            break;
        }

        else if( repeated[ i ] == 1 )
            numbersAreCorrect = true;

        else if( repeated[ i ] % 2 != 0 )
        {
            numbersAreCorrect = false;
            cout << repeated[ i ] << endl;
            break;
        }
        else if( repeated[ i ] % 2 == 0 )
            numbersAreCorrect = true;   
    }

    if( numbersAreCorrect == true )
        cout << "0" << endl;

    return 0;
}

该程序从用户获得正整数,检查整数是重复2k(偶数)次还是2k + 1(奇数次)。如果后者为真,则打印整数,否则打印0;我使用了20000个输入,评估需要10秒以上。我需要知道如何让它更快地进行处理。 例如,此输入结果为“0”:1 2 2 1 这导致“3”:1 2 2 1 3

1 个答案:

答案 0 :(得分:4)

你首先对事物进行排序。 然后你只需要做一个for循环而不是两个循环因为找到所有重复你只计算连续出现次数。

未能使用集合或地图。再次,你将下降到O(NlogN)而不是O(N ^ 2)。