incluido.cpp

// $Id$

/* COMIENZO DE DESCRIPCION 

   __USE_WIKI__
   Escribir un predicado
   #bool incluido(set<int> &A, set<int> &B);# que retorna verdadero
   si y solo si #A# esta incluido en #B#. 
   [Tomado en el 3er parcial 23/6/2005]. 
   keywords: conjunto

   FIN DE DESCRIPCION */

#include <cmath>
#include <set>
#include <list>
#include <algorithm>
#include "./util.h"

using namespace std;

void print(const set<int> &s,
	   const char *t=NULL) {
  if (t) printf("%s",t);
  set<int>::iterator q = s.begin();
  while (q!=s.end()) printf("%d ",*q++);
  printf("\n");
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// version 1: verifica que cada elemento de
// A este en B
bool incluido(set<int> &A, set<int> &B) {
  set<int>::iterator q = A.begin();
  while (q != A.end()) 
    if (B.find(*q++) == B.end()) return false;
  return true;
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// A esta incluido en B si y solo si
// la diferencia A-B es vacia
bool incluido2(set<int> &A, set<int> &B) {
  set<int> C;
  set_difference(A.begin(),A.end(),B.begin(),B.end(),
		 inserter(C,C.begin()));
  return C.empty();
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void make_random_set(set<int> &s,
		     int m,int n,int N) {
  double lambda = 1.0/(m+1);	// Probability of stopping
  s.clear();
  while(1) {
    if (drand()<lambda) break;
    int w = rand() % N;
    s.insert(w);
  }
}

// -------------------------------------------------------------------
int main () {
  int N = 8;		  // Max nbr of elements in all sets
  int m = 5;			// Averg. nbr of elements in each set
  int n = 20;			// nbr of tries
  double lambda = 1.0/(m+1);	// Probability of stopping
  for (int k=0; k<n; k++) {
    set<int> a,b;
    make_random_set(a,m,n,N);
    printf("------\nA: ",k); print(a);

    make_random_set(b,m,n,N);
    printf("B: ",k); print(b);

    printf("A \\subset B (loop version) ? %d\n",
	   incluido(a,b));
    printf("A \\subset B (binary fun version) ? %d\n",
	   incluido2(a,b));
  }
}

Generated by GNU Enscript 1.6.6.