Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Generowanie kombinacji w porzadku leksykograficznym.

Ostatnio zmodyfikowano 2013-08-18 20:59
Autor Wiadomość
tothk2a11
Temat założony przez niniejszego użytkownika
Generowanie kombinacji w porzadku leksykograficznym.
» 2013-08-18 18:11:58
Napisałem kod generujący kombinacji w porządku leksykograficznym.
Ale niektóre kombinacje wyświetla mi po kilka razy.

C/C++
#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

main()

{ //1p
   
    int k( 3 ); // kombinacja k-elementowa
    int const n( 10 ); // liczba elementów zbioru
    int a[ k ];
   
    //pierwsza kombinacja
   
    //generowanie pierwszej kombinacji
    //tablica wypełniana wartościami: 1, 2, 3, ..., k-1, k,
    for( int i = 0; i < k; i++ )
    { //3p   
        a[ i ] = i + 1;
    } //3k
   
    //generowanie kolejnych kombinacji
    int z = k - 1;
   
    while( z >= 0 ) // warunek końca generowania kombinacji
    { //3p        
       
        // wyświetla bierzący stan tablicy
        // umożliwia wuświetlenie kombinacji w wierszach   
        for( int i = 0; i < k; i++ )
        {
            cout << a[ i ] << ", ";
        }
        cout << "\n";
        getch();
       
        if( a[ z ] <( n -( k - z - 1 ) ) ) // sprawdz czy ostatni element można powiększyć
        { //4p
            a[ z ] ++; // jeśli warunek spełniony, ostatni element kombinacji +1
           
            // ustaw kolejne elementy kombinacji o 1 wieksze od poprzednich             
            while( z + 1 < k )
            { //5p
                a[ z + 1 ] = a[ z ] + 1;
                z++;
            } //5k
        } //4k
        else
        { //4p
            z--;
        } //4k
    } //3k                
   
    getch();
    return 0;
} //1k

Przykład generowania kombinacji.
Kombinacja 3 elementowa ze zbioru 10 elementowego. k=3, n=10
     

1, 2, 3,
1, 2, 4,
1, 2, 5,
1, 2, 6,
1, 2, 7,
1, 2, 8,
1, 2, 9,
1, 2, 10, tu jest problem
1, 2, 10, <=
1, 3, 4,
1, 3, 5,
1, 3, 6,
  ...c.d.
Po osiągnięciu w ostatnim elemencie maksymalnej wartości, program wykonuje całą pętle zmieniając podnoszenie elementu z ostatniego na przedostatni.
Z tego co przeanalizowałem to jest przyczyna podwajania wyświetlanych kombinacji.

Szukam sposobu żeby to przeskoczyć.    

P-90477
pekfos
» 2013-08-18 19:30:12
Wyświetlasz aktualną kombinację niezależnie od tego, czy się zmieniła. (Wyświetlasz kombinację, warunek się nie spełnia, zmniejszasz z i ponownie wyświetlasz tą samą kombinację).
P-90485
Mrovqa
» 2013-08-18 20:12:17
Nie szybciej i łatwiej byłoby wykorzystać std::sort oraz std::next_permutation z biblioteki standardowej C++?
P-90487
tothk2a11
Temat założony przez niniejszego użytkownika
» 2013-08-18 20:13:35
Jakieś sugestie jak to przeskoczyć.

Jeśli chodzi o moją wiedzę i umiejętności w programowaniu to jeszcze raczkuję.
Programowaniem zajmuje się od kilku dni.

Próbuje generowanie kombinacji umieścić w funkcji, ale nie wiem czy to wypali.
Nie mam pomysłu jak zatrzymać funkcję generującą po wykonaniu kolejnych pętli.
P-90488
pekfos
» 2013-08-18 20:18:04
Jakieś sugestie jak to przeskoczyć.
Użyj dodatkowej zmiennej, określającej, czy wyświetlać kombinację, czy nie.
P-90490
tothk2a11
Temat założony przez niniejszego użytkownika
» 2013-08-18 20:26:35
Użyj dodatkowej zmiennej, określającej, czy wyświetlać kombinację, czy nie
Nie bardzo wiem co ta dodatkowa zmienna miała by robić. A raczej od czego być uzależniona.

P-90491
pekfos
» 2013-08-18 20:40:32
A rozumiesz problem w swoim kodzie?
P-90492
tothk2a11
Temat założony przez niniejszego użytkownika
» 2013-08-18 20:52:46
Wydaje mi się że tak.

To co wyświetla to bieżący stan tablicy k elementowej.
gdy element k jest maksymalny program zmienia tylko z-- (przechodzi do poprzedzającego elementu ) co nie zmienia stanu tablicy.
Kolejny cykl pętli ponownie wyświetla stan tablicy który był już wyświetlony, a później dopiero podnosi poprzednie elementy o 1.  
P-90493
« 1 » 2
  Strona 1 z 2 Następna strona