Wstęp do programowania / Ćwiczenia 5: Różnice pomiędzy wersjami
Linia 103: | Linia 103: | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
Wariant rozwiązania, w którym większość kodu ZnajdźPierwsze i ZnajdźOstatnie jest wpisana wprost do treści procedury: | |||
'''function''' LiczbaWystąpień1(N,x:integer; A:array[1..N] of integer):integer; | |||
//Tablica A posortowana niemalejąco; wyznaczamy liczbę wystąpień x w A | |||
'''var''' p,l,p1,l1: integer; | |||
'''begin''' | |||
l1:=1; p1:=n; | |||
'''while''' l1<>p1 '''do''' | |||
'''begin''' | |||
s:=(l1+p1) '''div''' 2; | |||
'''if''' A[s]<x '''then''' l:=s+1 | |||
'''else''' p:=s | |||
'''end'''; | |||
l:=l1; | |||
l1:=1; p1:=n; | |||
'''while''' l1<>p1 '''do''' | |||
'''begin''' | |||
s:=(l1+p1+1) '''div''' 2; | |||
'''if''' A[s]>x '''then''' p:=s-1 | |||
'''else''' l:=s | |||
'''end'''; | |||
p:=l1; | |||
LiczbaWystąpień1:=p-l+1 | |||
'''end'''; | |||
Uwaga: czy kod ten jest poprawny, gdy x'a nie ma w tablicy? | Uwaga: czy kod ten jest poprawny, gdy x'a nie ma w tablicy? |
Wersja z 15:37, 6 gru 2008
<<< Powrót do modułu Składnia i semantyka instrukcji
To są zadania na wyszukiwanie binarne.
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
Zadanie 1 (Pierwsze wystąpienie x)
Dana jest posortowana niemalejąco tablica A typu array[1..N] of integer i x typu integer. Znajdź miejsce pierwszego wystąpienia x (lub 0 gdy nie ma żadnego x)
Rozwiązanie 1
Ćwiczenie 1
Zadanie 2 (Ostatnie wystąpienie x)
Dana jest posortowana niemalejąco tablica A typu array[1..N] of integer i x typu integer. Znajdź miejsce ostatniego wystąpienia x (lub 0 gdy nie ma żadnego x)
Wskazówka 1
Rozwiązanie 1
Ćwiczenie 1
Zadanie 3 (Liczba wystąpień x)
Dana jest posortowana niemalejąco tablica A typu array[1..N] of integer i x typu integer. Wyznacz liczbę wystąpień x w tablicy A.
Wskazówka 1
Rozwiązanie 1
Zadanie 4 (Wartość równa indeksowi)
Dana jest posortowana rosnąco tablica A typu array[1..N] of integer. Sprawdź czy występuje w niej element o wartości równej swojemu indeksowi. Jeśli tak, to wyznacz ten indeks, jeśli nie, to funkcja ma dać wartość 0.
Wskazówka 1
Rozwiązanie 1
Zadanie 5 (Maksimum w ciągu bitonicznym)
Dana jest tablica A typu array[1..N] of integer, w której wartości ułożone są w ciąg bitoniczny (czyli istnieje 1 ≤ i ≤ N, takie że dla wszystkich k, takich że 1 ≤ k < i zachodzi A[k] < A[k+1] a dla wszystkich k, takich że i ≤ k < N zachodzi A[k] > A[k+1]). Znajdź maksimum w tym ciągu.
Wskazówka 1
Rozwiązanie 1
Zadanie 6 (Pierwiastek z x)
Napisz program obliczający sufit z pierwiastka z x, dla (oczywiście bez operacji pierwiastek).
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Inna wersja zadania
A jak znaleźć podłogę z pierwiastka z x ?
Wskazówka 3
Rozwiązanie 3
Zadanie 7 (BinPower)
Dla zadanych x,n > 0 wyznacz xn (oczywiscie bez exp i ln).
Wskazówka 1
Wskazówka 2
Rozwiązanie 1
O ile istnieją proste algorytmy mnożące w czasie wielomianowym (choćby szkolne słupki), to w przypadku potęgowania nie ma oczywistego szybkiego algorytmu potęgującego. Można spytać, po co usprawniać kod potęgowania, gdy wykładniki w naturze wcale nie sa takie duże. Nic bardziej mylnego! W jednym z najpopularniejszych algorytmów kryptograficznych - kodowaniu RSA - używa się potęgowania o wykładnikach będących bardzo dużymi liczbami (zazwyczaj stukilkudziesięciocyfrowymi!). Poleglibyśmy sromotnie, gdybyśmy próbowali mnożyć odpowiednią liczbę razy przez siebie podstawę potęgowania.
Zadanie 8 (Najdłuższy podciąg niemalejący)
Dana jest tablica A typu array[1..N] of integer, N > 1. Należy obliczyć długość najdłuższego podciągu niemalejącego w A.
Wskazówka 1
Rozwiązanie 1
Ćwiczenie 1