Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - elementi in comune tra n colonne di una matrice
Forum - Algoritmi - elementi in comune tra n colonne di una matrice - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
MrC (Member)
Newbie


Messaggi: 19
Iscritto: 28/11/2009

Segnala al moderatore
Postato alle 16:13
Mercoledì, 02/12/2009
Hai già la risposta:

tutte le permutazioni

e

Se ti serve sapere tutti gli elementi uguali a 1 in tutte le righe ti basta un bel AND

01010010 AND
01010101 AND
11110000 AND
------------
01010000

PM Quote
Avatar
mikemuntain (Normal User)
Newbie


Messaggi: 7
Iscritto: 28/11/2009

Segnala al moderatore
Postato alle 18:23
Mercoledì, 02/12/2009
Testo quotato

Postato originariamente da MrC:

Hai già la risposta:

tutte le permutazioni

e

Se ti serve sapere tutti gli elementi uguali a 1 in tutte le righe ti basta un bel AND

01010010 AND
01010101 AND
11110000 AND
------------
01010000



ok perfetto ai ragione ma mi potresti aiutare  nella costruzione di un algoritmo che fa quello che ai detto in automatico nel senso l'utente gli passa da input la matrice, ed n
e poi crea tutte le combinazioni di n righe le mette in and, e dalla risultato dell'operazione and vede quanti 1 ha.
spero in una tua risposta perchè sei l'unico che è stato in grado di darmi una mano

PM Quote
Avatar
MrC (Member)
Newbie


Messaggi: 19
Iscritto: 28/11/2009

Segnala al moderatore
Postato alle 21:42
Mercoledì, 02/12/2009
Con questo ottieni tutte le combinazioni degli elementi di un vettore.
Per te gli elementi del vettore sono dei vettori (righe matrice).


void permuta( int vect[], int i, int j )
{

    //Se vuoi risparmiare una variabile fai a = a XOR b; b = a XOR b; a = a XOR b;

    int tmp=vect;

    vect=vect[j];

    vect[j]=tmp;
}

void combinazioni( int vect[], int i, int size_vect )
{
    int j;

    if ( i==size_vect )
    {
        for ( i=0;i<size_vect;i++ )
            printf( "%d",vect );
    }

    else
        for ( j=i;j<size_vect;j++ )
        {
            permuta( vect,i,j );
            combinazioni( vect,i+1,size_vect );
            permuta( vect,i,j );
        }
}


Dopo basta fare un AND (&) di ogni elemento di ogni riga e assegnarlo ad una variabile.

Infine per contare gli 1 di questa variabile basta fare

tot_1_bit = 0;
for( i=0; i<log2(NUMERO); i++)
tot_1_bit += ( NUMERO >> i ) & 1 ;


Se poi vuoi ottenere il massimo

static int max = 0;
if( tot_1_bit > max )
max = tot_1_bit;

:D

PM Quote
Avatar
mikemuntain (Normal User)
Newbie


Messaggi: 7
Iscritto: 28/11/2009

Segnala al moderatore
Postato alle 12:30
Giovedì, 03/12/2009
Testo quotato

Postato originariamente da MrC:

Con questo ottieni tutte le combinazioni degli elementi di un vettore.
Per te gli elementi del vettore sono dei vettori (righe matrice).


void permuta( int vect[], int i, int j )
{

    //Se vuoi risparmiare una variabile fai a = a XOR b; b = a XOR b; a = a XOR b;

    int tmp=vect;

    vect=vect[j];

    vect[j]=tmp;
}

void combinazioni( int vect[], int i, int size_vect )
{
    int j;

    if ( i==size_vect )
    {
        for ( i=0;i<size_vect;i++ )
            printf( "%d",vect );
    }

    else
        for ( j=i;j<size_vect;j++ )
        {
            permuta( vect,i,j );
            combinazioni( vect,i+1,size_vect );
            permuta( vect,i,j );
        }
}


Dopo basta fare un AND (&) di ogni elemento di ogni riga e assegnarlo ad una variabile.

Infine per contare gli 1 di questa variabile basta fare

tot_1_bit = 0;
for( i=0; i<log2(NUMERO); i++)
tot_1_bit += ( NUMERO >> i ) & 1 ;


Se poi vuoi ottenere il massimo

static int max = 0;
if( tot_1_bit > max )
max = tot_1_bit;

:D



ma l'algoritmo che mi hai dato non le combinazioni dei vettori di una matrice, e poi per il vettore  fa anche le combinazioni con duplicati ed io non voglio duplicati, e poi cosa intendi per //Se vuoi risparmiare una variabile fai a = a XOR b; b = a XOR b; a = a XOR b; su che cosa lo devo fare:k:

PM Quote
Avatar
MrC (Member)
Newbie


Messaggi: 19
Iscritto: 28/11/2009

Segnala al moderatore
Postato alle 19:39
Giovedì, 03/12/2009
Infatti questo è un esempio... non posso farti il programma :rofl:

scambiare 2 varibili senza una variabile d'appoggio:

a = 1 // 0..0001
b = 2 // 0..0010

a ^= b // a = 0..0011
b ^= a // b = 0..0001 (ex a)
a ^= b // a = 0..0010 (ex b)

PM Quote
Avatar
MrC (Member)
Newbie


Messaggi: 19
Iscritto: 28/11/2009

Segnala al moderatore
Postato alle 22:02
Venerdì, 29/01/2010
CMQ una cosa semplice per le combianzioni l'avevo fatta, ma mi sono sempre scordato di postarla 8-|

Spero possa essere utile anche ai posteri ( forse in rete c'è di meglio ) :rofl:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4.  
  5. char *buf;
  6. unsigned long int flevel = 0;
  7. unsigned long int vsize = 0;
  8.  
  9. void combine( const char v[], unsigned long int s, unsigned long int k)
  10. {
  11.   if( flevel==0 ){
  12.     if( (k > vsize) || (k == 0) || (vsize == 0) ){
  13.        printf("\nCan't combine %lu object in group of %lu.",vsize,k);
  14.        return;
  15.     }
  16.     s = 0;
  17.     buf = (char *)malloc(sizeof(char)*k);
  18.   }
  19.  
  20.   flevel++;
  21.  
  22.   int i = s;
  23.   if( k != vsize )
  24.   {
  25.     for(;i<k;i++){
  26.       buf[flevel-1] = v[i];
  27.       combine( v, i+1 , k+1 );
  28.     }
  29.   }
  30.   else
  31.   {
  32.     for(;i<k;i++)
  33.     {
  34.       printf("\n");
  35.       int g=0;
  36.       for(;g<(flevel-1);g++)
  37.         printf("%c",buf[g]);
  38.  
  39.       printf("%c",v[i]);
  40.     }
  41.   }
  42.  
  43.   flevel--;
  44.   if( flevel == 0 )
  45.     free( buf );
  46. }
  47.  
  48. double fatt( unsigned long int n ){
  49.  
  50.   double ret = n;
  51.  
  52.   while( (--n) > 1 )
  53.     ret *= n;
  54.  
  55.   return ret;
  56. }
  57.  
  58. double n_su_k( unsigned long int n, unsigned long int k )
  59. {
  60.   if( k > n )
  61.     return 0;
  62.  
  63.   if( (n==0) || (k==0) )
  64.     return 1;
  65.  
  66.   if( n == k )
  67.     return 1;
  68.  
  69.   return fatt(n)/(fatt(k)*fatt(n-k));
  70. }
  71.  
  72. int main( int argc, char *argv[])
  73. {
  74.  
  75.   if( argc < 3 ){
  76.     printf("Usage: %s string_to_combine groups_length",argv[1]);
  77.     return;
  78.   }
  79.  
  80.   vsize = strlen( argv[1] );
  81.   unsigned long int k = atol( argv[2] );
  82.  
  83.   if( k > vsize ){
  84.     printf("\nCan't combine %lu object in group of %lu.",vsize,k);
  85.     return;
  86.   }
  87.  
  88.   unsigned long int kcomb = 1 + vsize - k;
  89.  
  90.   printf("\n---------------------");
  91.   combine( argv[1], 0, kcomb );
  92.   printf("\n---------------------\n");
  93.  
  94.   printf("Total number (%lu on %lu) = %.0lf\n\n",vsize,k,n_su_k(vsize,k));
  95. }


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo