Wstęp do programowania / Ćwiczenia 3: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Daria (dyskusja | edycje)
Wiekszosc poprawek po wizycie u Piotra (ale jeszcze nie wszystkie)
Daria (dyskusja | edycje)
Polskie litery w nazwach funkcji
Linia 8: Linia 8:
'''Rozwiązanie 1'''   
'''Rozwiązanie 1'''   
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''function''' ZnajdzPierwsze(N,x:integer; A:array[1..N] of integer):integer;
  '''function''' ZnajdźPierwsze(N,x:integer; A:array[1..N] of integer):integer;
//Tablica A posortowana niemalejąco; szukamy pierwszego wystąpienia x w A
  '''var''' l,p,s : integer;
  '''var''' l,p,s : integer;
  '''begin'''
  '''begin'''
Linia 39: Linia 40:
'''Rozwiązanie 1'''   
'''Rozwiązanie 1'''   
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''function''' ZnajdzOstatnie(N,x:integer; A:array[1..N] of integer):integer;
  '''function''' ZnajdźOstatnie(N,x:integer; A:array[1..N] of integer):integer;
//Tablica A posortowana niemalejąco; szukamy ostatniego wystąpienia x w A
  '''var''' l,p,s : integer;
  '''var''' l,p,s : integer;
  '''begin'''
  '''begin'''
Linia 50: Linia 52:
   '''end''';
   '''end''';
   '''if''' A[l] = x '''then''' ZnajdzOstatnie:=l
   '''if''' A[l] = x '''then''' ZnajdzOstatnie:=l
   '''else''' ZnajdzOstatnie:=0;
   '''else''' ZnajdźOstatnie:=0;
  '''end''';
  '''end''';
''Koszt czasowy'': logarytmiczny względem N
''Koszt czasowy'': logarytmiczny względem N
Linia 68: Linia 70:
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1'''   
'''Wskazówka 1'''   
<div class="mw-collapsible-content" style="display:none">Trzeba użyc wyszukiwania binarnego a nie liniowego.
<div class="mw-collapsible-content" style="display:none">Trzeba użyć wyszukiwania binarnego a nie liniowego.
</div>
</div>
</div>
</div>
Linia 74: Linia 76:
'''Rozwiązanie 1'''   
'''Rozwiązanie 1'''   
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''function''' LiczbaWystapien(N,x:integer; A:array[1..N] of integer):integer;
  '''function''' LiczbaWystąpień(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: integer;
  '''var''' p,l: integer;
  '''begin'''
  '''begin'''
   l:= ZnajdzPierwsze(N,A,x);
   l:= ZnajdźPierwsze(N,A,x);
   p:= ZnajdzPierwsze(N,A,x);
   p:= ZnajdźPierwsze(N,A,x);
   '''if''' l <> 0 '''then''' LiczbaWystapien:=p-l+1;
   '''if''' l <> 0 '''then''' LiczbaWystąpień:=p-l+1;
  '''end''';
  '''end''';
''Koszt czasowy'': logarytmiczny względem N
''Koszt czasowy'': logarytmiczny względem N
Linia 98: Linia 101:
'''Rozwiązanie 1'''   
'''Rozwiązanie 1'''   
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''function''' Rowny(N:integer; A:array[1..N] of integer):integer;
  '''function''' Równy(N:integer; A:array[1..N] of integer):integer;
//Tablica A posortowana rosnąco; szukamy i, takiego że A[i]=i
  '''var''' p,l,s: integer;
  '''var''' p,l,s: integer;
  '''begin'''
  '''begin'''
Linia 108: Linia 112:
     '''else''' p:=s;
     '''else''' p:=s;
   '''end''';
   '''end''';
   '''if''' (A[l]=l) '''then''' Rowny:=l
   '''if''' (A[l]=l) '''then''' Równy:=l
   '''else''' Rowny:=0;
   '''else''' Równy:=0;
  '''end''';
  '''end''';
Dla tablic posortowanych niemalejąco to rozwiązanie nie działa.
Dla tablic posortowanych niemalejąco to rozwiązanie nie działa.
Linia 120: Linia 124:


== Zadanie 5 (Maksimum w ciągu bitonicznym)==
== 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 &le; i &le; N, takie że dla wszystkich k, takich że 1 \le; k < i zachodzi A[k] < A[k+1] a dla wszystkich k, takich że  i \le; k < N  zachodzi A[k] > A[k+1]). Znajdź maksimum w tym ciągu.
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 &le; i &le; N, takie że dla wszystkich k, takich że 1 &le; k < i zachodzi A[k] < A[k+1] a dla wszystkich k, takich że  i &le; k < N  zachodzi A[k] > A[k+1]). Znajdź maksimum w tym ciągu.


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Linia 131: Linia 135:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''function''' MaksBitoniczny(N:integer; A:array[1..N] of integer):integer;
  '''function''' MaksBitoniczny(N:integer; A:array[1..N] of integer):integer;
//Tablica A zawiera ciąg bitoniczny; szukamy maksimum w tym ciągu
  '''var''' p,l,s: integer;
  '''var''' p,l,s: integer;
  '''begin'''
  '''begin'''
Linia 164: Linia 169:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''function''' SufitZPierwiastka1(x:integer):integer;
  '''function''' SufitZPierwiastka1(x:integer):integer;
//Dla x > 0 wyznaczamy sufit z pierwiastka z x
  '''var''' i: integer;
  '''var''' i: integer;
  '''begin'''
  '''begin'''
   i:=1;  
   i:=1;  
   '''while''' x > i*i '''do''' i := i+1;
   '''while''' x > i*i '''do''' i := i+1;
   SufitPierwiastka1 := i;
   SufitZPierwiastka1 := i;
  '''end''';
  '''end''';
''Koszt czasowy'': liniowy względem N
''Koszt czasowy'': liniowy względem N
Linia 184: Linia 190:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''function''' SufitZPierwiastka2(x:Real):integer;
  '''function''' SufitZPierwiastka2(x:Real):integer;
//Dla x > 0 wyznaczamy sufit z pierwiastka z x
  '''var''' l,p,s : integer;
  '''var''' l,p,s : integer;
  '''begin'''
  '''begin'''
Linia 193: Linia 200:
     '''else''' p:=s;
     '''else''' p:=s;
   '''end''';
   '''end''';
   SufitPierwiastka2:=l;
   SufitZPierwiastka2:=l;
  '''end''';
  '''end''';
''Koszt czasowy'': logarytmiczny względem N
''Koszt czasowy'': logarytmiczny względem N
Linia 212: Linia 219:
'''Rozwiązanie 3'''   
'''Rozwiązanie 3'''   
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''function''' PodlogaZPierwiastka(x:Real):integer;
  '''function''' PodłogaZPierwiastka(x:Real):integer;
//Dla x > 0 wyznaczamy podłogę z pierwiastka z x
  '''var''' l,p,s : integer;
  '''var''' l,p,s : integer;
  '''begin'''
  '''begin'''
Linia 222: Linia 230:
     '''else''' l:=s;
     '''else''' l:=s;
   '''end''';
   '''end''';
   SufitPierwiastka2:=l;
   PodłogaZPierwiastka:=l;
  '''end''';
  '''end''';
Uwaga: porównaj różnice między Rozwiązaniami 2 i 3 oraz funkcjami ZnajdzPierwsze, ZnajdzOstatnie z Zadania 1 i 2.
Uwaga: porównaj różnice między Rozwiązaniami 2 i 3 oraz funkcjami ZnajdźPierwsze, ZnajdźOstatnie z Zadania 1 i 2.
   
   
''Koszt czasowy'': logarytmiczny względem N
''Koszt czasowy'': logarytmiczny względem N
Linia 243: Linia 251:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''function''' BinPower(x,n:integer):integer;
  '''function''' BinPower(x,n:integer):integer;
// Dla x,n > 0 wyznaczamy x do potęgi n
  '''var''' z,y,i: integer;
  '''var''' z,y,i: integer;
  '''begin'''
  '''begin'''
Linia 272: Linia 281:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
Zacznijmy od pomocniczej funkcji ZnajdźPierwszyWiększy(A:array[1..N] of integer; l,p,x:integer):integer, która w tablicy A, na odcinku od l do p, wyznacza indeks pierwszego elementu o wartości większej od x przy założeniu że A[p] > x.
Zacznijmy od pomocniczej funkcji ZnajdźPierwszyWiększy(A:array[1..N] of integer; l,p,x:integer):integer, która w tablicy A, na odcinku od l do p, wyznacza indeks pierwszego elementu o wartości większej od x przy założeniu że A[p] > x.
  '''function''' ZnajdzPierwszyWiekszy(A:array[1..N] of integer; l,p,x:integer):integer;
  '''function''' ZnajdźPierwszyWiększy(C:array[1..N] of integer; l,p,x:integer):integer;
  // zakładamy, że A[p] > x
  //Tablica C jest posortowana niemalejąco na odcinku od l do p, zakładamy, że C[p] > x;
//szukamy indeksu pierwszego elementu z lewej większego od x 
  '''var''' s: integer;
  '''var''' s: integer;
  '''begin'''
  '''begin'''
   '''while''' l < p '''do''' '''begin'''
   '''while''' l < p '''do''' '''begin'''
     s:=(l+p)div 2;
     s:=(l+p+1)div 2;
     '''if''' x+1 > A[s] '''then''' l:=s+1;
     '''if''' x < C[s] '''then''' p:=s-1;
     '''else''' p:=s;
     '''else''' l:=s;
   '''end''';
   '''end''';
   ZnajdźPierwszyWiększy:=l;
   '''if''' C[l] <= x '''then''' ZnajdźPierwszyWiększy:=l+1
  '''else''' ZnajdźPierwszyWiększy:=l;
  '''end''';
  '''end''';
Albo ZnajdźOstatni(x)+1


Teraz funkcja MaxNiemalejący:
Teraz funkcja MaxNiemalejący:
Linia 300: Linia 309:
     '''end'''
     '''end'''
     '''else''' '''begin'''  
     '''else''' '''begin'''  
       z:=ZnajdzPierwszyWiekszy(B,1,ib,ia);
       z:=ZnajdźPierwszyWiększy(B,1,ib,ia);
       B[z]:=A[ia];
       B[z]:=A[ia];
     '''end''';
     '''end''';
Linia 308: Linia 317:
  '''end''';
  '''end''';
Ponieważ dla każdego elementu A wykonujemy wyszukiwanie binarne w B to:
Ponieważ dla każdego elementu A wykonujemy wyszukiwanie binarne w B to:
''Koszt czasowy'': O(N×logN)
''Koszt czasowy'': O(N×logN)



Wersja z 12:38, 18 lip 2006

To są zadania na wyszukiwanie binarne.

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

Pytanko 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)

Rozwiązanie 1

Pytanko 1

Zadanie 3 (Policz liczbę wystapień 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 xεN, x > 0 (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

Rozwiązanie 1

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