piątek, 30 września 2011

Kombinatoryka okiem programisty cz. I


Witam!
Dziś i nie tylko dziś opowiemy sobie o kombinatoryce. Czym jest więc ta kombinatoryka?

Kombinatoryka to teoria obliczania liczby elementów zbiorów skończonych. Powstała dzięki grom hazardowym, a swój rozwój zawdzięcza rachunkowi prawdopodobieństwa, teorii grafów, teorii informacji i innym działom matematyki stosowanej. Stanowi jeden z działów matematyki dyskretnej.

Dla programistów stanowi rzecz równie ważną co algorytmika czy teoria grafów.
Mówiąc w skrócie kombinatoryka zajmuję się zbiorem wyrażeń uporządkowanym. Przykładów zastosowania kombinatoryki jest sporo zwłaszcza w wymienionych powyżej dziedzinach. Opłaca się znać choć jej podstawy by móc powiedzieć ile np. jest możliwych kombinacji liczb w Dużym Lotku. A więc zaczynajmy!
Przykłady będę podawał w 2 językach: Pythonie oraz Haskell'u.
0. Silnia
Ten rozdział jest niejako przypomnieniem czym jest podstawowa funkcja kombinatoryki czyli silna.
Silnią n! liczby naturalnej n nazywamy iloczyn 1 * 2 * 3 * ... * n, gdzie zakłada się, że 1! =1 i 0! = 1.
Czyli na przykład silnią n równemu 4 jest 24, bo:
4! = 1 * 2 * 3 * 4 = 24
1. Rozmieszczenia(wariacje)
Rozmieszczeniami z n elementów po k nazywamy ciągi k-wyrazowe, w których każdej z liczb 1, 2, ..., k odpowiada jeden z n danych przedmiotów. Rozmieszczenia te mogą się różnić bądź elementami, bądź przypadkiem elementów.
Na przykład rozmieszczenia z trzech elementów a, b ,c po 2: ab, ac, bc, ba, ca, cb.
Ilość wszystkich rozmieszczeń z n różnych elementów po k wyraża się wzorem:


Np:

Kod w Haskell'u:
-- Funkcja Silnia
silnia::Int ->Int
silnia 0 = 1
silnia n = n * silina (n-1)
-- Funkcja V
v::Int -> Int -> Int
v k n = silnia(n) / silnia(n-k)
Kod w Python'ie:
def silnia(n):
 return init(reduce(lambda x,y: x*y, range(2, n+1) or [1]))
def v(k,n):
 return silnia(n) / silnia(n-k)
Wiemy jak obliczać ilość możliwych kombinacji, ale bardziej interesujące wydaję się jak je tworzyć.
C.D.N.
2. Permutacje
Permutacjami z n elementów nazywamy ciągi n-wyrazowe, w których każdej z liczb 1,2,...,n odpowiada jeden z n danych przedmiotów. Permutacje różnią się tylko porządkiem elementów. Na przykład permutacje z trzech elementów a, b, c: abc, bca, cab, cba, bac, acb. Ilość wszystkich permutacji z n różnych elementów wyznacza się wzorem:
Jeżeli wśród n elementów a, b, c, ... znajdują się jednakowe elementy:
a występuje α, b występuje  β razy, c występuje γ razy itd., to:


11 komentarzy:

  1. blogger nie rozmywa obrazków :)

    OdpowiedzUsuń
  2. chyba jednak rozmywa... no cóż...

    OdpowiedzUsuń
  3. Wklej testowo to Ci udowodnie że nie.

    I mógłbyś wstawić kod w c/c++ ponieważ to bardzo popularne języki które również opanowałeś. Ja np. nie znam ani pythona i haskella więc jestem poszkodowany! I myśle że nie jestem sam.

    OdpowiedzUsuń
  4. ok, ok.

    Nie rozmywa, tylko te png ma zamiast tła kanał alfa. Czyli wokół czarnych napisów jest przezroczystość. Biorąc pod uwagę kolorystyke Twojego bloga ta przeźroczystość sprawia że tłem jest czarność. Napisy też są czarne więc mało widać.

    OdpowiedzUsuń
  5. proof-of-concept :)

    http://adwi32.blogspot.com/2011/10/blog-post.html

    OdpowiedzUsuń
  6. dzięki ale głównie siedziałem na Linuksie a tam porządnego konwertera akurat nie miałem :)

    OdpowiedzUsuń
  7. myśle że to może być jakikolwiek edytor grafiki z możliwością zapisania do bmp. Ja to zrobiłem ms paintem, czy naprawde linux nie ma lepszych narzędzi :D ?

    OdpowiedzUsuń
  8. A co z kodem w c/c++ ?

    Mógłbyś zrobić ukłon w strone większości Twoich czytelników :)

    OdpowiedzUsuń
  9. Czy ja wiem z tym C?
    Nie wiem czego w tym kawałku kodu można nie zrozumieć, no może po za tym obliczaniem silni ale jak ktoś się zastanowi to zrozumie.Najważniejsze rzeczy postaram się tłumaczyć aczkolwiek liczę na pewne ogarnięcie tematu.

    OdpowiedzUsuń
  10. no narazie tak, ale mam nadzieje że zamieścisz tu coś bardziej skomplikowanego ;)

    OdpowiedzUsuń

Popularne posty