zagwozdka (może lamerska)... ^^

0

Hej,
mam pytanie... może lamerskie ciut, ale dla mnie ważne... tak mi się wydaje... Załóżmy, że chcemy wprowadzić listę liczb (sugeruję się SPOJem)... możemy ją wprowadzić na dwa sposoby:

  1. po kolei, czyli 1 Enter 2 Enter 3 Enter... 5 Enter...
  2. możemy wprowadzić jako string "1 2 3 4 5" i wtedy zasplittować takiego stringa...

Pytania:

  1. Jak to wygląda z obliczeniowego punktu widzenia... ??
  2. Czy uruchamianie 5 razy wejścia nie jest bardziej czasochłonne jak uruchomienie jeden raz z nieco inną daną... ??
  3. Czy istnieją jakieś przykłady wprowadzanie jednoczesnego danych, tak aby wprowadzić za jednym zamachem tablicę danych, bez żadnych kroków pośrednich ??

Jak macie jakieś materiały i macie ochotę, to podlinkujcie... :)

1

Jak to wygląda z obliczeniowego punktu widzenia?

Co to znaczy?

Czy uruchamianie 5 razy wejścia nie jest bardziej czasochłonne jak uruchomienie jeden raz z nieco inną daną?

W którym przypadku masz wejście uruchamiane pięć razy?

Czy istnieją jakieś przykłady wprowadzanie jednoczesnego danych, tak aby wprowadzić za jednym zamachem tablicę danych, bez żadnych kroków pośrednich?

Co to znaczy?

4

Operacje IO są optymalizowane na poziome STL więc to nie twój problem jakie są wywołania systemowe.
Przykładowo takie coś:

std::vector<int> data;
std::copy(std::istream_iterator<int>(std::cin), {}, std::back_inserter(data));

Zadziała tak samo dla obu wypadków.

Większość zadań na SPOJ i pokrewnych operacje IO mają nikłe znacznie.
Głównym problemem jest redukcja złożoność algorytmu rozwiązującego problem (notacja "o").

Niektóre zadania SPOJ mają narzut na operacje IO (duże dane), ale są one w mniejszości i proste standardowe sztuczki rozwiązują problem.

Zasadniczo:

  1. na początku main dodawaj:
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
  1. nie używaj endl zamiast tego używaj '\n'
  2. czytaj poprawnie dane - zgodnie z opisem
  3. wypisuj tylko dane opisane w zadaniu. Żadnego "wprowadź x".
1

Jeżeli dane zostały wprowadzone jako całość, czy np. poprzez potoki unixowe na stdin twojego programu, to system operacyjny zbuforuje te dane po stronie jądra. Do tego jeżeli korzystasz operacji bibliotecznych, a nie systemowych (read/write) to dane zostaną po raz drugi zbuforowane po stronie programu.
Jeżeli dane są wprowadzane interaktywnie, to najprawdopodobniej więcej czasu program spędzi śpiąc czekając na dane, niż je czytając.

  1. Czy uruchamianie 5 razy wejścia nie jest bardziej czasochłonne jak uruchomienie jeden raz z nieco inną daną... ??

Jeżeli korzystasz funkcji systemowe read to jest, gdyż każde skutkuje wejściem do jądra. Jeżeli korzystasz z funkcji bibliotecznych, to czytasz dane zbuforowane w strumieniu po stronie aplikacji.

Oczywiście różne funkcje odczytujące dane, mogą mieć różną logikę, a więc różne narzuty.

0
nalik napisał(a):

Oczywiście różne funkcje odczytujące dane, mogą mieć różną logikę, a więc różne narzuty.

A twórcy różnych języków (środowisk programistycznych) w dokumentacjach udostępniają sposoby tworzenia wbudowanych funkcji ?? Pytam ponieważ nigdy się tym nie interesowałem, a właśnie chyba zaczynam... :) i jak to wygląda w praktyce ?? w różnych językach mają różne implementacje tych samych odpowiedników ??

1
hurgadion napisał(a):
nalik napisał(a):

Oczywiście różne funkcje odczytujące dane, mogą mieć różną logikę, a więc różne narzuty.

A twórcy różnych języków (środowisk programistycznych) w dokumentacjach udostępniają sposoby tworzenia wbudowanych funkcji ?? Pytam ponieważ nigdy się tym nie interesowałem, a właśnie chyba zaczynam... :) i jak to wygląda w praktyce ?? w różnych językach mają różne implementacje tych samych odpowiedników ??

Nie do końca rozumiem pytanie. Jeżeli mówimy o językach jak C czy C++, to wbudowane funkcje są zwyczajnymi funkcjami jak każde inne i są częścią biblioteki standardowej, z którą linkuje się prawie każdy program. Jak mówimy o czymś jak python czy ruby, to mogą mieć implementację natywną (tj. np w c) i dokumentacja języka programowania zazwyczaj opisuje jak tworzyć własne natywne moduły. Funkcje takie korzystają z API/ABI systemu operacyjnego, by ukryć złożoność i zoptymalizować wejście/wyjście. API i ABI systemu operacyjnego jest jak najbardziej znane i udokumentowane.

Myślę, że jednak skorzystanie z funkcji standardowych będzie odpowiednie.

Inna sprawa, jeżeli czytasz te dane z pliku, to możesz użyć w tym celu funkcji, która zamapuje cały plik na pamięć, np mmap. Tyle, że to już nie jest przenośne.

0
Patryk27 napisał(a):

Czy istnieją jakieś przykłady wprowadzanie jednoczesnego danych, tak aby wprowadzić za jednym zamachem tablicę danych, bez żadnych kroków pośrednich?

Co to znaczy?

To najtrudniejsze pytanie (a jeszcze dokładnie nie wiem o co mi chodzi ;)), ale spróbujmy...

Załóżmy, że mamy listę a = [a1, a2, a3, a4, a5], gdzie a_i, i=1,...,5 jest listą o pewnej długości... może mieć długość 100, ale też duuużo większą... i mamy teraz wątek Thread (skupiam się na Javie, bo liznąłem w niej ten temat ciut), który potrafi obliczyć sumę listy... Tworzymy teraz pięć instancji Thread_i, i=1,..,5 (wątek jest chyba objektem ??)... i teraz tak... mamy za zadanie policzyć sumę wszystkich elementów listy a, dla każdego elementu listy osobno... Mamy pięć wątków, więc możemy te wątki odpalić... I teraz najważniejsza część... Czy możemy te wątki odpalić równocześnie ?? Czy musimy je odpalać po kolei, i ich działanie będzie zachodzić na siebie... ??

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