[C++] Rozdiel mnozin

Programovacie jazyky, rady, poradňa...
sejnt
Amateur
Amateur
Príspevky: 11
Registrovaný: 15 nov 2009, 13:39
Bydlisko: Vysoka nad Kysucou

[C++] Rozdiel mnozin

Príspevok od používateľa sejnt »

Zdravim, mam nacitat dva subory po milion prvkov a urobit z nich rozdiel.
Takze postupoval som takto.Nacital som si tie subory do dvoch poli na obidve som pouzil QuickSort.A rozdiel som chcel urobit takto :
Vezmem 1 prvok pola field1 , preskakujem ( vzostupne zoradene ) prvky pola filed2 pokial su menise ako prvy prvok pola field1.
Ak je 1. prvok field1 odlisny od akutalneho prcku field2 tak ho prida do rozdielu ..nizsie prvky field2 som preskocil a pretoze je field2 zoradene a prvy nepreskoceny je odlisny , musi byt aktualny vysii a dalsie este vyssie. V opacnom pripade si musia byt 1. prvok field1 a aktualny prvok field2 rovne. 1 prvok field1 nepatri do rozdielu.. atd atd .
tu je kod

Kód: Vybrať všetko

write.open(name);
   int indexFile2 = -1;
   int element;

   for (int indexFile1 = 0; indexFile1 < SIZE; indexFile1++)
   {
      element = field1[indexFile1];
      while ( (indexFile2 < SIZE - 1) && (field2[++indexFile2] < element) )
      if ( indexFile2 >= SIZE - 1)
      {
         for ( int i = indexFile1; i < SIZE; i++)
            write << field1[indexFile1] << endl;
      
         break;
      }
      if ( element != field2[indexFile2])
         write <<  element << endl;
   }
Okrem duplicit tam mam este vela cisel ktore tam nepatria ..Duplicity uz odstranim.Predtym som pouzil binarne vyhladavanie prvku z field1 a hladal ho vo field2 ak nenasiel tak som ho zapisal ale vysledok ten isty ako pri prvom algoritme ..Duplicity som odstranoval vo for ak bol prvok i rovnaky ako prvok i -1 tak som ho nezapisal .

Kód: Vybrať všetko

int middle;
   //Binary search
   middle = (left + right) / 2;
   for(int i = 0; i < SIZE; i++){
      while ((left <= right) && (field1[i] != field2[middle]))
      {
         if (field1[i] < field2[middle])
            right = middle - 1;
         else left = middle + 1;
         middle = (left + right) / 2;
      }
      if (left > right)
         output[i]=field1[i];
   }
dik za pomoc
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: [C++] Rozdiel mnozin

Príspevok od používateľa chrono »

A aká je otázka? :)
sejnt
Amateur
Amateur
Príspevky: 11
Registrovaný: 15 nov 2009, 13:39
Bydlisko: Vysoka nad Kysucou

Re: [C++] Rozdiel mnozin

Príspevok od používateľa sejnt »

Ze kde mam chybu.Nepracuje to spravne ani jeden ani druhy algoritmus .rozdiel ma byt okolo 985000 cisel a ja mam vyse 990000 cisel aj po odstraneni duplicit.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: [C++] Rozdiel mnozin

Príspevok od používateľa chrono »

Nevložil si sem dva krát ten istý kód?

A je to binárne vyhľadávanie urobené dobre? Lebo z letmého prezretia sa mi zdá, ako keby si tam kontroloval iba polovicu toho zoznamu.
sejnt
Amateur
Amateur
Príspevky: 11
Registrovaný: 15 nov 2009, 13:39
Bydlisko: Vysoka nad Kysucou

Re: [C++] Rozdiel mnozin

Príspevok od používateľa sejnt »

Uz by to malo byt OK ..
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: [C++] Rozdiel mnozin

Príspevok od používateľa chrono »

V tom prvom máš while, ktorým preskakuješ prvky, ktoré sú menšie ako element (a teda tie, ktoré nie sú v prvom poli). Problém je, že ti za while chýba ;, takže sa opakuje aj nasledujúca podmienka if a break ukončuje len to while (a to asi nie je to, čo chceš).

A pri tom druhom by nemalo byť to nastavovanie left a right až v tom for cykle?
sejnt
Amateur
Amateur
Príspevky: 11
Registrovaný: 15 nov 2009, 13:39
Bydlisko: Vysoka nad Kysucou

Re: [C++] Rozdiel mnozin

Príspevok od používateľa sejnt »

no ; za while nepomohla vystup ostal rovnaky.a to binarne vyhladavanie si myslel takto ???

Kód: Vybrať všetko

	for(int i = 0; i < SIZE; i++){
		middle = (left + right) / 2;
		
		while ((left <= right) && (field1[i] != field2[middle]))
		{
			
			middle = (left + right) / 2;
		
		}
		if (field1[i] < field2[middle])
				right = middle - 1;
			else left = middle + 1;
		if (left > right)
				output[i] =  field1[i] ;// If element from frist array isn't in second aray -write it.
		
	}
}
alebo inak ..ja uz sa z toho asi zblaznim.:D
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: [C++] Rozdiel mnozin

Príspevok od používateľa chrono »

V tom for cykle ti ostanú premenné left a right nastavené podľa posledného nájdeného (alebo aj nenájdeného) čísla a teda pri ďalšom prechode cyklom už neprechádzaš celé to pole, ale len, viac menej náhodnú, časť.
sejnt
Amateur
Amateur
Príspevky: 11
Registrovaný: 15 nov 2009, 13:39
Bydlisko: Vysoka nad Kysucou

Re: [C++] Rozdiel mnozin

Príspevok od používateľa sejnt »

SLAVA TI !! :) :plus:
Napísať odpoveď