eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingAlgorytmiczny problem lamera... :-)Re: Algorytmiczny problem lamera... :-)
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!.POSTED!not-for-mail
    From: bartekltg <b...@g...com>
    Newsgroups: pl.comp.programming
    Subject: Re: Algorytmiczny problem lamera... :-)
    Date: Sun, 05 Oct 2014 22:11:26 +0200
    Organization: ATMAN - ATM S.A.
    Lines: 81
    Message-ID: <m0s8le$lfc$1@node2.news.atman.pl>
    References: <1...@g...com>
    NNTP-Posting-Host: 89-73-81-145.dynamic.chello.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node2.news.atman.pl 1412539886 21996 89.73.81.145 (5 Oct 2014 20:11:26 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Sun, 5 Oct 2014 20:11:26 +0000 (UTC)
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101
    Thunderbird/31.1.2
    In-Reply-To: <1...@g...com>
    Xref: news-archive.icm.edu.pl pl.comp.programming:206688
    [ ukryj 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: