Quali sono le buone formule matematiche da conoscere per la programmazione? [chiuso]


19

Quali sono alcune formule matematiche piuttosto comuni che hai imparato che ti hanno aiutato a scrivere algoritmi migliori e diventare un programmatore migliore?

Esempio: ho imparato a conoscere la formula della distanza ecludiana: sqrt((x1-x2)^2+(y1-y2)^2)che mi ha aiutato a capire come trovare oggetti simili confrontando 2 fattori.


2
Non penso che sia la formula della distanza euclidea.
Greg Hewgill,

@Larry @Greg modificato.
GSto

haha che ne dici della sequenza fibo ... buono per il benchmarking
aggietech

1
Data di completamento = (Data stimata + Numero di giorni rimasti / 2) ^ (Tempo di lavoro / Tempo a casa) * Numero di pizze gratuite
Skizz

7
potresti trovare interessante sapere che se devi solo confrontare le distanze, puoi saltare il sqrtpassaggio. Per un circuito interno stretto, potrebbe importare.

Risposte:


16

Conoscere i poteri di 2 è utile, soprattutto quando si tratta di operazioni bit per bit di basso livello.


+1 - Essere in grado di convertire da e verso le basi 2, 16, 10 e 8 è un must.
mouviciel,

2
Non sono sicuro di base-8, ma sono d'accordo con 2,16 e 10 conversioni. Dovresti essere in grado di farlo in un lasso di tempo ragionevole, ma non necessariamente all'istante.
Incognito,

Il mio unico insegnante è un esagono. Si converte in numeri ridicoli e io sono stato un TA per lui per circa un anno, la classe è sempre stata colpita come lo ero io.
Chris,

Odio la base 8 :)

1
Con macro, enumerazioni e bitfield nelle lingue moderne, in quali casi le persone hanno bisogno di conoscere i poteri di 2, che sono numeri fondamentalmente magici .. setsockopt(...SO_KEEPALIVE..)è molto più facile da leggere o scrivere disetsockopt(...16...)
JBRWilkinson

15

L'algebra booleana era già stata menzionata, ma volevo fornire alcuni esempi pratici.

L'algebra booleana è molto utile quando si lavora con espressioni booleane complesse ( ifad esempio in dichiarazioni).

Associa espressioni e leggi utili:

distributività

A & (B | C) = (A & B) | (AC)

A | (B & C) = (A | B) & (A | C)

Quindi la prossima volta ti imbatti in tale espressione:

if((A || B) && (A || C) && (A || D) && (A || E)) { ... }

Puoi ridurlo facilmente a:

if(A || (B && C && D && E)) { ... }

Negazione e legge di De Morgan

! (! A) = A

! (A & B) =! A | ! B

! (A | B) =! A &! B

Diciamo che hai una simile affermazione:

if(!A && !B && !C) {..}

e devi costruirne l'opposto. scrittura:

if(!(!A && !B && !C)) {...}

funzionerebbe, ma non sembra bello come questo equivalente:

if(A | B | C) {...}

2
Il problema con questo, è se si tratta di regole di business reali, poiché quelle hanno la tendenza a CAMBIARE. In tal caso, è necessario ricostruire l'espressione originale per modificarla e quindi ottimizzarla di nuovo. I manutentori tendono a lamentarsi mentre lo fanno.

Ed è qui che una mappa di Karnaugh può aiutare. Funziona bene solo con un massimo di 4 flag booleani contemporaneamente, ma se hai bisogno di più, buona fortuna!
Giobbe

3
+1 per la legge di De Morgan. Sono sorpreso da come poche persone sembrano averlo insegnato e sanno come applicarlo.
Fortyrunner,

Si è dimenticato questo: (P -> Q) <=> (!P | Q). Lo uso sempre poiché pochissimi ambienti offrono un operatore di implicazioni logiche, questa è un'equivalenza molto utile per i vincoli di SQL CHECK.
mu è troppo corto il

La legge di Karnaugh e De Morgan è qualcosa che di solito ti viene insegnato a usare nelle lezioni di ingegneria elettrica ma non nelle lezioni di ingegneria informatica. Il che è strano, perché in quest'ultimo si possono trovare applicazioni come l'uso pratico della legge di De Morgan sopra menzionata.
Spoike,

9

Nella mia esperienza, le formule matematiche sono utilizzate per calcoli molto specifici, che possono o meno essere applicati al tuo progetto.

Se devi calcolare qualcosa, di solito c'è una funzione in una libreria o un codice sorgente di esempio che può calcolarlo per te. Ad esempio, la funzione PMT () di Excel, che calcola i pagamenti necessari per rimborsare un debito all'X% su periodi Y. Vuoi davvero sapere come lo calcola o è sufficiente chiamare quello integrato?

Negli ultimi 10 anni, non credo di aver bisogno di usare qualcosa della libreria Math diverso da Ceil (), Min () e Max (), il che dimostra che anche se i computer sono stati ideati per risolvere problemi basati sulla matematica , l'uso comune oggi è il processo decisionale attorno al flusso di dati.

Prendi, ad esempio, Facebook, che ha una grande quantità di codice. Probabilmente c'è un po 'di matematica lì dentro da qualche parte, ma sospetto principalmente nell'API Crypto, che è probabilmente una libreria di sistema. Ma l'accesso al database, le decisioni di autorizzazione, la creazione di pagine e il routing delle informazioni probabilmente non usano molta matematica.

Sì, ci sono mercati che richiedono molta matematica - finanza, fisica, ingegneria - ma in questi settori è più probabile che la tua disciplina primaria sia matematica / economia, fisica, ingegneria, ecc., Quindi le tue domande sarebbero "come posso scrivere formula f (x) nella lingua Y? '

Un migliore utilizzo del tuo tempo, IMO, sarebbe quello di indagare su algoritmi (compresa la notazione O grande) e Pattern di progettazione.


1
+1 perché sembra un'affermazione ragionevole: non esiste una formula specifica che dovresti conoscere, ma il concetto di complessità algoritmica (notazione O grande) è molto importante.
Michael H.

Un sacco di matematica ... decide quali annunci infastidire.

Sono d'accordo sul fatto che la quantità di matematica necessaria è generalmente piuttosto bassa anche se la mia esperienza non è così bassa come la tua - finisco periodicamente usando roba trigma nella grafica.
Loren Pechtel,

7

Non esiste una formula che possa renderti un programmatore migliore.

Le competenze matematiche possono renderti un programmatore migliore:

  • Metodo scientifico - modo di pensare la matematica / scienza e risoluzione dei problemi
  • Astrazione - capacità di riconoscere astrazioni e schemi
  • Ereditarietà - riutilizzo di lavori / metodi esistenti per risolvere nuovi problemi
  • Esperienza : comprensione di una serie di problemi e soluzioni

-1, l'uomo ha chiesto utili FORMULE MATH. Non riesco a credere che questa risposta sia stata completamente votata.
Jas


6

Vorrei menzionare le serie di Taylor che sono molto utili per ottenere rapide approssimazioni di funzioni "più pesanti". Ad esempio sin(x)circa 0 può essere approssimato con x-(x*x*x/6).

In generale, l'idea che ci siano modi intelligenti per approssimare rapidamente le cose, invece di calcolarle all'ultima cifra significativa (sebbene per le funzioni elementari, la maggior parte dei processori moderni contenga implementazioni cablate veloci, quindi usare Taylor per approssimare il peccato potrebbe non essere così significativo guadagno di velocità).


3

Le leggi di De Morgan, sulla trasformazione del booleano "e" e "o" relative alle negazioni, e alcune relative notizie più elementari sulla logica booleana (come la doppia negazione).


2

Regola di tre (tipo di moltiplicazione incrociata)

+1 per le formule statistiche di base.

Ho visto molti ragazzi con difficoltà ad applicare questa semplice regola sul codice di base.


+1 per la moltiplicazione incrociata. In alcuni software che sono soggetti a problemi di overflow di numeri interi, la moltiplicazione incrociata viene utilizzata per verificare che i risultati non superino.
rwong,

2
Non un grande affare. Questo dovrebbe essere radicato nella testa di un diplomato che desidera studiare CS.
Giobbe

@Job: in un mondo teorico, questo è vero!
Pagotti,


2

Legge dei Coseni , molto importante per molti problemi geometrici,

testo alternativo

in particolare la determinazione dell'angolo.


che cos'è la gamma in quell'equazione?
Matt Ellen,

1
@Matt Ellen: l'angolo del lato attraverso il lato C (IOW, l'angolo tra A e B)
Lie Ryan

2
E ovviamente, caso speciale per i triangoli retti:a^2 + b^2 = c^2
Nota per se stessi - pensa a un nome il

2

La programmazione è un campo molto ampio. La formula matematica dipende dall'area di programmazione in cui ti trovi. Se sei interessato alla grafica, alla programmazione di gioco devi conoscere più trigonometria, geometria. La programmazione del gioco può essere ulteriormente classificata in aree come fisica, rendering, shader .. e l'elenco potrebbe continuare. Quindi, se sei un esperto di simulazione fisica, dovresti conoscere le cose relative alla fisica.
Se sei in sicurezza, devi essere un esperto di teoria dei numeri.
In generale, puoi scegliere una combinazione di questi e qualunque sia il tuo interesse. L'apprendimento non fa mai male.


2

Metodi di prova

In particolare, quelli che ho usato con frequenza relativa:

Ce ne sono altri, e ne ho usati molti in un punto o nell'altro, ma questi sono i 3 che posso ricordare di aver usato a colpo d'occhio. Sono anche infinitamente utili se riesci a tenere a mente le loro intenzioni durante la scrittura di test di unità o di integrazione.


2

T (n) = aT (n / b) + f (n), a> = 1, b> 1

Il Teorema del Maestro è buono a sapersi per la programmazione. Ti consente di risolvere le relazioni di ricorrenza che possono aiutarti a trovare la complessità degli algoritmi ricorsivi. Ciò è particolarmente importante quando si scrive un algoritmo di stile "divide and conquer". In parole povere, puoi usare il teorema principale per ottenere la complessità se conosci la complessità di ogni "passo" e il fattore di ramificazione.


1
perché è bello sapere per la programmazione?
Matt Ellen,

@MattEllen: ti consente di risolvere le relazioni di ricorrenza che possono aiutarti a trovare la complessità degli algoritmi ricorsivi. Ciò è particolarmente importante quando si scrive un algoritmo di stile "divide and conquer". In parole povere, puoi usare il teorema principale per ottenere la complessità se conosci la complessità di ogni "passo" e il fattore di ramificazione.
Tikhon Jelvis,

1
  • algebra
  • trigonometria
  • vettore (operazioni a matrice)
  • calcolo
  • [varie interpolazioni e loro derivati]
  • [superfici, NURBS]

(quelli tra parentesi sono più di un tipo "applicato")

È difficile dare indicazioni generali, poiché dipende fortemente dal campo in cui ti trovi. Ma quanto sopra copre le basi di parecchi gradi di ingegneria. Intendiamoci, queste categorie spesso si sovrappongono (trigonometria + operazioni a matrice, calcolo + operazioni a matrice, e così via).

Ho sempre un manuale matematico vicino. Spesso non si è sicuri di qualcosa e aiuta a presentarlo in modo organizzato.


1

Conoscere l'algebra booleana aiuta molto. Ti impedisce di scrivere codice come

if (x < 10)
    return true;
else
    return false;

Non sono del tutto sicuro di capire come l'algebra booleana aiuti a impedire a un utente di scriverlo? Puoi proporre ciò che l'utente dovrebbe scrivere lì? (Suppongo che restituisca x <10; ma potrei sbagliarmi.)
Chris,

1
Hai ragione - dovrebbe essere return x <10. Pensare in questo modo. La valutazione (x <10) restituirà un risultato booleano. L'istruzione if viene quindi suddivisa in [se x è effettivamente inferiore a 10] if (true) restituisce true; oppure [se x è maggiore o uguale a 10] if (false) ... else return false;
Eric Olsson,

2
(X <10) potrebbe separare due casi aziendali. Con il modulo dettagliato, puoi fare molto di più che restituire valori, il che in modalità manutenzione è molto bello, poiché puoi mantenere le modifiche al minimo

1

Per problemi di ottimizzazione, è bene comprendere la probabilità di log. Ad esempio, se stai cercando di ridurre al minimo una somma di quadrati, è lo stesso che massimizzare il registro della probabilità, perché (in parole povere)

log( Product( exp( -(x[i]-mean)^2 )) )
  =
  - Sum( (x[i]-mean)^2 )

Altri favoriti nel regno del tuning delle prestazioni sono le distribuzioni Binomial e Beta. Sono molto semplici da calcolare.

Se prendi 10 campioni a tempo casuale dello stato di un programma, ed è in una certa condizione per F = 40% del tempo, allora è proprio come un esperimento di lancio di una moneta con una moneta ingiusta. Il numero di volte che lo vedrai in quella condizione è una distribuzione binomiale con media 10 * 0.4 = 4 e deviazione standard di sqrt (10 * 0.4 * 0.6) = sqrt (2.4) = 1.55.

D'altra parte, se prendi 10 campioni e ti capita di vederlo in quella condizione su 4 campioni, cosa ti dice di quanto sia grande la F? I possibili risultati sono 0, 1, 2, 3, 4, ..., 9, 10. Sono 11 possibilità e la possibilità che hai visto (4) è la quinta. Quindi, prendi 11 numeri casuali uniformi (0,1) e ordinali. La distribuzione della quinta è la distribuzione di F, una distribuzione Beta. La sua modalità è 4/10. La sua media è 5/11. La sua varianza è 5 * 6 / (11 ^ 2 * 12) = 0,021 e deviazione standard = 0,144.

Molte persone pensano che siano necessari numerosi campioni per individuare i problemi di prestazioni del software ed evitare di trovare falsi. Queste distribuzioni mostrano che un piccolo numero di campioni può rivelare molto sul loro costo.


0

Potrebbe essere un po 'semplice, ma G=(V,E)è una buona idea da tenere a mente. In altre parole, un grafico è un insieme di vertici e spigoli. I grafici sono così utili per rappresentare molte cose.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.