• Domingo 22 de Diciembre de 2024, 22:19

Autor Tema:  Generar Subconjuntos de tamaño m de un conjutno  (Leído 6623 veces)

protoculo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Generar Subconjuntos de tamaño m de un conjutno
« en: Viernes 1 de Mayo de 2009, 15:28 »
0
Buenas,

partiendo de un método que tiene como entrada dos naturales: n y m.

Se deben generar todos los subconjuntos de tamaño m del conjunto con número de elementos n.

p .ejemplo.

si n = 4 y m =2
[1,2,3,4]

debería devolver [1,2] [1,3] [1,4] [2,3] [2,4] [3,4]

el conjunto inicial siempre se crea desde 1 a n.


Muchas gracias por la ayuda.


Yo había pensado en hacerlo con una lista simplemente enlazada. Lo que no averiguo es como recorrer el conjunto inicial (podria ser un vector) para dar todos los subconjuntos de tamaño m existentes.

Saludos,

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #1 en: Viernes 1 de Mayo de 2009, 21:06 »
0
Lo puedes hacer con listas, con un vector simple, como desees.

Lo más sencillo: tomas el valor inicial y lo emparejas con todos los que le siguen, ahora tomas el segundo valor y lo emparejas con los subsecuentes, tomas el tercero y lo emparejas...
La imaginación es el límite.
Hardware & Software | Mexchip

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #2 en: Sábado 2 de Mayo de 2009, 16:43 »
0
segui el consejo que te acaban de dar.
el programa es muy simple.

porque quieres utilizar listas???? necesitas tener en memoria (RAM) estos subconjuntos o simplemente los tienes que guardar en alguna parte, o simplemente los tienes que imprimir ???

si no necesitas tenerlos en memoria RAM, imprimelos simplemente, o guardalos en un archivo :D
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

protoculo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #3 en: Martes 5 de Mayo de 2009, 22:54 »
0
Cita de: "Geo"
Lo puedes hacer con listas, con un vector simple, como desees.

Lo más sencillo: tomas el valor inicial y lo emparejas con todos los que le siguen, ahora tomas el segundo valor y lo emparejas con los subsecuentes, tomas el tercero y lo emparejas...

Creo que no es tan sencillo como lo planteas...

no podemos emparejar el inicial con los siguientes, puesto que en el caso que expongo:

1,2,3,4

si se hacen de tres en tres, como se hace?

1,2,3 ... 1,2,4

no creo que sea tan sencillo... o estoy muy liado.

Si alguien puede postear la estructura solo para encontrar todas las combinaciones como pongo en el primer post, teniendo en cuenta que debe ser subconjuntos de m elementos de un conjunto de n.

no os preocupeis de donde se deben almacenar.

Saludos y gracias de nuevo.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #4 en: Miércoles 6 de Mayo de 2009, 07:00 »
0
Cita de: "protoculo"
Cita de: "Geo"
Lo puedes hacer con listas, con un vector simple, como desees.

Lo más sencillo: tomas el valor inicial y lo emparejas con todos los que le siguen, ahora tomas el segundo valor y lo emparejas con los subsecuentes, tomas el tercero y lo emparejas...

Creo que no es tan sencillo como lo planteas...

no podemos emparejar el inicial con los siguientes, puesto que en el caso que expongo:

1,2,3,4

si se hacen de tres en tres, como se hace?

1,2,3 ... 1,2,4

no creo que sea tan sencillo... o estoy muy liado.
¿De tres en tres? En tu enunciado no aparece esa posibilidad.

Cita de: "protoculo"
Si alguien puede postear la estructura solo para encontrar todas las combinaciones como pongo en el primer post, teniendo en cuenta que debe ser subconjuntos de m elementos de un conjunto de n.
Podrías tomar papel, lápiz (y goma) y hacerlo.
4,3
123, 234

9,6
123456, 234567, 345678, 456789
La imaginación es el límite.
Hardware & Software | Mexchip

protoculo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #5 en: Jueves 7 de Mayo de 2009, 00:15 »
0
Cita de: "Geo"
Cita de: "protoculo"
Cita de: "Geo"
Lo puedes hacer con listas, con un vector simple, como desees.

Lo más sencillo: tomas el valor inicial y lo emparejas con todos los que le siguen, ahora tomas el segundo valor y lo emparejas con los subsecuentes, tomas el tercero y lo emparejas...

Creo que no es tan sencillo como lo planteas...

no podemos emparejar el inicial con los siguientes, puesto que en el caso que expongo:

1,2,3,4

si se hacen de tres en tres, como se hace?

1,2,3 ... 1,2,4

no creo que sea tan sencillo... o estoy muy liado.
¿De tres en tres? En tu enunciado no aparece esa posibilidad.

Cita de: "protoculo"
Si alguien puede postear la estructura solo para encontrar todas las combinaciones como pongo en el primer post, teniendo en cuenta que debe ser subconjuntos de m elementos de un conjunto de n.
Podrías tomar papel, lápiz (y goma) y hacerlo.
4,3
123, 234

9,6
123456, 234567, 345678, 456789

Ésto es una respuesta?

papel y lápiz?

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #6 en: Jueves 7 de Mayo de 2009, 06:21 »
0
Cita de: "protoculo"
Ésto es una respuesta?

papel y lápiz?

Con papel y lápiz se hace esto:
----------------------
N, M
[subconjuntos]

4, 3
[123], [134], [234]

9, 6
[123456], [134567], [145678], [156789], [234567], [245678], [256789], [345678], [356789], [456789]
-----------------------
Visualizando no me parece que sea muy difícil hallar el patrón (perdone ud. si me equivoco), con lo que se puede pasar a expresarlo mediante un algoritmo y crear el programa.

La idea era ayudar a encontrar la solución, no entregarla, disculpas y suerte con tu tarea.
La imaginación es el límite.
Hardware & Software | Mexchip

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #7 en: Jueves 7 de Mayo de 2009, 07:00 »
0
lindo tu problema.

disculpa si mi codigo esta improlijo, le hice de apuradas, porque me parecia intrigante tu problema.

tambien te pido disculpas si es algo ineficiente o dificil de seguir.

tambien te pido disculpas, porque no hice pruebas necesarias para garantizar que el programa funcione para todos los casos.

pero probalo y decime ok ????

aqui va.... esta compilado en CODE BLOCKS con MINGW:

Código: C++
  1.  
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int N,M;
  7. void imprimir_memoria(int memoria[100][10]);
  8. bool fin_vectorPunteros(int vectorPunteros[]);
  9. bool apunta_elementos_distintos(int vectorPadre[],int vectorPunteros[]);
  10. void inc_vectorPunteros(int vectorPunteros[],int longitud);
  11. void guardar_subconjunto_en_memoria(int memoria[100][10],int vectorPunteros[],int vectorPadre[]);
  12. bool subconjunto_encontrado_en_memoria(int memoria[100][10],int vectorPadre[],int vectorPunteros[]);
  13. void imprimir_vectorPunteros(int vectorPunteros[]);
  14. void imprimir_vectorPadreApuntado(int vectorPadre[],int vectorPunteros[]);
  15.  
  16.  
  17. int main()
  18. {
  19.     cout << "Programa que genera SubConjuntos" << endl;
  20.  
  21.     cout << "Ingrese el numero de elementos del conjunto PADRE:";
  22.     cin >> N; cout << endl;
  23.     cout << "Cargue los elementos del conjunto PADRE:" << endl;
  24.     int vectorPadre[N];
  25.     for (int i = 0;i<N;i++) {
  26.         cout << i << ">";
  27.         cin >> vectorPadre[i];
  28.         cout << endl;
  29.     }
  30.     cout << "Imprimiendo conjunto PADRE:" << endl;
  31.     for (int i = 0; i<N ;i++) {
  32.         cout << vectorPadre[i] << "-";
  33.     }
  34.  
  35.     cout << endl << "----------------------------------------------" << endl;
  36.     cout << endl << "Ingrese el tamaño de los subconjuntos:";
  37.     cin >> M;
  38.  
  39.     cout << endl << "----------------------------------------------" << endl;
  40.     cout << "iniciando vector punteros en 0" << endl;
  41.     int vectorPunteros[M];
  42.     for (int i = 0;i<M;i++){
  43.         vectorPunteros[i] = 0;
  44.     }
  45.  
  46.     cout << endl << "----------------------------------------------" << endl;
  47.     cout << "iniciando matriz de memoria en -1" << endl;
  48.     int memoria[100][10];
  49.     for (int i = 0;i<100;i++) {
  50.         for (int j = 0;j<M;j++){
  51.             memoria[i][j] = -1;
  52.         }
  53.     }
  54.  
  55.     while (!fin_vectorPunteros(vectorPunteros)){
  56.         /*if (apunta_elementos_distintos(vectorPadre,vectorPunteros)) {
  57.             if (subconjunto_encontrado_en_memoria(memoria,vectorPadre,vectorPunteros)){
  58.                 cout << endl << "Encontrado:";
  59.                 for (int x = 0;x<M;x++){
  60.                     cout << vectorPadre[vectorPunteros[x]];
  61.                 }
  62.                 cout << endl;
  63.                 //guardar_subconjunto(matriz_memoria,vectorA,vectorPunt,M,N);
  64.             }
  65.         }
  66.         */
  67.         if (apunta_elementos_distintos(vectorPadre,vectorPunteros)) {
  68.             //imprimir_vectorPunteros(vectorPunteros);
  69.             //imprimir_vectorPadreApuntado(vectorPadre,vectorPunteros);
  70.             if (!subconjunto_encontrado_en_memoria(memoria,vectorPadre,vectorPunteros)){
  71.                 cout << "Subconjunto nuevo {" << endl;
  72.                 cout << "t"; imprimir_vectorPunteros(vectorPunteros);
  73.                 cout << "t"; imprimir_vectorPadreApuntado(vectorPadre,vectorPunteros);
  74.                 cout << endl << "}" << endl;
  75.  
  76.                 guardar_subconjunto_en_memoria(memoria,vectorPunteros,vectorPadre);
  77.             }
  78.         }
  79.         inc_vectorPunteros(vectorPunteros,M);
  80.         cout << endl;
  81.     }
  82.     system("pause");
  83.     imprimir_memoria(memoria);
  84.     return 0;
  85. }
  86.  
  87. bool subconjunto_encontrado_en_memoria(int memoria[100][10],int vectorPadre[],int vectorPunteros[]){
  88.     bool ban = false,temp;
  89.     int fila = 0,coincidencias;
  90.  
  91.     while (memoria[fila][0] != -1) {
  92.         coincidencias = 0;
  93.         for (int j = 0;j<M;j++){
  94.             for (int j2 = 0;j2<M;j2++){
  95.                 if (memoria[fila][j] == vectorPadre[vectorPunteros[j2]]) {
  96.                     coincidencias++;
  97.                 }
  98.             }
  99.         }
  100.         fila++;
  101.         if (coincidencias == M) {
  102.             return true;
  103.         }
  104.     }
  105.     return false;
  106. }
  107.  
  108. void guardar_subconjunto_en_memoria(int memoria[100][10],int vectorPunteros[],int vectorPadre[]) {
  109.     int fila;
  110.     for (fila = 0;((fila<100) && (memoria[fila][0] != -1));fila++);
  111.     for (int j = 0;j<M;j++){
  112.         memoria[fila][j] = vectorPadre[vectorPunteros[j]];
  113.     }
  114. }
  115.  
  116. void inc_vectorPunteros(int vectorPunteros[],int longitud) {
  117.     bool ban = true;
  118.     longitud--;
  119.     while (ban) {
  120.         if (vectorPunteros[longitud] == (N-1)) {
  121.             vectorPunteros[longitud] = 0;
  122.             longitud--;
  123.         }
  124.         else {
  125.             vectorPunteros[longitud] = vectorPunteros[longitud] + 1;
  126.             ban = false;
  127.         }
  128.     }
  129. }
  130.  
  131. bool apunta_elementos_distintos(int vectorPadre[],int vectorPunteros[]) {
  132.     for (int i = 0;i<M;i++){
  133.         for (int j = i+1;j<M;j++) {
  134.             if (vectorPadre[vectorPunteros[i]] == vectorPadre[vectorPunteros[j]]) {
  135.                     return false;
  136.             }
  137.         }
  138.     }
  139.  
  140.     return true;
  141. }
  142.  
  143. bool fin_vectorPunteros(int vectorPunteros[]) {
  144.     bool ban = true;
  145.     for (int i = 0;i<M;i++) {
  146.         if (vectorPunteros[i] != (N-1)) {
  147.             ban = false;
  148.         }
  149.     }
  150.     return ban;
  151. }
  152.  
  153. void imprimir_memoria(int memoria[100][10]) {
  154.     for (int i = 0;i<100;i++){
  155.         for (int j = 0;j<M;j++){
  156.             cout << memoria[i][j] << " ";
  157.         }
  158.         cout << endl;
  159.     }
  160. }
  161.  
  162. void imprimir_vectorPunteros(int vectorPunteros[]){
  163.     cout << " Vector Punteros: ";
  164.     for (int i = 0; i<M ; i++){
  165.         cout << vectorPunteros[i];
  166.     }
  167. }
  168.  
  169. void imprimir_vectorPadreApuntado(int vectorPadre[],int vectorPunteros[]){
  170.     cout << " Vector Padre Apuntado: ";
  171.     for (int i = 0; i<M ; i++){
  172.         cout << vectorPadre[vectorPunteros[i]];
  173.     }
  174. }
  175.  
  176.  
  177.  


EI: juntando mensajes.

vi que andaba con un conjunto de 4 elementos, y generaba sobconjuntos de 2, tambien de 3, y lo postie.

es muy tarde, probalo, mañana lo explico bien cual fue la logica.

por favor, nadie me critique eficiencia y eso ... vuelvo a decir, lo hice a las apuradas (aun pueden ver mis comentarios en el codigo que muestran que estaba depurando y ni siquiera los borre)

saludos

la memoria para guardar los subconjuntos encontrados es de 100 por 10, es decir, puedes almacenar como maximo 100 subconjuntos de 10 elementos cada uno en esa memoria.

saludos, mañana lo explico
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

protoculo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #8 en: Jueves 7 de Mayo de 2009, 18:46 »
0
Muchas gracias,

no dudo que no funcione, pero no los quiero almacenar.

Solo quiero una estructura de for anidados o recursivo que me devuelva cada subconjunto existente en el conjunto inicial (que rellene un array de m elementos por ejemplo)... luego yo con cada array ya me apaño (los voy a meter en una lista dinámica).

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #9 en: Jueves 7 de Mayo de 2009, 20:34 »
0
tu estructura recursiva seria esta en mi codigo:

Código: C++
  1.  
  2. while (!fin_vectorPunteros(vectorPunteros)){
  3.         /*if (apunta_elementos_distintos(vectorPadre,vectorPunteros)) {
  4.             if (subconjunto_encontrado_en_memoria(memoria,vectorPadre,vectorPunteros)){
  5.                 cout << endl << "Encontrado:";
  6.                 for (int x = 0;x<M;x++){
  7.                     cout << vectorPadre[vectorPunteros[x]];
  8.                 }
  9.                 cout << endl;
  10.                 //guardar_subconjunto(matriz_memoria,vectorA,vectorPunt,M,N);
  11.             }
  12.         }
  13.         */
  14.         if (apunta_elementos_distintos(vectorPadre,vectorPunteros)) {
  15.             //imprimir_vectorPunteros(vectorPunteros);
  16.             //imprimir_vectorPadreApuntado(vectorPadre,vectorPunteros);
  17.             if (!subconjunto_encontrado_en_memoria(memoria,vectorPadre,vectorPunteros)){
  18.                 cout << "Subconjunto nuevo {" << endl;
  19.                 cout << "t"; imprimir_vectorPunteros(vectorPunteros);
  20.                 cout << "t"; imprimir_vectorPadreApuntado(vectorPadre,vectorPunteros);
  21.                 cout << endl << "}" << endl;
  22.  
  23.                 guardar_subconjunto_en_memoria(memoria,vectorPunteros,vectorPadre);
  24.             }
  25.         }
  26.         inc_vectorPunteros(vectorPunteros,M);
  27.         cout << endl;
  28.     }
  29.  
  30.  

desde mi logica, si tienes que almacenar los subconjuntos encontrados, porque SI es lo mismo decir subconjunto {1,2}  y {2,1} tienen los mismos elementos, es el mismo conjunto, entonces debes llevar una cuenta de los subconjuntos encontrados.

proba el programa que hice, porque lo e hecho por vos, bajate el codeblocks con mingw, compilalo, analizalo, testealo, y en todo caso depuralo.

vuelvo a repetir, sitienes que almacenar, aunque sea temporalmente como lo hago yo, todos los subconjuntos que vas encontrando para no repetirlos en la salida.

EI: juntando mensajes.

Código: C++
  1.  
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. /*
  7. variable N, es la cantidad de elementos del conjunto padre
  8. variable M, es la cantidad de elementos que deben tener los cubconjuntos generados de PADRE
  9. */
  10. int N,M;
  11.  
  12. void imprimir_memoria(int memoria[100][10]); //imprime los subconjuntos generados
  13.  
  14. /* funcion que devuelve true si ya se evaluaron todos los elementos del conjunto PADRE*/
  15. bool fin_vectorPunteros(int vectorPunteros[]);
  16.  
  17. /*funcion que nos dice si el vector punteros apunta elementos distintos, es necesario, porque no podemos generar un subconjunto de 3 elementos que sea {1,1,2} por ejemplo */
  18. bool apunta_elementos_distintos(int vectorPadre[],int vectorPunteros[]);
  19.  
  20. /*funcion para incrementar el vector de punteros y apuntar al elemento siguiente del conjunto PADRE*/
  21. void inc_vectorPunteros(int vectorPunteros[],int longitud);
  22.  
  23. /*cuando se encuentra un subconjunto , debo guardarlo, en este caso en una memoria de 100 x 10, es decir podre almacenar hasta 100 subconjuntos de como maximo 10 elementos c/u*/
  24. void guardar_subconjunto_en_memoria(int memoria[100][10],int vectorPunteros[],int vectorPadre[]);
  25.  
  26. /*cuando el vector punteros se actualiza, hay un posible subconjunto de PADRE (apuntado por este vector), por ese debemos averiguar si existe un subconjunto en memoria igualal encontrado, pues puede darse el caso de haber almacenado el subconjunto {1,2} y en algun momento del algoritmo hacer referencia a un subconjunto {2,1} que seria equivalente*/
  27. bool subconjunto_encontrado_en_memoria(int memoria[100][10],int vectorPadre[],int vectorPunteros[]);
  28.  
  29. /*imprime el contenido de vectorPunteros*/
  30. void imprimir_vectorPunteros(int vectorPunteros[]);
  31.  
  32. /*imprime los elementos (que formarian un posible subconjunto) de PADRE apuntados por vectorPunteros*/
  33. void imprimir_vectorPadreApuntado(int vectorPadre[],int vectorPunteros[]);
  34.  
  35.  
  36. int main()
  37. {
  38.     cout << "Programa que genera SubConjuntos" << endl;
  39.     /*digo cuantos elementos tendra PADRE*/
  40.     cout << "Ingrese el numero de elementos del conjunto PADRE:";
  41.     cin >> N; cout << endl;
  42.    
  43.     /*luego cargo el conjunto PADRE*/
  44.     cout << "Cargue los elementos del conjunto PADRE:" << endl;
  45.     int vectorPadre[N];
  46.     for (int i = 0;i<N;i++) {
  47.         cout << i << ">";
  48.         cin >> vectorPadre[i];
  49.         cout << endl;
  50.     }
  51.     /*imprimo su contenido para verificar*/
  52.     cout << "Imprimiendo conjunto PADRE:" << endl;
  53.     for (int i = 0; i<N ;i++) {
  54.         cout << vectorPadre[i] << "-";
  55.     }
  56.  
  57.     cout << endl << "----------------------------------------------" << endl;
  58.     /* digo cuantos elementos debera tener los subconjuntos generados */
  59.     cout << endl << "Ingrese el tamaño de los subconjuntos:";
  60.     cin >> M;
  61.  
  62.     cout << endl << "----------------------------------------------" << endl;
  63.  
  64.     /* inicio el vector punteros en 0 para asegurar su contenido */
  65.     cout << "iniciando vector punteros en 0" << endl;
  66.     int vectorPunteros[M];
  67.     for (int i = 0;i<M;i++){
  68.         vectorPunteros[i] = 0;
  69.     }
  70.  
  71.     cout << endl << "----------------------------------------------" << endl;
  72.  
  73.     /* genero e inicio una memeoria para almacenar los subconjuntos encontrados */
  74.     cout << "iniciando matriz de memoria en -1" << endl;
  75.     int memoria[100][10];
  76.     for (int i = 0;i<100;i++) {
  77.         for (int j = 0;j<M;j++){
  78.             memoria[i][j] = -1;
  79.         }
  80.     }
  81.    
  82.     /* Parte principal del programa */
  83.     while (!fin_vectorPunteros(vectorPunteros)){
  84.         if (apunta_elementos_distintos(vectorPadre,vectorPunteros)) {
  85.             if (!subconjunto_encontrado_en_memoria(memoria,vectorPadre,vectorPunteros)){
  86.                 cout << "Subconjunto nuevo {" << endl;
  87.                 cout << "t"; imprimir_vectorPunteros(vectorPunteros);
  88.                 cout << "t"; imprimir_vectorPadreApuntado(vectorPadre,vectorPunteros);
  89.                 cout << endl << "}" << endl;
  90.  
  91.                 guardar_subconjunto_en_memoria(memoria,vectorPunteros,vectorPadre);
  92.             }
  93.         }
  94.         inc_vectorPunteros(vectorPunteros,M);
  95.         cout << endl;
  96.     }
  97.     system("pause");
  98.     imprimir_memoria(memoria);
  99.     return 0;
  100. }
  101.  
  102. bool subconjunto_encontrado_en_memoria(int memoria[100][10],int vectorPadre[],int vectorPunteros[]){
  103.     bool ban = false,temp;
  104.     int fila = 0,coincidencias;
  105.  
  106.     while (memoria[fila][0] != -1) {
  107.         coincidencias = 0;
  108.         for (int j = 0;j<M;j++){
  109.             for (int j2 = 0;j2<M;j2++){
  110.                 if (memoria[fila][j] == vectorPadre[vectorPunteros[j2]]) {
  111.                     coincidencias++;
  112.                 }
  113.             }
  114.         }
  115.         fila++;
  116.         if (coincidencias == M) {
  117.             return true;
  118.         }
  119.     }
  120.     return false;
  121. }
  122.  
  123. void guardar_subconjunto_en_memoria(int memoria[100][10],int vectorPunteros[],int vectorPadre[]) {
  124.     int fila;
  125.     for (fila = 0;((fila<100) && (memoria[fila][0] != -1));fila++);
  126.     for (int j = 0;j<M;j++){
  127.         memoria[fila][j] = vectorPadre[vectorPunteros[j]];
  128.     }
  129. }
  130.  
  131. void inc_vectorPunteros(int vectorPunteros[],int longitud) {
  132.     bool ban = true;
  133.     longitud--;
  134.     while (ban) {
  135.         if (vectorPunteros[longitud] == (N-1)) {
  136.             vectorPunteros[longitud] = 0;
  137.             longitud--;
  138.         }
  139.         else {
  140.             vectorPunteros[longitud] = vectorPunteros[longitud] + 1;
  141.             ban = false;
  142.         }
  143.     }
  144. }
  145.  
  146. bool apunta_elementos_distintos(int vectorPadre[],int vectorPunteros[]) {
  147.     for (int i = 0;i<M;i++){
  148.         for (int j = i+1;j<M;j++) {
  149.             if (vectorPadre[vectorPunteros[i]] == vectorPadre[vectorPunteros[j]]) {
  150.                     return false;
  151.             }
  152.         }
  153.     }
  154.  
  155.     return true;
  156. }
  157.  
  158. bool fin_vectorPunteros(int vectorPunteros[]) {
  159.     bool ban = true;
  160.     for (int i = 0;i<M;i++) {
  161.         if (vectorPunteros[i] != (N-1)) {
  162.             ban = false;
  163.         }
  164.     }
  165.     return ban;
  166. }
  167.  
  168. void imprimir_memoria(int memoria[100][10]) {
  169.     for (int i = 0;i<100;i++){
  170.         for (int j = 0;j<M;j++){
  171.             cout << memoria[i][j] << " ";
  172.         }
  173.         cout << endl;
  174.     }
  175. }
  176.  
  177. void imprimir_vectorPunteros(int vectorPunteros[]){
  178.     cout << " Vector Punteros: ";
  179.     for (int i = 0; i<M ; i++){
  180.         cout << vectorPunteros[i];
  181.     }
  182. }
  183.  
  184. void imprimir_vectorPadreApuntado(int vectorPadre[],int vectorPunteros[]){
  185.     cout << " Vector Padre Apuntado: ";
  186.     for (int i = 0; i<M ; i++){
  187.         cout << vectorPadre[vectorPunteros[i]];
  188.     }
  189. }
  190.  
  191.  

EI: juntando mensajes por ULTIMA VEZ (para algo esta el boton Editar), la proxima borro.

ya esta flaco, hasta e programado por vos, que mas ayuda quieres, por lo menos analiza lo que te paso
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: Generar Subconjuntos de tamaño m de un conjutno
« Respuesta #10 en: Viernes 8 de Mayo de 2009, 22:50 »
0
y ??? desaparecio este chango che, como boludo yo haciendo el codigo para el niño.

en fin, por las dudas, te digo que es lo que e hecho:

_me e dado cuenta que si queria subconjuntos de 2 elementos por ejemplo, esos subconjuntos ivan a estar "incluidos" en la totalidad de pares que se puedan formar con los elementos del conjutno PADRE.
_Si queria subconjuntos de 3 elementos, me di cuenta que esos subconjuntos ivan a estar "incluidos" en todas las ternas posibles a armar con los elemtnos del conjunto padre


asi llegas a la conclusion de que el problema lo puedes dividir en 2:
1) encontrar todos los pares, ternas, cuaternas .... etc (dependiendo del tamaño del subconjunto deseado) posibles a armar con los elementos del conjunto PADRE

2) del resultado de 1), excluir a aquellos que tengan elementos similares, es decir, si tenemos los pares ordenados (1,2) y (2,1) , hablando dentro del marco de pares ordenados, SERIAN DIFERENTES, pero si hablamos de conjuntos {1,2} y {2,1}, SON IGUALES!!!!!!

ya te e dicho todo lo que tenias que saber
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA