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:prawie 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:10 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:prawie 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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)