Jak przyspieszyć program

Jak przyspieszyć program
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:83
0

Witam,

mam takie zadanie:
http://solve.edu.pl/contests/download_desc/1924

i taki kod

Kopiuj

#include <iostream>
using namespace std;
long long int tab1[500005]={0};
long long int tab2[500005]={0};

int main()
{
    std::ios_base::sync_with_stdio (false);
  cin.tie (0);
  cout.tie (0);
  
    long long int n=0,q=0,p=0,p2=0,i=1;
    cin>>n>>q;
    long long int ile=n;
    while (n--)
    {
        cin>>tab1[p];
        p++;
    }
    while (q--)
    {
        cin>>tab2[p2];
        p2++;
    }
    n=-1;
    while(p2>0)
    {
        n++;
        q=0;
        p=ile;
        while((p>0)&&(q<ile))
        {
            if(tab2[n]==tab1[q])
            {
                cout<<q+1<<"\n";
                goto dalej;
            }
            q++;
            p--;
        }
        cout<<"NIE"<<"\n";
        dalej:
        p2--;
    }
    return 0;
}

Dziala dobrze ale wolno:-(
Na trzech testach przekracza mi limit czasu :-(
Ktoś może poradzić co zmienić ?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Szczecin
0

Zbuduj hashmapę wartość⟶pierwsze wystąpienie a potem w niej wyszukuj. Na razie masz wyszukiwanie O(n). Interesuje Cię std::unordered_map


edytowany 1x, ostatnio: kq
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:2 minuty
  • Postów:4930
0

Możesz opisać, jak działa Twój algorytm?

EDIT: Albo najpierw Zrób jak powyżej, gdy dalej będzie za wolno, to się zobaczy.


edytowany 1x, ostatnio: lion137
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:83
0
kq napisał(a):

Zbuduj hashmapę wartość⟶pierwsze wystąpienie a potem w niej wyszukuj. Na razie masz wyszukiwanie O(n). Interesuje Cię std::unordered_map

A bez hashmapy? Nie wiem nawet co to

edytowany 1x, ostatnio: pattom
kq
No to wypada się doedukować, dostałeś przecież nazwę dokładnie tego co masz użyć...
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
2

Ja zamiast std::unordered_map użyłbym tablicy int itemsPos[1000000] (to tylko 4MB). Więcej dużych danych nie potrzeba.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:83
0

Cześć,

mam taki kod ale znowu coś nie działa :-(

Kopiuj

#include <iostream>
#include <sstream>
#include <map>
using namespace std;
int tab1[500002];
int tab2[500002];
map<int, string> znalezioneWczesniej;
map<int, string>::iterator it;

string getStringFromInt(int a);

int main()
{
    std::ios_base::sync_with_stdio (false);
	cin.tie (0);
	cout.tie (0);
	int nSize=0,qSize=0;
	cin>>nSize>>qSize;
	for(int i = 0; i < nSize; ++i)
	{
		cin>>tab1[i];
	}

	for(int i = 0; i < qSize; ++i)
	{
		cin>>tab2[i];
	}

	for( int i = 0; i < qSize; ++i)
	{
		// sprawdz czy juz znalezione
		it = znalezioneWczesniej.find(tab2[i]);
		if( it != znalezioneWczesniej.end())
		{
			cout << znalezioneWczesniej[i] << endl;
		}
		else // jeszcze nie bylo tego
		{
			int j = 0;
			for(; j < nSize; ++j)
			{
				if( tab1[j] == tab2[i] )
				{
					string str = getStringFromInt(j+1);
					cout<<str<<endl;
					znalezioneWczesniej[tab2[i]] = str;
					break;
				}
			}
			if ( j == nSize )
			{
				string str("NIE");
				cout<<str<<endl;
				znalezioneWczesniej[tab2[i]] = str;
			}
		}
	}
}

string getStringFromInt(int a)
{
	stringstream ss;
	ss << a;
	return ss.str();
}


fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1
Kopiuj
mam taki kod ale znowu coś nie działa :-(

to napraw to cos to bedzie dzialac ;)

my nie wiemy co to jest to cos

PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:83
0
fasadin napisał(a):
Kopiuj
mam taki kod ale znowu coś nie działa :-(

to napraw to cos to bedzie dzialac ;)

my nie wiemy co to jest to cos

:-)

W testach pokazuje mi:

cia0a.in 0.00 s / 0.50 s 5.17 MB OK
cia0b.in 0.00 s / 0.50 s 5.17 MB OK -
cia1a.in 0.00 s / 0.50 s 5.17 MB OK
cia1b.in 0.00 s / 0.50 s 5.17 MB Błędna odpowiedź -
cia2.in 0.00 s / 0.50 s 5.17 MB Błędna odpowiedź -
cia3.in 0.00 s / 0.50 s 5.17 MB Błędna odpowiedź -
cia4.in 0.07 s / 1.00 s 5.55 MB Błędna odpowiedź -
cia5.in 1.47 s / 2.00 s 6.68 MB Błędna odpowiedź -
cia6.in 3.00 s / 3.00 s 6.06 MB Limit czasu przekroczony -
cia7.in 6.00 s / 6.00 s 5.68 MB Limit czasu przekroczony -

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
1

weź ten kod podziel na funkcje, tak żebyśmy nie widzieli jednego wielkiego krzaczka.
Może ci się wtedy samo naprawi.

Poza tym, podpowiedzi jakie dostałeś powinny cię nakierować na rozwiązanie, gdzie NIE MA zagnieżdżonych pętli for, a ja u ciebie coś takiego widzę.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:83
0

Dziękuję za pomoc. Ostatecznie taki mam kod:

Kopiuj

#include<iostream>
using namespace std;
int tab1[1000005];
int main()
{
	int n, q,a,b;
	cin>>n>>q;
	for (int i=0; i<n;i++ )
	{
		cin>>b;
		if (tab1[b]==0)
		{
			tab1[b]=i+1;
		}
	}
	for (int i=0; i<q; i++)
	{
		cin>>a;
		if(tab1[a]==0)
		{
			cout <<"NIE"<<"\n";
		}
		else
		{
			cout<< tab1[a]<<"\n";
		}
	}
	return 0;
}

edytowany 1x, ostatnio: pattom

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.