Szybkość wykonania

Szybkość wykonania
C1
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Postów:22
0

Dane są dwie tablice o rozmiarach n oraz m. Napisz metody, które pozwolą wypełnić te tablice
losowo wygenerowanymi danymi z zakresu [1,1000000000]. Napisz metodę która zapisze do pliku
tekstowego liczność elementów zawartych w obu tablicach.

Witam, założenie jest takie, że ten algorytm powinien wykonywać się w mniej niż 3s. Zwykłym for'em wertowanie tablic dla np. 300 elementów jest bardzo czasochłonne. Jaki jest inny sposób tego rozwiązania.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Ty chyba sobie robisz jakieś jaja, albo śmigasz na 8086 jeszcze. W takim czasie to można zaalokować i wypełnić setki megabajtów pamięci, jeśli nie więcej. Pokaż kod, bo błąd leży właśnie tam...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
katelx
ale to java! :)
C1
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Postów:22
0

@Edit

Kopiuj
package javaapplication21;

import java.util.Random;

public class JavaApplication21 {

    private int tab[];
    Random losowanie = new Random();
    
    JavaApplication21(int n) {
        tab = new int[n];
    }
    
    void wypelnij() {
        for( int i = 0; i < tab.length; i++ )
            tab[i] = losowanie.nextInt(1000000000)+1;
    }
    
    void licz() {
        int suma = 0;
        
        for( int i = 1; i < 1000000001; i++) {
            for( int j = 0; j < tab.length; j++ ) {
                if(tab[j] == i)
                    suma++;
            }
        }
        
        System.out.println(suma);
    }
    
    public static void main(String[] args) {
        
        JavaApplication21 java = new JavaApplication21(10);
        
        java.wypelnij();
        java.licz();
    }
    
}

Przy takim prostym sposobie wykonuje mi się 30s.

Zmienienoe na long.

edytowany 2x, ostatnio: czarek1122
CeKa
Nie wiedziałem, że inty radzą sobie z tak dużymi liczbami. Jestem też ciekawy co Ci zwraca konsola po podsumowaniu tego :)
SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około rok
0

Pytanie co to ma wspólnego z zadaniem?

I co tam robią te dwie zagnieżdżone pętle, z czego jedna ma 1000000001 iteracji?

C1
Sprawdza po kolei w tablicy ile jest wystąpień danej liczby. Od 1 do 1000000001, np. w tablicy jest 5 dwójek, itp. A sumę to nie wiem po co dałem, tak dla testu.
caer
coooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około rok
0

Nie sądzę, bo masz tylko jedną zmienną suma.
I żeby to zliczyć musisz iterować po wszystkich możliwych liczbach z zakresu?

Jakbyś miał to na kartce i liczył w głowie to też byś iterował od 1 do 1000000000 i dla każdej liczby sprawdzał czy istnieje w tablicy 10-cio elementowej? xD
Czy może jednak byś iterował po elementach tablicy i sprawdzał czy taki element już był i jak tak to zwiększał licznik?

edytowany 1x, ostatnio: some_ONE
C1
Zmienna suma jest testowa, po każdej iteracji mogę ją zapisać do pliku, zerować ja i przejść do następnej liczby. Zmieniłem pętle i czas zmienił się z 23s na 7s, tylko przy 10 elementowej tablicy.
SO
Tak, wprowadź 3 poziom zagnieżdżenia pętli z 1000000000 iteracji jak tu jest potrzebna tylko jedna pętla po elementach tablicy.
caer
po co? nawet bez użycia mapy spokojnie możesz trzymać każdą możliwą liczbę w tablicy
caer
  • Rejestracja:około 11 lat
  • Ostatnio:11 miesięcy
  • Postów:465
0

Zrób sobie tablicę o rozmiarze 1000000000, przeleć po tych wypełnionych tablicach i za każdym razem podbijaj licznik w odpowiednim miejscu, na przykład jak trafisz na liczbę 23 to robisz tab[23]++. Zamiast miliarda iteracji masz tyle ile miejsc w tych twoich m i n. Albo po prostu zrób mapę Integer->Integer. W czym problem?

Shalom
No z tą tablicą to bym się zastanowił bo nawet bez żadnego narzutu goła tablica miliarda intów to będzie 4GB pamięci na samą tablicę i bez ustawienia sobie jakiegoś -Xmx5g to nie pójdzie ;]
caer
a jakaś leniwa struktura która by nie zajmowała miejsca póki nie będzie wypełniona? jest coś takiego?
Shalom
Są implementacje sparse matrix, ale to z armatą na muchę. W większości nie-obliczeniowych problemów wystarczy hashmap, bo daje dokładnie to o czym piszesz.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

No to ja się nie dziwię że ci się to tyle czasu wykonuje. Widać przespałeś zajęcia z Algorytmów kiedy omawianio Sortowanie Przez Zliczanie (countingsort) i wyjaśniano że co prawda jest liniowe względem n ale realny koszt to O(n)+O(k) i sporo zależy od zakresu k.

Twoje policzenie wystąpień będzie miało złożoność O(k2*n) podczas gdy można to zrobić w średnim czasie O(n). A skoro u ciebie k ma miliard a n ma 10 to chyba sam widzisz że nie trudno zrozumieć czemu ci się długo liczy?
Lekcja na dziś: Map<Integer, Integer>


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 4x, ostatnio: Shalom

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.