Obiekt tablicowy

0

Utworzyłem klasę, której pole jest tablicą:

 public class aaa {
    private int[] tablica;
    
    public aaa(int[] tablica) {
        this.tablica = tablica;
    }  
}

Potem w klasie głównej hcę powołać do życia objekt klasy aaa:
aaa s = new aaa();
Ale tak to nie działa... w jaki sposób należny taki obiekt utworzyć?

0

Tutaj

aaa s = new aaa();

wywołujesz konstruktor bezparametrowy, a wklasie aaa takowego nie ma.

0

No tak rozumiem już mój błąd tylko chcę przez ten konstruktor wczytać tablicę liczb. Jak to zrobić czy ta tablica musi mieć z góry określony rozmiar bo np. tak nie mogę:

aaa s = new aaa(1,2,3,4,5);
0

A od kiedy coś takiego: 1,2,3,4,5 jest tablicą?

int tablica[] = {1,2,3,4,5};
aaa s   = new aaa(tablica);
0

Jeżeli podajesz:

aaa s = new aaa(1,2,3,4,5);

To twoja tablica będzie miała rozmiar taki sam jak podana w argumencie.

Pole w klasie wskazuje na tablicę, którą przekażesz w konstruktorze. Nie ma więc ograniczeń dla wielkości tablicy w klasie.

0

Dzięki ten etap już mam teraz powiem do czego mi to było potrzebne: mam tablice potem podaje pewien jej przedział np 1-3 czyli od elementu 1 do 3 i program ma mi obliczyć sumę elementów w tej przestrzeni. Zrobiłem to z użyciem pętli którą przelatuję po tych elementach problem w tym, że program ma działać w czasie stałym, czyli czas wykonywania ma być niezależny od ilości danych a przy rozwiązaniu z pętlą wydaje mi się, że tak nie jest bo przy danych 1-2 będzie szybciej niż np przy 1-1000. Mam rację czy się mylę? Można to rozwiązać jakoś inaczej?

I drugie pytanie co znaczy obliczenia pre-procesujące? Wygooglować tego terminu za bardzo nie mogę a mam takie polecenie by w razie potrzeby wykonać takie obliczenia.

0

Najprostszy algorytm jaki przychodzi mi do głowy, to zapamiętać dla każdej liczby sumę liczb z jej prawej strony. Liczysz to przy wczytywaniu tablicy. Najdłużej trwa zliczenie dla elementu 0, a potem tylko odejmujesz wartość kolejnej liczby.

Przykład:

20 8 -3 15  1  2  4 -10 //tablica
17 9 12 -3 -4 -6 -10 0 //suma liczb z prawej strony

Aby policzyć sumę liczb w dowolnym przedziale bierzesz liczbę z początku przedziału, dodajesz do niej sumę liczb z jej prawej strony i odejmujesz sumę liczb z prawej strony liczby z końca przedziału. Przykładowo suma liczb dla przedziału 2 - 6:
-3 + 12 - (-10) = 19
-3+15+1+2+4 = 19

Mam nadzieję, że zrozumiałe. ;-)

0

Polecam własną implementację drzewa. Podpowiem tylko, że zamiast inta składujesz obiekty:

class TreeNode{
    int indexInArray; //pozycja w tablicy
    int value;  // wartość
    int sumLeft;  // suma po lewej
    int sumRight; // suma po prawej
    TreeNode leftLeaf; // element z lewej
    TreeNode rightLeaf; // element z prawej
}

Drzewo jest niemodyfikowalne i powstaje na bazie tablicy intów przekazanej w konstruktorze. Operacja tworzenia drzewa jest kosztowna bo wymaga policzenia sum, ale dostęp będzie realizowany

1 użytkowników online, w tym zalogowanych: 0, gości: 1