eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › liczby do zakresów
Ilość wypowiedzi w tym wątku: 10

  • 1. Data: 2013-10-28 16:51:13
    Temat: liczby do zakresów
    Od: d...@g...com

    Cześć
    Czy istnieje jakiś sprawny algorytm, który pozwoliłby zastąpić taki lub podobny ciąg
    liczb:
    1,2,3,4,6,7,8,14,15,16,190,191,192,300 w takie coś:
    1-4,6-8,14-16,190-192,300

    ??


  • 2. Data: 2013-10-28 16:58:57
    Temat: Re: liczby do zakresów
    Od: "Stachu 'Dozzie' K." <d...@g...eat.some.screws.spammer.invalid>

    On 2013-10-28, d...@g...com <d...@g...com> wrote:
    > Cześć
    > Czy istnieje jakiś sprawny algorytm, który pozwoliłby zastąpić taki lub podobny
    ciąg liczb:
    > 1,2,3,4,6,7,8,14,15,16,190,191,192,300 w takie coś:
    > 1-4,6-8,14-16,190-192,300

    Zdefiniuj "sprawny". Oczekujesz lepszego niż O(n) od długości ciągu
    wejściowego?

    --
    Secunia non olet.
    Stanislaw Klekot


  • 3. Data: 2013-10-28 17:01:10
    Temat: Re: liczby do zakresów
    Od: Piotr <c...@t...pl>

    W dniu 28.10.2013 o 16:51 <d...@g...com> pisze:

    > Cześć
    > Czy istnieje jakiś sprawny algorytm, który pozwoliłby zastąpić taki lub
    > podobny ciąg liczb:
    > 1,2,3,4,6,7,8,14,15,16,190,191,192,300 w takie coś:
    > 1-4,6-8,14-16,190-192,300
    >
    > ??

    w kółko
    wczytaj liczbę
    jeśli jest o 1 większa od poprzedniej
    poszerz ostatni zakres
    w przeciwnym wypadku
    utwórz nowy zakres


  • 4. Data: 2013-10-28 23:22:55
    Temat: Re: liczby do zakresów
    Od: bartekltg <b...@g...com>

    W dniu 2013-10-28 17:01, Piotr pisze:
    > W dniu 28.10.2013 o 16:51 <d...@g...com> pisze:
    >
    >> Cześć
    >> Czy istnieje jakiś sprawny algorytm, który pozwoliłby zastąpić taki
    >> lub podobny ciąg liczb:
    >> 1,2,3,4,6,7,8,14,15,16,190,191,192,300 w takie coś:
    >> 1-4,6-8,14-16,190-192,300
    >>
    >> ??
    >
    > w kółko
    > wczytaj liczbę
    > jeśli jest o 1 większa od poprzedniej
    > poszerz ostatni zakres
    > w przeciwnym wypadku
    > utwórz nowy zakres


    Zakładając, że ciąg jest posortowany.

    Jeśli nie jest, mamy O(n log(n))

    Ale nie bójmy się, akademicka (akademikowa) teoretyczność*)
    idzie z pomocą.

    Weźmy strukturę/algorytm find-union.
    Zbiory (te z f-u) wzbogaćmy informacją o najmniejszym i największym
    elemencie (aktualizowana O(1)). Trzeba to

    Teraz już prosto. Na początek koszyczek zbiorów pusty.

    while wejście niepuste
    odczytaj nową liczbę -> x
    if (!(find(x)))
    nowy_zbiór(x)
    if (find(x-1)) union(x,x-1)
    if (find(x+1)) union(x,x+1)

    Na koniec, przechodząc wszystkie zbiory dostajemy, również
    nieposortowany, zestaw przedziałów.

    Złożoność O ( dziwna_funkcja(n) * n )

    zaś dziwna funkcja (Ackermana) rośnie bardzo powoli,
    wolniej niż logarytm iterowany (ile razy trzeba zlogarytmować
    liczbę, by dostać <1).

    *) obstawiam, że sortowanie i tak może wygrać dla ludzkich
    zbiorów danych.



    :)

    pzdr
    bartekltg



  • 5. Data: 2013-10-28 23:38:27
    Temat: Re: liczby do zakresów
    Od: A.L. <a...@a...com>

    On Mon, 28 Oct 2013 23:22:55 +0100, bartekltg <b...@g...com>
    wrote:

    >
    >Złożoność O ( dziwna_funkcja(n) * n )
    >
    >zaś dziwna funkcja (Ackermana) rośnie bardzo powoli,
    >wolniej niż logarytm iterowany (ile razy trzeba zlogarytmować
    >liczbę, by dostać <1).

    O ile mnie pamiec nie myli, funkcja Ackermana ma 2 argumenty. I
    bynajmniej nie rosnie powoli

    A.L.


  • 6. Data: 2013-10-29 00:17:54
    Temat: Re: liczby do zakresów
    Od: bartekltg <b...@g...com>

    W dniu 2013-10-28 23:38, A.L. pisze:
    > On Mon, 28 Oct 2013 23:22:55 +0100, bartekltg <b...@g...com>
    > wrote:
    >
    >>
    >> Złożoność O ( dziwna_funkcja(n) * n )
    >>
    >> zaś dziwna funkcja (Ackermana) rośnie bardzo powoli,
    >> wolniej niż logarytm iterowany (ile razy trzeba zlogarytmować
    >> liczbę, by dostać <1).
    >
    > O ile mnie pamiec nie myli, funkcja Ackermana ma 2 argumenty. I
    > bynajmniej nie rosnie powoli


    Jasne, miałem na myśli "odwrotną" funkcja Ackermana. Pośpiech
    .
    http://en.wikipedia.org/wiki/Ackermann_function#Inve
    rse

    Też ma dwa argumenty. Tzn może mieć, zależnie, jak tę
    odwrotność zdefiniujemy. Można prosto, odwrotność funkcji
    f(x) = A(x,x), ( odwrotność A(4,n) to logarytm iterowany :)
    a można i sprytniej, ale ta defincja chyba jest nawet
    zrobiona pod algorytm.


    Za poważnie się na ten wątek zrobiło;-)

    pzdr
    bartekltg





  • 7. Data: 2013-10-29 08:07:20
    Temat: Re: liczby do zakresów
    Od: g...@s...invalid (Adam Wysocki)

    d...@g...com wrote:

    > Czy istnieje jakiś sprawny algorytm, który pozwoliłby zastąpić taki lub podobny
    ciąg liczb:
    > 1,2,3,4,6,7,8,14,15,16,190,191,192,300 w takie coś:
    > 1-4,6-8,14-16,190-192,300

    Zobacz kod jakiegoś uniksowego czytnika newsów (pine, alpine, tin, slrn).
    Plik .newsrc, z którego korzystają, właśnie tak wygląda.

    --
    "zanim nastala era internetu, kazdy wiejski glupek siedzial w swojej wiosce"
    http://www.chmurka.net/


  • 8. Data: 2013-10-29 14:41:21
    Temat: Re: liczby do zakresów
    Od: firr <p...@g...com>

    W dniu poniedziałek, 28 października 2013 16:51:13 UTC+1 użytkownik ToMi napisał:
    > Cześć
    >
    > Czy istnieje jakiś sprawny algorytm, który pozwoliłby zastąpić taki lub podobny
    ciąg liczb:
    >
    > 1,2,3,4,6,7,8,14,15,16,190,191,192,300 w takie coś:
    >
    > 1-4,6-8,14-16,190-192,300
    >

    okrotnie latwe zadanie dobre nawet mysle do uczenia programowania w szkole czy gdzies

    aczkolwiek jak probuje to zakodowac nasuwaja sie
    pewne uwagi

    1) da sie to zapisac ale przyklad nieco obnaza
    niedostatki wspolczesnych jezykow programowania
    bo z czegos tak prostego robi sie mala lamigłowka

    2) o ile juz zapisac to latwiej majac dostep do dancyh we wy w postaci tablic a nie w
    postaci
    api strumienia (te cholerne strumienie sa wlasnie
    trudniejsze w zakodowaniu i mniej poreczne)

    w jakims dobrze ustruktaryzowanym jezyku powinno
    sie to dac podzielic na jakies wydzielone etapy
    konkretnie na przyklad trzy

    (1) petla ma sie wywolac dla wszystkich sekwencyjnych par przyleglych liczb (po calym
    inpucie)
    (2) porownuje sie te pary jesli druga wartosc jest o jeden mniejszy niz pierwszy
    wywolaj pisanie minusa (3) ale takiego ze jesli ostatnio w outpucie jest minus to nie
    wypisuj nic)
    natomiast jesli nie wypisz liczbe

    (co gorsza to cholerstwo w ujeciu wyzej mimo ze problem jasny jest w zakodowoaniu
    niesymetryczne

    w ujeciu w c to byloby to cos podobnego do - aczkolwiek to tutaj to jest co nieco
    pseudokod

    print(input[0];

    for(int i=1; i<length of(input); i++)
    {
    int last_printed_is_minus = 0;

    if(input[i]==input[i-1])
    if(last_printed_is_minus)
    last_printed_is_minus =1,
    print("-");
    else
    last_printed_is_minus =0,
    print(i);

    }


  • 9. Data: 2013-10-29 23:03:26
    Temat: Re: liczby do zakresów
    Od: Wojciech Muła <w...@g...com>

    On Monday, October 28, 2013 4:51:13 PM UTC+1, ToMi wrote:
    > Cześć
    >
    > Czy istnieje jakiś sprawny algorytm, który pozwoliłby zastąpić taki lub podobny
    ciąg liczb:
    >
    > 1,2,3,4,6,7,8,14,15,16,190,191,192,300 w takie coś:
    >
    > 1-4,6-8,14-16,190-192,300

    A ile masz tych liczb?
    Jaki jest ich zakres?

    w.


  • 10. Data: 2013-10-30 08:10:21
    Temat: Re: liczby do zakresów
    Od: Wielebny <w...@w...pl.invalid>

    W dniu 28.10.2013 16:51, d...@g...com pisze:
    > Cześć
    > Czy istnieje jakiś sprawny algorytm, który pozwoliłby zastąpić taki lub podobny
    ciąg liczb:
    > 1,2,3,4,6,7,8,14,15,16,190,191,192,300 w takie coś:
    > 1-4,6-8,14-16,190-192,300
    >
    > ??
    >

    Można by to bardziej zoptymalizować np. poprzez wywoływanie
    string.format dopiero gdy jest potrzebne a nie w każdym kroku
    iterowanego ciągu, ale ogólnie masz tu algorytm który robi to w jednym
    przebiegu:

    Do zweryfikowania na: http://repl.it/languages/Lua

    local a={1,2,3,4,6,7,8,14,15,16,190,191,192,300}
    local ret={}

    local startval,lastval

    for i=1,#a do
    if startval and lastval and lastval==a[i]-1 then
    ret[#ret]=string.format("%d-%d", startval, a[i])
    else
    table.insert(ret, a[i])
    startval=a[i]
    end
    lastval=a[i]
    end

    -- pokazywanie wyniku

    print(table.concat(ret,","))


strony : [ 1 ]


Szukaj w grupach

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: