Brak pamięci? C++

0

Witam. Mam pewien problem z programem, który piszę na zajęcia algorytmiki. Zadaniem jest posortować wektor składający się z kolejno od stu do miliona elementów za pomocą podanych algorytmów i policzyć czasy. I wszystko idzie dobrze. Z wyjątkiem Quick Sorta na wektorze zawierającym sto tysięcy elementów. Moja wykładowczyni powiedziała, że musi być to jakiś problem z pamięcią, ale nic więcej nie powiedziała. Pomocy?

Main:

#include "d.h"
#define napis ; {cout<<"LOSOWE LICZBY";}
#define wypisz10(liczby); {for (int i=0; i<10; i++) {cout << liczby[i]<<" ";}}
#define wypisz (wektor); {for (int i=0; i<10; i++) cout << wektor[i]<<" ";}
#define czas(start,stop){t=(double)(stop - start);}



using namespace std;

int main(int argc, char** argv)
{
	srand((unsigned) time(0));
	int ILE;
	int r;
	clock_t start;
	clock_t stop;
	vector <double> wektor;



		cout <<endl<<endl<<"rodzaj danych\t |\trodzaj sortowania\t |\trozmiar danych\t |\tczas sortowania w klikach"<<endl;

		for(int ile=10; ile<1000000; ile=ile*10)
		{
			r=ile-1;
			for (int i=0; i<ile; i++)
			{
				wektor.push_back((double)rand() * 10/RAND_MAX);
			}
			start = clock();
			MergeSort(wektor, 0, r);
			stop = clock();
			czas(start,stop);
			cout <<"Wektor\t\t |\tMerge Sort\t\t |\t"<<ile<<"\t\t |\t"<<t<<endl;
			wektor.clear();
			for (int i=0; i<10; i++)
			{
				wektor.push_back((double)rand() * 10/RAND_MAX);
			}
			start = clock();
			QuickSort(wektor, 0, r);
			stop = clock();
			czas(start,stop);
			cout <<"Wektor\t\t |\tQuick Sort\t\t |\t"<<ile<<"\t\t |\t"<<t<<endl;
			wektor.clear();
		}
	return 0;
}
 

.cpp:

 #include "d.h"


using namespace std;


void MergeSort(vector <double> & A, int p, int r)
{
	int q;
	if (p<r)
	{
		q = (p+r)/2;
		MergeSort(A, p, q);
		MergeSort(A, q+1, r);
		Merge(A, p, q, r);
	}
}

void Merge (vector <double> & A,int p, int q, int r)
{
	int n1, n2, i, j, k;

	n1 = q - p + 1;
	n2 = r - q;

	vector <double> L(n1+1);
	vector <double> R(n2+1);

	for (i=0; i<n1; i++) {L[i] = A[p+i];}
	for (j=0; j<n2; j++) {R[j]=A[q+j+1];}

	 L[n1]=numeric_limits <double>::max();
	 R[n2]=numeric_limits <double>::max();

	int a=0;
	int b=0;

	for( k=p; k<=r; k++)
		{
			if (L[a]<=R[b])
			{
				A[k]=L[a];
				a++;
			}
			else
			{
				A[k]=R[b];
				b++;
			}
		}
}

void QuickSort (vector <double>  &A, int p, int r)
{
	int q;
	if (p<r)
	{
		q=Partition(A, p, r);
		QuickSort (A, p, q-1);
		QuickSort (A, q+1, r);
	}
}

int Partition (vector <double>  &A, int p, int r)
{
	double x;
	int i;
	x=A[r];
	i=p-1;

	for(int j=p; j<=r-1; j++)
	{
		if (A[j] <= x)
		{
			i=i+1;
			swap(A[i], A[j]);
		}
	}
	swap (A[i+1], A[r]);
	return i+1;
}
}
1

Szczęśliwym trafem szczelam, że przepełniasz stos.

1

Tyle rekurencji może ci nabić jakieś 2mb stosu na samo wywołanie funkcji. Podbij stos przy kompilacji.

0

Tylko jak to zrobić? Nigdy wcześniej czegoś podobnego nie próbowałam albo nie pamiętam...

5

jak to zrobic? bardzo prosto

  1. Robisz herbate/kawe. To bardzo wazy proces w tym calym rozwiazaniu
  2. bierzesz lyk herbaty
  3. stwierdzasz ze musisz isc do kibelka
  4. idziesz do kibelka
  5. robiac to co robi krol sam, kontemplujesz nad zyciem
  6. konczysz robic co zaczales w kibelku
  7. idziesz pic herbate
  8. zimna... idziesz zrobic sobie nowa
  9. nastawiasz wode na nowa herbatke
  10. czekasz az woda sie zagotuje wtedy myslisz "jak to zrobic?"
  11. po ciezkim zastanawianiu sie stwierdzasz ze nie wiesz
  12. po kolejnym dniu stwierdzasz, ze sam sobie nie poradzisz

I TERAZ UWAGA NAJWAZNIEJSZE

  1. googlujesz problem... Po angielsku...
0

Jeżeli używasz GCC to szukasz pod hasłem "linker script".

0

Śmierdzi mi to drożdżówką typu Makowiec... xD

0

Każdy kompilator/linker będzie miał to inaczej, ale dla GCC opis masz tutaj:

http://stackoverflow.com/questions/2275550/change-stack-size-for-a-c-application-in-linux-during-compilation-with-gnu-com

Ale to tak naprawdę niewiele da, bo zawsze jest szansa że quick sort Ci przepełni stos.

Co możesz zrobić:
a) zmienne typu "int q;" deklaruj tam gdzie są potrzebne - wewnątrz

if() {}

b) zrób algorytm hybrydowy (część quick sort, część inaczej)
c) użyj nie-rekurencyjnego quick sorta

Ad. b:

Ad. c:

1 użytkowników online, w tym zalogowanych: 0, gości: 1