Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Program wyszukujący ze zbioru liczb dwie, o najmniejszej różnicy

Ostatnio zmodyfikowano 2010-11-10 15:24
Autor Wiadomość
Kzzav
Temat założony przez niniejszego użytkownika
Program wyszukujący ze zbioru liczb dwie, o najmniejszej różnicy
» 2010-11-09 23:36:56
Witam.
Mam zadanie - napisać program, który ze zbioru dowolnej ( duużej ) ilości liczb, wyszuka dwie, których różnica jest jak najmniejsza, i wypisze tą różnicę. Np.
Dla liczb: 1 4 6 15 10
Program powinien wypisać: 2

Udało mi się zrobić taki program, problemem jest jednak czas wykonania przy większej ilości.
Otóż program musi znaleźć tą różnicę w czasie krótszym niż 4 sekundy...
Prosiłbym o jak najkrótszą metodę wyszukiwania tej różnicy.
P-23783
malan
» 2010-11-10 00:15:01
2? Moim zdaniem to będzie -14.
P-23784
ison
» 2010-11-10 10:20:00
Kzzav nie sprecyzowałeś treści zadania...
po pierwsze: limity
no dobra, program ma działać mniej niż 4 sekundy, ale dla ilu liczb?

po drugie: czy wynikiem musi być dodatnia liczba? tak jak już to malan zauważył np {4,6,6} -> 4-6=-2

po trzecie: czy muszą być to 2 różniące się od siebie liczby? np {4,6,6} -> 6-6=0

po czwarte: czy może być to różnica tej samej liczby z samą sobą? np {5} -> 5-5=0
jeśli nie to co program ma zrobić jeśli dostanie tylko 1 liczbę?

program, liczący najmniejszą różnicę dwóch dowolnych liczb, która w wyniku musi dać liczbę większą od 0 w złożoności O(n*logn)
C/C++
#include <cstdio>
#include <algorithm>

#define MAX_VALUE 2147483647
#define MAX_N 100000

int main()
{
    int n, najm = MAX_VALUE;
    int tab[ MAX_N ];
    scanf( "%d", & n );
   
    for( int i = 0; i < n; ++i ) {
        scanf( "%d", & tab[ i ] );
    }
    std::sort( tab, tab + n );
    for( int i = 1; i < n; ++i ) {
        if( tab[ i ] - tab[ i - 1 ] < najm ) najm = tab[ i ] - tab[ i - 1 ];
       
    }
    printf( "%d\n", najm );
}

nie podałeś limitów więc ustawiłem wartości maxymalne tak jak wyżej, jeśli będzie to konieczne (tzn ten algorytm to część jakiegoś większego projektu) to użyj tablic dynamicznych
W moim rozwiązaniu najpierw sortuję podane liczby, więc mam pewność że dla każdego i>0  tab[i]>=tab[i-1] -> mogę wtedy przeszukać tablicę od lewej strony i sprawdzić różnicę między kolejnymi elementami

W programie na początku podajesz ilość liczb.
Nie powiedziałeś co ma się stać gdy na wejściu program dostanie tylko 1 liczbę więc tego nie uwzględniłem
P-23786
malan
» 2010-11-10 13:14:52
@ison: Trochę tego nie przemyślałeś... Twój algorytm zadziała w jakiś 10% może.
Poczekajmy, aż Kzzav poda więcej informacji, bo pisać programy tylko po to, żeby coś napisać to nie ma sensu.
P-23794
ison
» 2010-11-10 13:20:28
@malan możliwe, pisałem to na szybko, przepraszam jeśli mój program wypisuje bzdury :D
mógłbyś podać przykład gdzie mój algo nie zadziała? bo jakoś nie mogę sobie tego wyobrazić
P-23798
malan
» 2010-11-10 13:26:49
Może to ja piszę bzdury? ;p
Dla różnicy większej niż zero (0) działa :). Trochę się pospieszyłem, sory.
P-23801
ison
» 2010-11-10 13:51:45
2? Moim zdaniem to będzie -14
w zadaniu nie chodzi o najmniejszą różnicę 2 dowolnych liczb np dla {5,6} 5-6=-1 tylko o najmniejszą odległość 2 liczb na osi liczbowej
tzn dla {-5,-7} wynikiem powinno być 2 a nie -2
mój algorytm działa dobrze ;p, wszystkie pytania które zadałem do autora w moim 1 poście wycofuję, gdyż treść zadania można interpretować na 2 sposoby - jako najmniejszą różnicę lub najmniejszą odległość na osi liczbowej
P-23802
Elaine
» 2010-11-10 14:05:39
Co oznacza to 2147483647 i dlaczego jest to właśnie tyle?
P-23803
« 1 » 2
  Strona 1 z 2 Następna strona