eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingliczby do zakresówRe: liczby do zakresów
  • 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: liczby do zakresów
    Date: Mon, 28 Oct 2013 23:22:55 +0100
    Organization: ATMAN - ATM S.A.
    Lines: 59
    Message-ID: <l4mo50$c4j$1@node1.news.atman.pl>
    References: <9...@g...com>
    <op.w5n9f8zhjuu8ly@gi3nto>
    NNTP-Posting-Host: 89-76-68-230.dynamic.chello.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node1.news.atman.pl 1382999008 12435 89.76.68.230 (28 Oct 2013 22:23:28 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Mon, 28 Oct 2013 22:23:28 +0000 (UTC)
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130801
    Thunderbird/17.0.8
    In-Reply-To: <op.w5n9f8zhjuu8ly@gi3nto>
    Xref: news-archive.icm.edu.pl pl.comp.programming:204633
    [ ukryj nagłówki ]

    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


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: