Jak NAJSZYBCIEJ pobrać dane z pliku?

2011-10-18 23:23
0

Witam. Biorę pierwszy raz udział w olimpiadzie informatycznej. Jestem w trakcie rozwiązywania jednego z zadań. I wszystko ładnie pięknie wychodzi:) wyniki prawidłowe zarówna dla małych jak i dużych danych.

Program podczas testowania jest uruchamiany na zasadzie:
program.exe <dane.in>dane.out w konsoli

Dla małych danych program wykonuje się w 0.000s dla większych danych (mówie tu o łańcuchach znaków o długości do 1 000 000) już tak kolorowo nie jest:( wyniki ok ale czas duży;( dla naprawde wielkich danych dochodzi do 20s ;( gdzie limit wynosi 5s...

Do wczytywania używam zwykłego cin.. a dane zapisuje po prostu w tablicy charów..

No więc moje pytanie brzmi: Czy istnieje jakiś szybszy sposób na wczytanie danych?

Pozostało 580 znaków

2011-10-18 23:31
0

Wywal cin i użyj scanf oraz fgets. A i tak najważniejsze jest algo.


Mógłbyś chociaż krótko opisac jak użyc tych funkcji? Nigdy ich nie używałem. - mto9 2011-10-18 23:34

Pozostało 580 znaków

2011-10-18 23:31
0

Wyłącz synchronizację:
http://www.cplusplus.com/refe[...]eam/ios_base/sync_with_stdio/

Ewentualnie możesz używać printf i scanf. GCC optymalizuje printfy i scanfy, tzn jeżeli masz np printf("%d\n", liczba); to GCC zamienia to wprost na kod, który wypisuje to co ma wypisywać, tak że ciąg "%d\n" jest w kodzie wynikowym niewykorzystywany.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-10-18 23:33
0

Zdecydowanie tak, fread ze stdin do buforów o odpowiedniej wielkości (parę kb zwykle jest ok). Cin jest wygodny, szczególnie przy przeładowaniu operatorów dla własnych klas, ale szybkością to nie grzeszy, szczególnie bez optymalizacji (pamiętaj także, że cały STL jest przygotowany pod kompilację z włączoną optymalizacją). Chwilowo może pomóc wyłączenie synchronizacji ze stdio.

Pozostało 580 znaków

2011-10-18 23:41
0

Jak użyc funkcji fread w moim przykładzie?

Sory za post pod postem ale nie wiem czemu mi to nie działa:

 unsigned int n;
    scanf("%u",&n);

    char name1[n+1],name2[n+1];
    fgets(name1,n,stdin);
    fgets(name2,n,stdin);

;(

Pozostało 580 znaków

2011-10-19 03:07
0

Co znaczy "nie działa"? Spróbuj w fgets dać n+1
To też jest dyskusyjne(chociaż przy gcc zadziała):

char name1[n+1],name2[n+1];

No i nie licz na to, że zmiana sposobu wczytywania, aż tak skróci czas. Problem nie jest po stronie wczytywania, a algorytmu.


edytowany 3x, ostatnio: byku_guzio, 2011-10-19 03:29
zmiana sposobu wczytywania może mieć wielki wpływ na czas wykonania, przykładem wiele zadań SPOJ'a (niestety) - Xitami 2011-10-19 11:50

Pozostało 580 znaków

2011-10-19 10:14
0

dodanie "n+1" nie pomaga;( chodzi to to ze uruchamiam program, in czeka na podane danych- funkcja scanf no i klikne np 3 i enter nastepnie znowu czeka na podanie danych 11 funkcja fgets podam jakis tam ciag a 2 funkcja fgets tak jakby sie nie wywoływała.

Pozostało 580 znaków

2011-10-19 10:41
0

powiedz coś więcej o "dane.in", co tam siedzi? liczba i dwa być może nawet bardzo długie dwa wiersze ?

Pozostało 580 znaków

2011-10-19 10:47
0

plik ma taka strukturę :

5
ABCDE
EDCBA

oczywiście o długości łańcuchów świadczy liczba i może ona wynosi max 1 000 000..

edytowany 1x, ostatnio: mto9, 2011-10-19 10:50

Pozostało 580 znaków

2011-10-19 10:51
0

Wziąłeś pod uwagę to, że scanf nie pobiera '\n', więc pierwszy fgets bierze samo '\n'?

Pozostało 580 znaków

2011-10-19 10:54
0

Nie wziołem, gdyż nigdy nie używałem tych funkcji... czy wrzucenie getchar() po scanfie pomoże? czy lepiej zrobi to inaczej?

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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