• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rozwiązanie działa w C++, a w Java nie - transponowanie macierzy, SPOJ

Cloud VPS
0 głosów
759 wizyt
pytanie zadane 12 grudnia 2018 w SPOJ przez coderCpp93 Gaduła (4,200 p.)

Witam.

 Zadanie co prawda rozwiązałem w C++, ale w Javie SPOJ zadeklarował, że przekroczono limit czasu, co gorsza program okazał się szalenie pamięciożerny - 4468M. W tym samym czasie rozwiązanie w C++ przeszło idealnie - 2.7M i czas 0.00, a użyłem ten sam algorytm. Naturalne rodzi się pytanie, od czego to zależy, czy maszyna wirtualna Javy zużywa tyle zasobów systemu?

Słyszałem, że Java niezbyt nadaje się do rozwiązań algorytmicznych w przeciwieństwie do C++. Sam zacząłem trochę to odczuwać, ale dopiero uczę się Javy, więc daję jej duże szanse. Jeśli, chodzi o kod to nie chcę spojlerować rozwiązania. 

Dzięki za wszelkie odpowiedzi

komentarz 12 grudnia 2018 przez RafalS VIP (122,820 p.)
Pokaż kod. Może trzymasz referencje do niepotrzebnych obiektów i garbage collector nie może Ci pomoc.
komentarz 12 grudnia 2018 przez coderCpp93 Gaduła (4,200 p.)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int rows = scanner.nextInt();
        int columns = scanner.nextInt();

        int[][] table = new int[rows][columns];
        int[][] extrasTable = new int[columns][rows];

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                table[i][j] = scanner.nextInt();

                extrasTable[j][i] = table[i][j];
            }
        }

        for (int i = 0; i < columns; i++) {
            for (int j = 0; j < rows; j++)
                System.out.print(extrasTable[i][j] + " ");

            System.out.println();
        }

        scanner.close();
    }
}

Oto kod.

komentarz 13 grudnia 2018 przez niezalogowany
Jeżeli chcesz zaliczyć kod w sensowym czasie zamiast parsowania danych Scannerem wczytaj dane za pomocą BufferedReader. Zamiast tablicy typu int zrób tablicę stringów. Łatwo będzie można podzielić i przypisać pobraną linię z BufferedReadera. Wynik sklej w całość StringBuilder'em. Na pamięć chyba nie da się nic poradzić.

1 odpowiedź

0 głosów
odpowiedź 13 grudnia 2018 przez jankustosz1 Nałogowiec (36,960 p.)
Wystarczy Ci jedna tablica. Wywal table to może pamięci styknie.

Btw. Maksymalnie ma to 200*200 elementów czyli 40000. Nawet jeżeli int w javie by ważył 10 bajtow to i tak użyłoby się tylko 400kb. Ewidentnie problem leży w czyns innyn, typu wczytywanie danych.

Podobne pytania

0 głosów
1 odpowiedź 108 wizyt
pytanie zadane 6 lutego w SPOJ przez MarcelM Początkujący (450 p.)
+1 głos
1 odpowiedź 581 wizyt
pytanie zadane 13 grudnia 2019 w Systemy operacyjne, programy przez disi22 Początkujący (300 p.)
0 głosów
1 odpowiedź 1,004 wizyt
pytanie zadane 4 czerwca 2017 w Java przez Dethavel Początkujący (280 p.)

93,464 zapytań

142,459 odpowiedzi

322,730 komentarzy

62,844 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...