eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingAlgorytmiczny problem lamera... :-)Re: Algorytmiczny problem lamera... :-)
  • Data: 2014-10-05 22:11:26
    Temat: Re: Algorytmiczny problem lamera... :-)
    Od: bartekltg <b...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 05.10.2014 21:26, m...@g...com wrote:
    > Pomóżcie, bo spać nie mogę.
    >
    > Po paru latach przerwy dopadła mnie konieczność napisania programu.
    > Problem był dość banalny: Na wejściu dostajemy paręnaście tysięcy
    > list
    >składających się z kilkudziesięciu elementów (stringów), listy są
    >posortowane, elementy list mogą się powtarzać i robią to nagminnie -
    >zadaniem programu jest "odfiltrowanie" powtórzonych elementów i
    >zapisanie tak wyczyszczonych list do pliku.
    >
    > Zadanie jest już rozwiązane, ale gnębi mnie mało elegancki sposób
    > jegorozwiązania.
    > Kod "filtrujący":
    >

    > c = 1; // A)
    >
    > for (i = 0; i < nElem; i++)
    > {
    > for (k = 0; k < i; k++)
    > {
    > c = strcmp(Tab[i], Tab[k]);
    > if (c == 0) // B)
    > break;
    > }
    > if (c != 0) // C)
    > MyOutFile << Tab[i] << ...
    > }
    >
    >
    > Pomijając kwestię optymalizacji dostępu do tablic i skorzystania ze
    > "zbicia" powtarzających się elementów - jak to to ucywilizować?
    > Zestawienie instrukcji C i B, niestety, kłuje w oczy... Tak samo, jak
    > "sztuczna" instrukcja A.
    >
    > Da się coś z tym zrobić? Jedyne, co mi przychodzi do głowy, to
    > posłużenie się instrukcją goto, ale to - jak wiadomo - samo zło...


    Nie mówiłeś czasem, że lista jest posortowana?
    Skoro jest posortowana, to powtarzające się elementy
    są obok siebie.
    BTW, chyba to nie listy, skoro mają dostęp przez indeks.


    int i=0;

    while ( i<nElem )
    {
    MyOutFile << Tab[i] << ...;
    int j=i+1;
    while( (j<nElem) && (strcmp(Tab[j],Tab[i])==0) ) j++;
    i=j;
    }


    Widzę, że używasz c++, (znaczki <<).
    To czemu nie użyjesz stringów. Tab to wtedy
    vector<string>.

    while ( i<nElem )
    {
    MyOutFile << Tab[i] << ...;
    int j=i+1;
    while( (j<nElem) && ( Tab[j] == Tab[i] ) ) j++;
    i=j;
    }

    Już wygląda lepiej.

    Można też użyć od razu użyć unique
    http://www.cplusplus.com/reference/algorithm/unique/

    pzdr
    bartekltg





Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: