Что делает эту программу медленной для обработки? (C ++)

0
#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

  • 0
    Уберите звонки в std::cout .
  • 3
    Если я понимаю вашу цель, вы хотите указать, является ли каждый элемент уникальной или повторяющейся записью, правильно? В этом случае вы повторяете 20 000 * 20 000 раз, чтобы получить это ... вот почему это занимает так много времени. Это можно сделать намного быстрее, используя карту. Кроме того, когда вы печатаете его, вы каждый раз cout << endl буфер (вызывая cout << endl ), что значительно замедляет ваш вывод.
Показать ещё 2 комментария
Теги:
performance

1 ответ

4
Лучший ответ

Как насчет того, чтобы вы сначала разобрали вещь. Тогда вам нужно сделать только один цикл for вместо двух, потому что для поиска всех повторений вы просто считаете последовательные вхождения.

В противном случае используйте набор или карту. Снова вы перейдете к O (NlogN) вместо O (N ^ 2).

  • 0
    Я решил проблему, используя "sort (number.begin (), number.end ())" из библиотеки <алгоритма>. обработано 20000 входов с 1 для цикла за 208 мс. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню