Forum www.zinfa.fora.pl Strona Główna
FAQ Szukaj Użytkownicy Grupy Profil Zaloguj się, by sprawdzić wiadomości
Forum www.zinfa.fora.pl Strona Główna  Zaloguj  Rejestracja
algorytmy kombinatoryczne
Idź do strony Poprzedni  1, 2, 3
 
Napisz nowy temat   Odpowiedz do tematu    Forum www.zinfa.fora.pl Strona Główna -> Rok IV / Opracowania, pomoce IV
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Nie 11:41, 12 Cze 2011    Temat postu:

http://www.youtube.com/watch?v=hb4lg4Iw1qA

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
nadroj




Dołączył: 23 Paź 2010
Posty: 14
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysłany: Nie 11:56, 12 Cze 2011    Temat postu:

Algorytm rank w Pythonie

Kod:

#!/usr/bin/env python
## -*- coding: utf-8 -*-

# Tomasz Nowacki

# permutacje - rank

def silnia(n):
    if n > 1:
        return n * silnia(n-1)
    else:
        return 1

def rank(P, n):
    if n < 1:
        raise ValueError('n musi byc > 1')
    if n > 1:
        PP = []
        for i in xrange(0, len(P)-1):
            if P[i+1] > P[0]:
                PP = PP + [P[i+1]-1]
            else:
                PP = PP + [P[i+1]]
        return (P[0]-1)*silnia(n-1) + rank(PP, n-1)
    return 0

def main():
    try:
        n = int(raw_input('Podaj n: '))
        P = raw_input('Podaj liste P: ')
        if not isinstance(eval(P), list):
            raise ValueError('P musi byc lista postaci [val1, val2, ...]')
        P = eval(P)
        print 'Rank listy %s wynosi %s' % (P, rank(P, n))
    except ValueError, e:
        print e


if __name__ == '__main__':
    main()



Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
armo




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 10:53, 18 Cze 2011    Temat postu: Stirlinga 2 rodzaju

Kod:


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package zwspui1zad20110618zad1stirlinga2rodzajudynamicznie;

/**
 *
 * @author amanko
 */
public class Stirlinga2RodzajuDynamicznie {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int k = 6; // długośc ciągów
        int n = 3; // maksymalna wartość elementu ciągu

        if(args.length!=2){
            System.err.println("Powinny byc dokładnie dwa argumenty - liczby całkowite");
            System.exit(1);
        }
        try{
            n = Integer.parseInt(args[0]) ;
            k = Integer.parseInt(args[1]) ;
        }catch(IndexOutOfBoundsException e){
            System.err.println("Powinny być dwa argumenty - liczby całkowite");
            System.err.println("Argumenty: k n");
        }catch(NumberFormatException e){
            System.err.println("Argumenty powinny być liczbami całkowitymi");
            System.err.println("Argumenty: k n");
        }
        //int ciag[] = new int[k]; // kolejny ciąg do drukowania
        S(n,k);
    }

    static void S(int n, int k){
        long tabS[][]  = new long[n+1][k+1];
        tabS[0][0]=1;
        // w javie tablice inicjowane są zerami
        //S(n,k)=0 gdy n<k
        //S(n,0)=0 gdy N>0
            for(int k1 = 1 ; k1 <= k ; k1++ )
        for(int n1 = 1 ; n1 <= n ; n1++ )
                tabS[n1][k1]=tabS[n1-1][k1-1]+tabS[n1-1][k1]*k1;
        System.out.println(tabS[n][k]);
    }

}




Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
armo




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 11:55, 18 Cze 2011    Temat postu: Podział-RGF

Kod:


/*
 program akceptuje parametry z linii komend np 4 3 { 1 } { 2 , 4 } { 3 }
 * program ma funckje, która jako argumenty ma n, k oraz wektor wektorów, z czego każdy podwektor zawiera wszystkie elementy kolejnego bloku
 * wynikiem jest także wektor ale liczb całkowitych oznaczającyhc f_j
 */

package zwspui1zad20110618zad2podzial2rgf;

import java.util.Arrays;

/**
 *
 * @author amanko
 */
public class Podzial2RGF {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        /* przykład statyczny
        int[][] B_ = new int[3][];
        B_[0]=new int[]{1};
        B_[1]=new int[]{2,4};
        B_[2]=new int[]{3};
        System.out.print(Arrays.toString(podzial2rgf(4, 3, B_)));
        */

        int n=-1;
        int k=-1;
        try{
            n = Integer.parseInt(args[0]) ;
            k = Integer.parseInt(args[1]) ;
            int[][] B = new int[k][];
            int argn = 2 ;
            for(int i=0;i<k;i++){
                if( !args[argn].equals("{") ){
                    System.err.println("Powinny być argumenty - dwa pierwsze to liczby całkowite, potem ODZIELONE SPACJAMI ZBIORY NP 4 3 { 1 } { 2 , 4 } { 3 }");
                    System.exit(1);
                }
                argn++;
                int ile = 1;
                for(int j=argn+1; args[j].equals(","); j+=2)
                    ile++;
                B[i] = new int[ile];
                for( int j=0; j<ile; j++ ){
                    B[i][j]=Integer.parseInt(args[argn]);
                    argn+=2;
                }
            }
            System.out.print(Arrays.toString(podzial2rgf(n, k, B)));
        }catch(IndexOutOfBoundsException e){
            System.err.println("Powinny być argumenty - dwa pierwsze to liczby całkowite, potem ODZIELONE SPACJAMI ZBIORY NP 4 3 { 1 } { 2 , 4 } { 3 }");
        }catch(NumberFormatException e){
            System.err.println("Powinny być argumenty - dwa pierwsze to liczby całkowite, potem ODZIELONE SPACJAMI ZBIORY NP 4 3 { 1 } { 2 , 4 } { 3 }");
        }
    }

    /**
     *
     * @param n - ilośc elementów w podziale
     * @param k - ilość podzbiorów czyli ilośc bloków B_h
     * @param B - wektor wektorów, wektor B[h] zawiera wektor wszystkich elementów należących do B_h
     * @return
     */
    public static int[] podzial2rgf(int n,int k,int[][] B){
        int[] wynik = new int[n]; // inicjowane zerami przez jave
        int j = 1 ;
        for(int i = 1; i<=k; i++){
            // indeksy są zmniejszane bo tablice zaczynam od 0
            while(wynik[j-1]!=0)
                j++;
            int h = 1 ;
            // indeksy są zmniejszane bo tablice zaczynam od 0
            while(!nalezydoB(j, B[h-1]))
                h++;
            // dla każdego g należącego do tablicy jednowymiarowej czyli do zbioru B_h
            // indeksy są zmniejszane bo tablice zaczynam od 0
            for (int g : B[h-1]) {
                // indeksy są zmniejszane bo tablice zaczynam od 0
                // ale wartości wynikowe sa prawidłowe nie zmniejszone
                wynik[g-1]=h;
            }
        }
        return wynik;
    }

    static boolean nalezydoB(int j, int[] Bh){
        boolean wynik = false;
        for(int i=0;(!wynik) && (i<Bh.length);i++)
            wynik = (Bh[i]==j) ? true : false;
        return wynik;
    }

}




Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
armo




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 11:56, 18 Cze 2011    Temat postu: RGF-Podział

Kod:


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package zwspui1zad20110618zad2rgf2podzial;

import java.util.ArrayList;
import java.util.Arrays;

/**
 *
 * @author amanko
 */
public class RGF2Podzial {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //System.out.println(Arrays.deepToString(rgf2podzial(new int[]{1,2,3,2})));
        try{
            int[] f = new int[args.length];
            for(int i=0;i<f.length;i++)
                f[i] = Integer.parseInt(args[i]);
            System.out.println(Arrays.deepToString(rgf2podzial(f)));
        }catch(IndexOutOfBoundsException e){
            System.err.println("Powinny być argumenty - kolejne wartości całkowite RGF oddzielone spacjami np 1 2 3 2 ");
        }catch(NumberFormatException e){
            System.err.println("Powinny być argumenty - kolejne wartości całkowite RGF oddzielone spacjami np 1 2 3 2 ");
        }

    }

    static int[][] rgf2podzial(int[] f){
        int n = f.length ;
        int k = 1 ;
        int j ;
        for(j=1 ; j<=n ; j++)
            if(f[j-1]>k)
                k=f[j-1];
        int[][] B = new int[k][];
        Object B2[] ;
        B2 = new Object[k];
        for(int kk = 0 ; kk<k ; kk++)
            B2[kk] = new ArrayList<Integer>();
        for(j=1; j<=n ; j++)
            ((ArrayList<Integer>)(B2[f[j-1]-1])).add(j);
        for(int kk = 0 ; kk<k ; kk++){
            B[kk] = new int[((ArrayList<Integer>)(B2[kk])).size()];
            for(int kkk = 0 ; kkk<((ArrayList<Integer>)(B2[kk])).size(); kkk++)
                B[kk][kkk]=((ArrayList<Integer>)(B2[kk])).get(kkk);
        }
        return B;
    }

}




Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
inatheith




Dołączył: 15 Maj 2011
Posty: 7
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Wschowa

PostWysłany: Sob 14:53, 18 Cze 2011    Temat postu:

Wcześniej wrzuciłem jako osobny post-poprawiam się,
jakby ktoś potrzebował:
Kod:


//S(n,k)

    public static int[][] snk= new int[11][11];

    public static void int_s(){

        for (int sk=0;sk<=10;sk++){
            for (int sn=0;sn<=10;sn++){
                if (sn<sk) {
                    snk[sn][sk]=0;
                }
                else{
                    if (sk==0){
                        if (sn>0) {
                            snk[sn][sk]=0;
                        }
                        else{
                            snk[sn][sk]=1;
                        }
                    }
                    else{
                        snk[sn][sk]=snk[sn-1][sk-1]+sk*snk[sn-1][sk];
                    }
                }
            }
        }
    }



 // zad.2.
     Bloki przechowuja elementy w tablicy dwuwymiarowej B[i][j], gdzie
     i - oznacza numer bloku
     j[0] - ilośc elementów w bloku
     j[n] - n-ty el. bloku, gdzie n<=j[0]
     */
    public static final int d = 10;
    public static int B[][] = new int [d][d];
    public static int F[] =new int[d];


    public static int[] Podzial_RGF (int n,int k, int[][] B1){
        int F1[] =new int[d];
        for (int j=1; j<=n;j++){
            F1[j]=0;
        }
        int j=1;
        for (int i=1; i<=k;i++){
            while(F1[j]!=0){
                j++;
            }
            int h=1;
            while (nienalezy(j,h,B1)) {
                h++;
            }
            for (int g=1; g<B1[h][0]+1;g++){
                F1[B1[h][g]]=h;
            }
        }
        return F1;
    }

    public static boolean nienalezy(int element,int blok,int[][] B2){
        boolean odp=true;
        for (int i=1; i<=B2[blok][0];i++){
            if (B2[blok][i]==element){
                odp=false;
            }           
        }
        return odp;
    }



// zad.3.
        public static int[][] RGF_Podzial (int n,int[] F1){
            int k=1;
            for (int j=1;j<=n;j++){
                if (F[j]>k) {
                    k=F[j];
                }
            }
            int B1[][] = new int [k+1][10];
            B1[0][0]=k;
            for (int i=1;i<=k;i++){
                B1[i][0]=0;
            }
            for (int j=1; j<=n;j++){
                B1[F[j]][0]=B1[F[j]][0]+1;
                B1[F[j]][B1[F[j]][0]]=j;
            }
        return B1;
    }


    public static void main(String[] args) {
//S(n,k)
        System.out.println("S(n,k)");
        int_s();
        System.out.println("snk - S(5,4)"+snk[5][4]+"\n");
        System.out.println("Podział-RGF");
        B[1][0]=1;        B[1][1]=1;
        B[2][0]=2;        B[2][1]=2;        B[2][2]=4;
        B[3][0]=1;        B[3][1]=3;
//Podział-RGF
        F=Podzial_RGF(4,3,B);
        for (int i=1;i<5;i++){
        System.out.print(F[i]+",");
        }
        System.out.println(" ");
//RGF-Podział
        System.out.println("RGF-Podział");
        B=RGF_Podzial(4,F);
        for (int i=1;i<=B[0][0];i++){
            System.out.print("B"+i+"=");
            for(int j=1;j<=B[i][0];j++){
                System.out.print(B[i][j]+",");
            }
            System.out.print("\n");
        }
        System.out.println("koniec");
    }


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 9:31, 25 Cze 2011    Temat postu:

tradycyjnie rozpaczliwa prośba do Artura Smile))

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 10:09, 25 Cze 2011    Temat postu:

Artura zona odpisala wlasnie na sms ze nie zabral telefonu :/ prosba do kogos kto siedzi obok, zeby poprosil go o wrzucenie rozwiazania Smile
THX


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 10:25, 25 Cze 2011    Temat postu:

ma ktos pierwsze?

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
armo




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 10:40, 25 Cze 2011    Temat postu: Rank dla drzew

Kod:

package zwspui1zad20110625;
import java.util.Arrays;
public class RankDrzew {

    /**
     * Działa dla argumentów 4 2 2 3 3 5 5 1
     * Działa dla argumentów 4 6 5 6 5 1 6 2 7 2 2 3
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try{
            if(args.length % 2 == 1){
                throw new IndexOutOfBoundsException("Nieparzysta liczba argumentów");
            }
            int krawedzie[] = new int[args.length];
            for(int i=0;i<args.length;i++)
                krawedzie[i] = Integer.parseInt(args[i]);
            int[] P = Prufer(krawedzie);
            System.out.println("Kod Prufera: " + Arrays.toString(P));
            System.out.println("Rank       = " + Rank(P));
        }catch (IndexOutOfBoundsException e){
            System.err.println("Powinny być argumenty - numery wierzchołków " +
                    "kolejnych krawędzi np 4 6 5 6 5 1 6 2 7 2 2 3");
        }catch(NumberFormatException e){
            System.err.println("Powinny być argumenty - numery wierzchołków "+
                    "kolejnych krawędzi np 4 6 5 6 5 1 6 2 7 2 2 3");
        }

    }

    /**
     *
     * @param krawedzie - tablica z wierzcholkami kolejnych krawedzi
     * @return
     */
    static int[] Prufer(int[] krawedzie){
        int ileWierzcholkow = (krawedzie.length / 2) + 1 ;
        int p[] = new int[ileWierzcholkow-2];
        int[] d = new int[ileWierzcholkow];
        for(int i=0;i<krawedzie.length;i++)
            d[krawedzie[i]-1]++;
        for(int ip=0;ip<p.length;ip++){
            int x=ileWierzcholkow-1;
            while(d[x]!=1)
                x--;
            x++;
            int ix = 0 ;
            for(ix = 0; krawedzie[ix]!=x;)
                ix++;
            int iy = 0 ;
            if(ix%2==1)
                iy = ix-1;
            else
                iy = ix+1;
            int y = krawedzie[iy];
            p[ip]=y;
            d[krawedzie[ix]-1]--;
            d[krawedzie[iy]-1]--;
            krawedzie[ix]=-1;
            krawedzie[iy]=-1;
        }

        return p;
    }

    static long Rank(int p[]){
        int ileWierzcholkow = p.length + 2 ;
        long r = p[0]-1;
        for(int i=1;i<p.length;i++){
            r = r*ileWierzcholkow+p[i]-1;
        }
        return r;
    }

}




Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
armo




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 10:41, 25 Cze 2011    Temat postu: Unrank dla drzew

Kod:



package zwspui1zad20110625unrankdrzew;
import java.util.Arrays;

public class UnrankDrzew {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try{
            int  n = Integer.parseInt(args[0]);
            long r =    Long.parseLong(args[1]);
            int[] L = new int[n-2];
            for(int i=n-3;i>=0;i--){
                L[i] = (int) ((r % n) + 1);
                r = r / n ;
            }
            System.out.println("Kod Prufera: " + Arrays.toString(L));
            System.out.print(  "Krawedzie:   ");
            int[] d = new int[n];
            for(int i=0;i<n;i++)
                d[i]=1;
            for(int i=0;i<L.length;i++)
                d[L[i]-1]++;
            int x = n ;
            for(int i=1;i<n-1;i++){
                for(x=n-1;d[x]!=1;)
                    x--;
                System.out.print("("+(x+1)+","+L[i-1]+")");
                d[L[i-1]-1]--;
                d[x]--;
            }
            for(x=n-1;d[x]!=1;)
                x--;
            int y = 0;
            for(y=x-1;d[y]!=1;)
                y--;
            System.out.println("("+(x+1)+","+(y+1)+")");
        }catch (IndexOutOfBoundsException e){
            // w razie błedów z interpretacją liczby elementów podanych jako argument
            System.err.println("Powinny być ddwa argumenty - liczby całkowite "+
                    " (liczba wierzchołków i rank) np 5 39");
        }catch(NumberFormatException e){
            // w razie błedów z interpretacją liczby elementów podanych jako argument
            System.err.println("Powinny być ddwa argumenty - liczby całkowite "+
                    " (liczba wierzchołków i rank) np 5 39");
        }
    }

}




Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
nadroj




Dołączył: 23 Paź 2010
Posty: 14
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysłany: Sob 10:44, 25 Cze 2011    Temat postu:

Kod:

#!/usr/bin/env python
## -*- coding: utf-8 -*-

# Tomasz Nowacki

# drzewo->kod Prufera, rank, unrank


def prufer(T, n):
    """ Metoda wyznacza kod Prufera dla zadanego drzewa T
        na n wierzcholkach.

        Parametry:
        T - drzewo w postaci listy krawedzi (lista list)
        n - liczba wierzcholkow

        Return:
        L - kod Prufera
    """
    # inicjalizacja tablic
    d = [0]*(n+1)
    L = [0]*(n-2)
    # utworzenie tablicy stopni wierzcholkow
    for t in T:
        x, y = t
        d[x] = d[x]+1
        d[y] = d[y]+1
    for i in xrange(0, n-2):
        # wyznaczenie najwiekszego wierzcholka stopnia jeden
        x = n
        while d[x] != 1:
            x = x - 1
        # wyznaczenie wierzcholka y, polaczonego z x
        # krawedz moze byc postaci [x,y] lub [y,x]
        y = n
        while True:
            if [x,y] in T:
                xy = True
                break
            elif [y,x] in T:
                xy = False
                break
            else:
                y = y - 1
        # wstaw y do L
        L[i] = y
        # usun krawedz [x,y] lub [y, x] z T
        if xy:
            T.remove([x,y])
        else:
            T.remove([y,x])
        # zmniejsz stopnie x i y w d o 1
        d[x] = d[x]-1
        d[y] = d[y]-1
    return L

def  rank(L, n):
    """ Metoda oblicza rank dla zadanego kodu Prufera.

        Parametry:
        L - kod Prufera
        n - liczba wierzcholkow

        Return:
        r - rank zadanego ciagu L
    """
    r = 0
    p = 1
    for i in xrange((n-2)-1, -1, -1):
        r = r + p*(L[i] - 1)
        p = p*n
    return r

def unrank(r, n):
    """ Metoda wyznacza kod Prufera na podstawie rangi.

        Parametry:
        r - ranga
        n - liczba wierzcholkow

        Return:
        L - kod Prufera
    """
    L = [0]*(n-2)
    for i in xrange((n-2)-1, -1, -1):
        L[i] = r%n +1
        r = (r - L[i] + 1)/n
    return L

def main():
    n = 7
    T = [[4,6],[5,6],[5,1],[6,2],[2,3],[2,7]]
    print 'Drzewo T: %s' % T
    L = prufer(T, n)
    print 'Kod Prufera: %s' % L
    r = rank(L, n)
    print 'Rank: %s' % r
    ur = unrank(r, n)
    print 'Unrank: %s' % ur

if __name__ == '__main__':
    main()



Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum www.zinfa.fora.pl Strona Główna -> Rok IV / Opracowania, pomoce IV Wszystkie czasy w strefie CET (Europa)
Idź do strony Poprzedni  1, 2, 3
Strona 3 z 3

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2002 phpBB Group
BBTech Template by © 2003-04 MDesign
Regulamin