08.71.35 Uppbygging tölva

Forritunarverkefni 2


Í þessu verkefni eigið þið að skrifa fall í 16-bita x86 smalamáli sem útfærir svokallaða Quick-find lausn á Union-Find-verkefninu, sem þið ættuð að kannast við úr Tölvunarfræði 2.

Fallið sem þið skrifið fær í DS:SI bendi á vektorinn id, sem er óupphafsstilltur N-staka vektor af 16-bita orðum, í CX er gildið N, sem er fjöldi staka í id og í DX er gildið M, sem er fjöldi samruna (e. union) sem á að framkvæma. Fallið upphafsstillir vektorinn id og uppfærir hann síðan með slembisamrunum. Slembitölurnar eru fengnar úr fallinu slembi, en það skilar 16-bita slemitölugildi sem þarf síðan að kvarða, þannig að það sé á bilinu 0 til N-1.

Hér að neðan er útgáfa af Quick-find í C++.

	void QuickFind( int id[], int N, int M )
	{
	    int i, j, p, q;
	
	    for( i=0; i<N; i++ )
	        id[i] = i;
	
	    for( j=0; j<M; j++ ) {
	        p = slmb(N);  q = slmb(N);
	        int t = id[p];
	        if (t == id[q]) continue;
	        for( i=0; i<N; i++ )
	            if (id[i] == t) id[i] = id[q];
	    }
	}
Í forritinu er gert ráð fyrir að fallið slmb(N) skili slembitölu á bilinu 0 til N-1.

Þið eigið líka að skrifa aðalforrit sem skilgreinir 10000 staka vektor og kallar síðan á QuickFind með N=10000 og M=10000. Síðan gæti forritið notað vektorinn id til að framkvæma Find-aðgerðir. Þið þurfið þó ekki að skrifa þann hluta.

Ef þið viljið ekki byrja alltaf með sama upphafsgildi í slembitölufallinu þá getið þið notað ykkur að DOS geymir 32-bita teljara í 0040:006C, sem er hækkaður 18.2 sinnum á sekúndu.


Skilið útprentun fimmtudaginn 18. október.

hh (hja) hi.is, 10. október, 2001.