krzyżowanie permutacji (na tablicach)

Odpowiedz Nowy wątek
2009-01-13 22:46
0

Mam pewien problem. Musze skrzyzowac ze soba dwa ciagi znaków (tablice) w taki sposob ze losuje najpierw punkt, w ktorym bedzie nastepowalo przedzielenie jednego ciagu i doklejenie czesci tego drugiego.
Ma o wygladac mniej wiecej tak:

[1,2,4 | 6,3,7] -> [1,2,4,3,6,7]
[3,2,6 | 7,1,4] -> [3,2,6,1,4,7]

w tym przyapdku punkt podziału jest w srodku ale moze byc w dowolnym miejscu. W pierwszej tablicy przepisujemy 1,2,4 i jednoczesnie wykreslamy je z drugiej tablicy i do pierwszej dopelnimy te liczby ktore am zostaly z tej drugiej czyli 3,6,7.

nie wiem wlasnie jak zapisac to wykreslanie elementow w drugiej tablicy ktore mam juz w pierwszej. Moj kod wyglada tak:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int p;

    srand(time(NULL));

    const int n=10;
    int tab[n]={1,5,4,8,2,9,6,10,3,7};
    int tab1[n]={3,6,9,1,2,4,10,5,7,8};
    int tabN[n]={0};
    int tab1N[n]={0};

    p=1+rand()%9;

    for(i=0;i<p;i++)
    tabN[i]=tab[i];

    for(i=0;i<n;i++)
    {
     if (tab

    cout<<p<<endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

Bylbym wdzieczny za pomoc</cpp>

Pozostało 580 znaków

2009-01-13 22:59
0

czy to tak trudno zamienić miejscami dwie zmienne (tu trzeba to kilka razy powtórzyć)?

A wersja z STL wygląda tak:

#include <algorithm>
...
    int tab[n]={1,5,4,8,2,9,6,10,3,7};
    int tab1[n]={3,6,9,1,2,4,10,5,7,8};
    p=1+rand()%9;
    std::swap_ranges(tab+p,tab+n,tab1+p);

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2009-01-13 23:15
0

niestety ta instrukcja nie dziala poprawnie bo liczby nie moga sie powtarzac

Pozostało 580 znaków

2009-01-14 07:26
0

Napisz jaśniej o co ci chodzi! Byłem pewien, że po prostu zamieniasz miejscami dwa ciągi. Co to znaczy, że "liczby nie moga sie powtarzac "? W twoim przykładzie powtarzając się (tylko coś jest namieszane z kolejnością elementów w drugich częściach ciągów).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2009-01-14 10:47
0

Mamy dwie tablice :

tab1=[1,2,4,6,3,7]
tab2=[3,2,6,7,1,4]

losujemy punkt podzialu np 3.

[1,2,4 | 6,3,7]
[3,2,6 | 7,1,4]

teraz nastepuje krzyzowanie czuli w nowej tablicy przepisujemy 3 pierwsze cyfry z tab 1, wykreslamy te cyfry z tab2 i w dalszej czesci nowo utworzonej tablicy przepisujemy to co nam zostanie z tab2 czyli:

tabNew1=[1,2,4 | ]
tabNew1=[1,2,4, 3,6,7] <- tak ma wygladac wynik

i to samo w druga strone czyli z tab2 przepisujemy 3 pierwsze cyfry

tabNew2=[3,2,6 | ]
z tab1 wykreslamy te ktore mamy juz w tabNew2 i wpisujemy do TabNew2 to co nm zostalo czyli 1,4,7
tabNew2=[3,2,6,1,4,7]

Pozostało 580 znaków

2009-01-14 14:35
0

teraz nastepuje krzyzowanie
Żadnego krzyżowania nie widzę, posortowałeś jedynie ostatnie 3 elementy rosnąco, pierwszą tablicę osobno, drugą osobno.
Widzę, że sam nie wiesz co chcesz zrobić.

Pozostało 580 znaków

2009-01-14 15:03
0

adf88 przesadzasz. On powinien powiedzieć, że próbuje skrzyżować dwie permutacje w taki sposób by nadal otrzymać permutację
Wiec bierze z pierwszej tablicy p elementów i uzupełnia elementami, które nie występują jeszcze w nowej tablicy biorąc je w kolejności takiej w jakiej występują w drugiej tablicy.
Czyli chodzi mu o coś takiego:

void Merage( const int * source1, const int * source2, int * destination, int size, int pos)
{
    const int * intersection = destination+pos;
    std::copy(source1,source1+pos, destination);

    for(int i=pos; i<size; ++i)
        {
        while(std::find(destination, intersection , *source2)!=intersection )
             ++source2;
        destination[i] = *source2;
        }
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0