• 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

0 głosów
102 wizyt
pytanie zadane 12 grudnia 2018 w SPOJ przez coderCpp93 Gaduła (3,990 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 (114,060 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 (3,990 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 Hipcio Szeryf (98,160 p.)
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 Pasjonat (19,610 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ź 694 wizyt
pytanie zadane 4 czerwca 2017 w Java przez Dethavel Początkujący (280 p.)
+1 głos
1 odpowiedź 397 wizyt
pytanie zadane 30 listopada 2016 w C i C++ przez Wiciorny Maniak (66,560 p.)
0 głosów
0 odpowiedzi 47 wizyt
pytanie zadane 14 maja 2018 w SPOJ przez coderCpp93 Gaduła (3,990 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

65,727 zapytań

112,367 odpowiedzi

237,225 komentarzy

46,687 pasjonatów

Przeglądających: 115
Pasjonatów: 0 Gości: 115

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...