Pierwszy szybki algorytm znajdowania ciągu wśród liczb?

0

Cześć,
Nie oczekuję żadnego rozwiązania, potrzebuję wskazówek.
Otóż sam uczę się Kotlina na własną rękę a w szkole muszę z czasu wykonać algorytm w języku C.
Muszę zrobić program, który z wczytanych liczb znajdzie najdłuższy ciąg rosnący.
Jak działają ify wiem. Chciałbym tylko spytać, czy są jakieś ficzery w języku C aby przeprowadzić bardzo szybko taki algorytm?
Wydaje mi się, że zrobienie pętli, kilku zmiennych i kilku ifów to nie jest optymalne rozwiązanie.
Wystarczą mi hasła, którymi warto się zainteresować.
Z góry dziękuję, pozdrawiam.

0

Nie ma żadnej magicznej metody. Iterujesz sobie i dopóki a[i]<a[i+1] to zliczasz sobie długość rosnącego podciągu a kiedy warunek przestaje być spełniony porównujesz wynik z aktualnie najdłuższym podciągiem.

0

Rozumiem, że przy metodzie scanf moje cyferki po wpisaniu trafiają na stos i po prostu po nim przejechać? Czytałem coś o problemach z końcem wpisywania do scanf'a, koniec linii? To nie jest tak, że enter kończy wpisywanie? Przepraszam za te banalne pytania ale usiadłem do tego C pierwszy raz (wcześniej pare godzin spędziłem z C++) no i nie chcę od razu źle zaczynać.

0

To jaki format ma I/O to zależy od treści zadania.

0

W inpucie mam ograniczenie do 10^5 cyfr.
W Javie mógłbym po prostu użyć scannera i sprawdzać czy jest coś dalej i manewrować, czy to dodać czy nie.
Jestem w stanie zrobić podobnie/ograniczyć od góry scanf? Z drugiej strony czy takie ograniczenie 105 nie spowalniałoby programu? Nie wiem czy zostaną tam wpisane 4 cyfry czy może jednak 104.

0

Możesz czytać scanfem dopóki cokolwiek uda mu się wczytać. scanf() zwraca jako wynik liczbę dopasowanych zmiennych, jak czytasz "%d" i zwróci ci 0 to znaczy że już nic nie zostało do wczytania

0
    
int n, sum = 0;

while (scanf("%d", &n) != 0) {
   sum = sum + n;
}

Rozumiem, że nie chodzi o coś takiego? W każdym razie to sprawdzenie nie działa, zapewne jest źle skonstruowane.
Co jeśli wpisanymi cyframi będzie 0? Nie koliduje to z wynikiem scanf?
Dodatkowo, czy w takim zadaniu powinienem użyć tablicy i w niej wszystkie liczby zapisać? Wtedy musiałbym zrobić rozmiar taki jaki mam limit aby wrazie co pomieściło wszystko.
Wydaje mi się, że jeśli miałbym odgórne ograniczenie to mógłbym na bieżąco sprawdzać cyfry do mojego algorytmu.

0

Nie musisz niczego tablicować, nie ma potrzeby. A pętla jest ok, tylko pamiętaj że dopiero EOF kończy czytanie wejścia. Przekieruj sobie dane z pliku na przykład jeśli nie umiesz wywołać EOFa klawiaturą.

0

Dzięki @Shalom za podpowiedzi.
Mam jednak dwa pytanka:

  1. Nie skorzystam z wpisywania elementów do tablicy ale czy taki zabieg spowalnia algorytm? Nawet jeśli godzi o setne części sekundy ale robi to czy to tylko pamięć wykorzystywana w programie?

  2. Mam problem z sytuacją gdy mam ciąg przykładowy: 3 2 0 0 4 5 6. Chodzi o to, że nie potrafię postawić warunku, który zliczy mi pierwsze zero. Dokładniej, potrzebuję pomysłu na warunek, który mógłby dodać mi poprzednie 0 do sumy ilości cyfr. Gdyby było tak: 3 2 0 4 5 6 to wszystko jest okej. Trzecia zmienna?

0
  1. Oczywiście że tak, bo przeciez to są dodatkowe operacje mov na poziomie asemblera. Jeszcze gorzej jak danych będzie dużo i potem trzeba je będzie jeszcze z tej pamieci odczytywać!
  2. Nie rozumiem problemu. Szukasz ciagu rosnącego. 3<2 więc aktualny podciąg ma długość 1, potem 2<0 więc znów podciąg ma długość 1, następnie 0=0 więc znów podciąg o długości 1, następnie wreszcie 0<4 więc pętla zaczyna sie obracać i mamy podciąg długości 2 więc zastępuje on najdłuższy znany podciąg (bo ten miał długośc 1), potem 4<5 więc długości 3, potem 5<6 więc długości 4 i koniec listy wiec najdłuższy podciag ma długość 4.
0

Zgoda a jeśli chciałbym zmienić lekko założenie, że ciąg ma być niemalejący czyli przy cyfrach:

3 2 0 0 4 5 6

Ilość elementów to 5. Ostatecznie pewnie dałoby się zrobić trzecią zmienną ale co jeśli cyfry będą wyglądały tak:

3 2 0 0 0 0 4 5 6

Wtedy w ciągu niemalejącym będzie 7 elementów. W tym przypadku trzecia zmienna chyba przestaje być pomocna, oczywiście cyfry:

3 2 1 1 1 1 4 5 6

To ciąg 7 elementowy.

0

Nadal nie rozumiem gdzie ty masz jakis problem. Możesz pokazać kod który napisałeś i nie działa? Bo mam wrażenie że szukasz problemu tam gdzie w ogóle go nie ma.

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