algoritmo per creare tutti i possibili vettori di colonna di dimensione N contenenti solo uno e zero [chiuso]

0

Sono uno studente di matematica e sto appena iniziando a conoscere la programmazione. Sono bloccato su un particolare programma che sto cercando di scrivere per divertimento. Voglio trovare un algoritmo per creare tutti i possibili vettori di colonna di dimensione N contenenti solo uno e zero e combinarli in una matrice di grandi dimensioni mettendo tutte le colonne una dopo l'altra. L'ordine delle colonne non ha importanza. Ad esempio se N = 3 voglio ottenere la matrice:

0 1 1 1 1 0 0 0
0 0 1 0 1 1 1 0
0 0 0 1 1 0 1 1

che contiene in verticale tutte le combinazioni possibili di uno e zero della lunghezza 3. Qualcuno ha qualche idea su come farlo? Non sto necessariamente cercando un modo molto efficiente o intelligente per farlo perché il valore che userò per N è 14, quindi la mia matrice sarà 14 x 2 ^ 14 che è 14 x 16384 che non è troppo grande. Inoltre, mi dispiace per la formattazione della mia domanda, sono abituato allo stackexchange matematico in cui è possibile utilizzare il testo LaTeX per rendere le vostre matrici ed equazioni un aspetto gradevole. Grazie a tutti quelli che mi possono aiutare!

    
posta Slugger 13.04.2013 - 19:50
fonte

3 risposte

5

Nel tuo esempio stai semplicemente annotando tutti i numeri da 0 a 7 = 2 ^ 3 in forma binaria (le colonne della tua matrice). Quindi, per un matematico, la generalizzazione per il caso generale dovrebbe essere ovvia. Avrai bisogno di avere grande int a tuo vantaggio per perseguire quell'idea, però. Quale non dovrebbe essere davvero un problema, però.

    
risposta data 13.04.2013 - 19:58
fonte
2

Ti ho scritto un rapido esempio di uno script di shell che avrebbe fatto una cosa simile in Python. Ovviamente potresti renderlo più veloce usando un c (o un approccio di programmazione diverso) ma non è questo il mio punto.

# Size of n
n = 3
# Total possibilities
p = 2**n
# This creates a set of binary numbers
x=0
bnum=[]
bitem=1
while x < n:
  bnum.insert(0,bitem)
  bitem = bitem*2
  x = x +1

# Print the set of binary number to the screen  
print 'bin set', bnum
pset = range(p)
print 'total possibilities = %i' %p

# Function to covert to binary numbers
def convbin(num):
  modc = num
  x=0
  binset = []
  while x < n:
    mod = modc%bnum[x]
    if modc == mod :
      binset.append(0)
    elif mod == 0:
      binset.append(1)
    else:
      binset.append(1)
    modc = mod
    x = x+1
  print binset

# Call function
for item in pset:
  convbin(item)

L'output sarebbe:

bin set [4, 2, 1]
total possibilities = 8
[0, 0, 0]
[0, 0, 1]
[0, 1, 0]
[0, 1, 1]
[1, 0, 0]
[1, 0, 1]
[1, 1, 0]
[1, 1, 1]
    
risposta data 14.04.2013 - 15:51
fonte
1

Le altre due risposte (finora) sono buone, ma penso che sia interessante sottolineare la natura ricorsiva del problema. Se vuoi generare tutti i valori binari fino a 2 n -1 per alcuni n, puoi iniziare scrivendo i valori per n = 1, cioè annota solo le cifre possibili:

0 1                                     n=1

Successivamente, copia questi valori e aggiungi ciascuna delle cifre possibili a ciascuna copia:

0 0 1 1                                 n=2
0 1 0 1

Ripeti se necessario:

0 0 0 0 1 1 1 1                         n=3
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1

0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1         n=4
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

Puoi vedere che un modo semplice per generare tutte le combinazioni è scrivere la prima riga stampando 2 n-1 0 seguito da 2 n-1 1 , ripetuto 2 0 volte. La riga successiva ottiene 2 n-2 0 seguita da 2 n-2 1 , ripetuti 2 1 volte e così via.

    
risposta data 14.04.2013 - 17:45
fonte

Leggi altre domande sui tag