eGospodarka.pl
eGospodarka.pl poleca

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

    On 06.10.2014 21:04, m...@g...com wrote:
    > W dniu niedziela, 5 października 2014 22:11:26 UTC+2 użytkownik bartekltg napisał:
    >
    >> 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;
    >> }
    >
    >
    > O, proszę! Ładne! :-)
    >
    > Skojarzyłem, że kiedyś musiałem różnie reagować w zależności od
    > liczby
    >wyrazów we wczytanym wierszu i męczył mnie podobny problem, więc tylko
    >na nim się skupiłem...
    > Zakładając, że elementy NIE sa posortowane, przychodzi mi tylko coś
    >takiego do głowy:
    >

    > for (i = 0; i < nElem; i++)
    > {
    > for (k = 0; k < i; k++)
    > if (strcmp(Tab[i], Tab[k]) == 0)
    > goto NEXT;
    >
    > for (k = i + 1; k < nElem; k++)
    > if (strcmp(Tab[i], Tab[k]) == 0)
    > goto NEXT;
    >
    > MyOutFile << Tab[i] << ...
    >
    > NEXT:
    > }

    To jest kwadratowe.
    Sortowanie jest n log(n) + algorytm powyżej (czy z std:z unique),
    który jest linowy.

    Nie ma porównania;-) Posortuj i rób jak poprzednio.


    Jeśli chcesz je wypisywać w kolejności, w jakiej nadeszły,
    możesz zapisać numer na pierwotnej liście, posortować
    puścić unique, posortować po numerach nadejścia.
    4 linijki, nadużywając języka.

    #include <iostream>
    #include <vector>
    #include <algorithm>

    int main()
    {
    typedef pair<string, int> tt;
    vector<tt> tab;

    int licznik=0;
    for(;;){ //odczyt
    string str;
    cin>>str;
    if (str=="koniec") break;
    tab.push_back(make_pair(str,++licznik));
    }


    //mięsko
    sort(tab.begin(),tab.end());
    auto it = unique(tab.begin(),tab.end(), [](const tt &a,const tt &b
    ) {return a.first==b.first;});
    tab.resize( distance(tab.begin(),it) );
    sort(tab.begin(),tab.end(), [](const tt &a,const tt &b ) {return
    a.second<b.second;});
    //i po mięsku.

    for (int i=0;i<tab.size();i++)
    {
    cout<<tab[i].second<<" "<<tab[i].first<<endl;
    }
    return 0;
    }

    " [](const tt &a,const tt &b ) {return a.first==b.first;} "
    to "lambda", stworzenie funkcji, która ma arguymenty jak w nawiasie ()
    i robi to, co jest w nawiasie {}. Są one używane jako trzcie argument
    unique (zeby sprawdzić, co traktujemy jako 'to samo' i sort)

    Prościej być może byłoby wykorzystać pomysł A.L, wykorzystać jakiś
    kontener asocjacyjny, set (drzewo binarne) albo unordered_ser (tablica
    haszująca).

    Ale to wszytko tylko, jeśli chcesz zachować oryginalną kolejność,
    jeśli tylko wypisać bez powtórzeń, posortuj i postępuj jak post
    wcześniej.


    > Takie continue, tylko nieco dalej skaczące...




    >> Widzę, że używasz c++, (znaczki <<). To czemu nie użyjesz
    >> stringów.
    >
    > Tak jak wspominałem - musiałem napisać "jednorazówkę" do rozwiązania
    > topornego zadania. Zanim program poczyścił zestawienia, wcześniej
    > dokonywał operacji na pojedynczych znakach i tu było mi poręczniej
    > użyć tablic. Zresztą, jak w zeszłym tysiącleciu przechodziłem z
    > Pascala na C, strasznie irytował mnie brak zmiennej typu String,
    > tylko te dziadowskie tablice znakow. Ale potem poczułem w tym pałera
    > i trudno mi się znowu odkręcić. ;-)

    Kto co lubi. Ale cięzko korzystać z nowych zabawek nie uzywając
    std::string.


    >> Tab to wtedy vector<string>.
    >
    > Abstrachuje Pan od układu odniesienia. ;-) Jestem "niedzielnym"

    Ty też. To usenet, 'panowanie' najczęściej występuje tu w bardzo
    zaawansowanej kłótni ;-)

    > programista, a o tym czymś z klamerkami czytałem kiedyś może z raz u
    > Grębosza... ;-) Rozkminienie tematu zajęłoby mi więcej czasu, niż
    > rozwiązanie całego zadania - w zaoszczędzonym czasie wolę sobie
    > popisać na usenecie. ;-)


    Jakiś czas temu znajoma poprosiła mnie o przypomnienie jej c++.
    Miała to na studiach (politechnika). Po 20 minutach zrobiła
    wielkie oczy i zdziwiona rzekła: to tu da się pisać jak w normalnym
    języku.
    Te wszystkie zabawki pozwalają pisać łatwiej i szybciej.

    Oczywiście, niestety, trzeba trochę czasu w ich poznanie zainwestować.

    BTW. C i C++ to ambitny wybór do niedzielnego programowania;-)


    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: