• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak scalić cztery listy dwukierunkowe w jedną z uwzględnieniem kolejności?

Object Storage Arubacloud
0 głosów
342 wizyt
pytanie zadane 2 kwietnia 2020 w C i C++ przez ullortnaci Nowicjusz (220 p.)
Witam, mam problem z połączeniem czterech list dwukierunkowych w jedną. Mam w każdej zapisany czas odczytu jako tablicę char (data, godzina) i muszę brać z czterech list po jednym elemencie, ustawić w odpowiedniej kolejności (rosnąco), potem wziąć drugą czwórkę elementów itd. aż do utworzenia listy dwukierunkowej.
komentarz 2 kwietnia 2020 przez mpaw Użytkownik (580 p.)
Podaj łańcuch, który zawiera twoją datę i godzinę i napisz kod listy jakiej używasz.

4 odpowiedzi

0 głosów
odpowiedź 2 kwietnia 2020 przez mpaw Użytkownik (580 p.)
Hej. Czy używasz własnej listy, czy gotowej w STL? Załącz jakiś kod ;)

Michał
0 głosów
odpowiedź 2 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Z czym konkretnie masz problem? Z treści zadania dokładnie wynika co należy zrobić.

Jeżeli po prosu brakuje ci pomysłu na algorytm to możesz zastosować następujący:

wynik = nowa_lista
while (wszystkie listy nie są puste) {
    element1 = zdejmij_pierwszy_element(lista1);
    element2 = zdejmij_pierwszy_element(lista2);
    element3 = zdejmij_pierwszy_element(lista3);
    element4 = zdejmij_pierwszy_element(lista4);

    tablica = [ element1, element2, element3, elelemt4 ] 
    sortuj(tablica)
    wynik.dodaj(tablica[0])
    wynik.dodaj(tablica[1])
    wynik.dodaj(tablica[2])
    wynik.dodaj(tablica[3])
}

Algorytm zadziała tylko wtedy gdy listy maja tą samą długość

komentarz 2 kwietnia 2020 przez mpaw Użytkownik (580 p.)
Cześć. Twoje rozwiązanie jest niestety wadliwe. Elementy jednej listy mogą być wszystkie przed elementami innej.

Można albo wrzucić wszystkie elementy wszystkich list do vectora i posortować, albo zastosować dziel i rządź

Michał
komentarz 2 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)
Nie, nie mogą. Zdejmuję po jednym elemencie z każdej listy. Wkładam do tablicy i sortuję.
W kolejnej iteracji pętli zaczynam z nową (pustą) tablicą.

Szczerze dziwi mnie to zadanie. Gdyby to zależało ode mnie kazałbym złączyć te 4 listy zgodnie z porządkiem w czasie liniowym (żeby nikt nie kombinował z sortowaniem w osobnym kontenerze).
komentarz 19 lutego 2021 przez mpaw Użytkownik (580 p.)
Szkoda, że mówisz że nie mogą, chociaż nie rozumiesz tego co mówię. Pierwsza lista może mieć same zera a inne liczby większe od zera. Jak weźmiesz po jednym elemencie to rozrzucisz te zera po całej liście...
komentarz 19 lutego 2021 przez tangarr Mędrzec (154,860 p.)

Nie rozumiem co mówisz bo jesteś nieprecyzyjny.
Musisz zdecydować, czy chcesz scalić te 4 tablice w porządku rosnącym, czy chcesz sortować czwórkami, tak jak napisałeś

muszę brać z czterech list po jednym elemencie, ustawić w odpowiedniej kolejności (rosnąco), potem wziąć drugą czwórkę elementów

Jeżeli chcesz mieć jedną posortowaną listę to możesz użyć takiego algorytmu:

wynik = nowa_lista
while (wszystkie listy nie są puste) {
    minimalny = zdejmij_najmniejszy_element(lista1, lista2, lista3, lista4);
    wynik.dodaj(minimalny);
}

// funkcja pomocnicza
zdejmij_najmniejszy_element(lista1, lista2, lista3, lista4) {
    tablica_pomocnicza = [ lista1, lista2, lista3, lista4 ] // tablica wskaźników lub referencji będzie najwydajniejsza
    int index = -1;
    int min;
    for (int i=0; i<4; i++) {
        lista = tablica_pomocnicza[i]
        if (lista jest pusta)
            continue;
        if (index == -1) {
            index = i;
            min = pierwszy_element(lista);
            continue;
        }
        auto element = pierwszy_element(lista);
        if (element < min) {
            index = i;
            min = pierwszy_element(lista);
        }
    }
}

 

komentarz 19 lutego 2021 przez mpaw Użytkownik (580 p.)
żeby posortować całą liste w kolejności sortowania nie można brać czwórki tylko tak jak napisałem post niżej
komentarz 19 lutego 2021 przez tangarr Mędrzec (154,860 p.)
Widzę, że pomyliłem cię z osobą zadającą pytanie.

ullortnaci pytał o algorytm scalający 4 tablice dokładnie w taki sposób jaki przedstawiłem. Być może chodziło mu o takie scalanie jakie zaproponowałeś, ale treść pytania mówiła zupełnie o czym innym. Dlatego odpowiedziałem zgodnie z zadanym pytaniem.

Pseudoalgorytm który zaproponowałem w poprzednim komentarzu robi to samo co algorytm zaproponowany przez ciebie, ale obrabia naraz cztery tablice zamiast dwóch.
komentarz 19 lutego 2021 przez mpaw Użytkownik (580 p.)
Rozumiem. Ok :)
0 głosów
odpowiedź 2 kwietnia 2020 przez mpaw Użytkownik (580 p.)
Lista nowa1;

while (!lista1.empty() || !lista2.empty())
{
  if (lista1.empty())
  {
    nowa1.pushBack(lista2.popFront());
    continue;
  }

  if (lista2.empty())
  {
    nowa1.pushBack(lista1.popFront());
    continue;
  }

  if(strcmp(lista1.front(), lista2.front()) > 0)
    nowa1.pushBack(lista2.popFront());
  else
    nowa1.pushBack(lista1.popFront());
}

Tak samo posortować listy 3 i 4. A potem nowa1 i nowa2.

Sory za literówki. 

Michał 

komentarz 3 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
Innymi słowy: sortowanie przez scalanie.
0 głosów
odpowiedź 3 kwietnia 2020 przez TOWaD Mądrala (6,000 p.)

w STL to tak no może nie optymalnie

#include <iostream>
#include <set>
#include <list>

using namespace std;

int main() {

    std::list<int> l1= {1,5,8,37,3,5,54,9,2};
    std::list<int> l2= {1,25,8,27,3,5,4,99,2,10,12};
    std::list<int> l3= {1,75,8,7,3,25,54,9,2,55};
    std::list<int> l4= {1,65,8,7,3,5,4,49,2};

    std::list<int> lconcat;

    int licz = 0;

    while(
        l1.begin()!=l1.end()||
        l2.begin()!=l2.end()||
        l3.begin()!=l3.end()||
        l4.begin()!=l4.end()
    ) {
        std::multiset<int> s;
        if(l1.begin()!=l1.end()){
             s.insert(*l1.begin());
            l1.pop_front();
        }

        if(l2.begin()!=l2.end()) {
             s.insert(*l2.begin());
            l2.pop_front();
        }
        if(l3.begin()!=l3.end()) {
             s.insert(*l3.begin());
            l3.pop_front();
        }

        if(l4.begin()!=l4.end()) {
             s.insert(*l4.begin());
            l4.pop_front();
        }
        for(auto &x:s)lconcat.push_back(x);

    }

    for(const auto &x:lconcat )cout<<x<<'\n';
    return 0;
}

 

Podobne pytania

+1 głos
0 odpowiedzi 377 wizyt
0 głosów
1 odpowiedź 1,578 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez chacken Użytkownik (820 p.)
0 głosów
1 odpowiedź 269 wizyt

92,583 zapytań

141,434 odpowiedzi

319,668 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...