Cerca Dicotòmica
[How-to del blog antic.]
Algorisme de cerca en un vector. Una cerca dicotòmica necessita l’entrada ordenada. A grans trets, el que fa és dividir en dos el vector i seguir buscant en el tros de vector on pot estar el nostre valor.
#include <iostream> #include <vector> #include "stdlib.h" using namespace std; static void mostra_taula ( vector<int>& t ) { int i = 0; while( i < t.size() ){ cout << t[i] << " " ; i++; } cout << endl; } static void fusiona( vector<int>& t, int inici, int mig, int fi) { vector<int> aux(fi - inici + 1); int i = inici; // index part esquerra del vector int j = mig + 1; // index part dreta del vector int k = 0; // index del vector aux //mentre no acabi cap index de t, l'element més petit es copia al vector aux while ( i <= mig and j <= fi ) { if ( t[i] < t[j] ) { aux[k] = t[i]; ++i; } else { aux[k] = t[j]; ++j; } ++k; } //cas en què un vector ja s'ha copiat al complert while (i <= mig) { aux[k] = t[i]; ++i; ++k; } while (j <= fi) { aux[k] = t[j]; ++j; ++k; } // copia els elements guardats a aux a t for (int n = 0; n < aux.size(); ++n){ t[inici + n] = aux[n]; } } static void merge_sort( vector<int>& t, int inici, int fi) { if ( inici < fi ) { int mig = ( inici + fi ) / 2; merge_sort( t, inici, mig); merge_sort( t, mig + 1, fi); fusiona( t, inici, mig, fi); } } static int cerca_dicotomica( vector<int> t, int x, int l, int tamany ){ int m = (l + tamany)/2; if( l== tamany-1 ) return l; if( x < t[m] ) return cerca_dicotomica( t, x, l, m ); else return cerca_dicotomica( t, x, m, tamany); } int main () { //MODIFICA LA VARIABLE TAMANY PER DONAR MIDA A LA TAULA. int tamany = 8; //MODIFICA ELS DOS NOMBRES DONATS int x = 2; int y = 3; //ES GUARDA EL RESULTAT A LA VARIABLE int resultat; int resultatX, resultatY; //VECTOR AMB EL QUE ES TREBALLA vector<int> taula( tamany ); int i = 0, aux; for (int i=0; i<taula.size(); ++i) { aux = rand( ) % tamany; taula[i] = aux; } //mostra_taula( taula ); merge_sort( taula, 0, tamany); mostra_taula( taula ); resultatX = cerca_dicotomica( taula, x, 0, tamany ); resultatY = cerca_dicotomica( taula, y, 0, tamany ); cout <<" NOMBRE DE CELES ENTRE "<< x << " i "<< y <<" = "<< resultatY - resultatX + 1 << endl; }
Tags: C++, CPP, Programació
Articles relacionats
OOCSS (2a part), profunditzant en els widgets
FireQuery, una extenció de Firebug per desenvolupar en jQuery
-
http://topsy.com/trackback?url=http%3A%2F%2Fopenpitu.com%2F%3Fp%3D152&utm_source=pingback&utm_campaign=L2 Tweets that mention FireQuery, una extenció de Firebug per desenvolupar en jQuery | open-pitu, el blog lliure en català — Topsy.com