lewa priorytetem

Transkrypt

lewa priorytetem
Teoria obliczeń:
ciągi, notacja 0
Wykład 7
Ο(n log n)
Σ
Ciąg to funkcja określona na zbiorze liczb naturalnych N
a1 , a 2 ,....., a n −1 , a n , a n +1 ,......
Ciąg opisuje się jako listę:
w której dla każdej liczby naturalnej n ∈ N obiekt a n
wartość.
Ważne
ciągi:
an= n
1/ 2
an= n
a n = log 2 n
a n = n2
Identyczność
Pierwiastek kwadratowy
Kwadrat
Logarytm przy podstawie 2
Wykładnicza o podstawie 2
Szczególne
ciągi w teorii
wydajności
algorytmów:
a n = n log 2 n
a n = n!
an = nn
ma określoną
a n = 2n
Ile wyniesie
czas
oczekiwania na
wynik jeśli
obliczenie /
przetwarzanie
dotyczy n
elementów?
2
D. Makowiec: Programowanie dla I BioInf
2013-04-08
Zadanie: Przetestuj szybkość wzrostu następujących ciągów:
Dane:
liczba naturalna n i przepisy na obliczenie wyrazów
kolejnych ciągów:
iden, kwadr, pierw, log_2 , pot_2, nlogn, n_n, silnia
Wynik:
wyświetlenie 10 pierwszych wyrazów ciągów
Dla n=0 do 10 z krokiem 1wykonuj
oblicz wyraz kolejny badanego ciągu
wyświetl obliczenia
Operand
lewy
Operand
prawy
a+b
Operator
dwuargumentowy
D. Makowiec: Programowanie dla I BioInf
Wyrażenia
jako
kombinacje
operatorów i
operandów
n
n2
n1/ 2
log 2 n
2n
n log 2 n
nn
n!
3
2013-04-08
•Operator:
znak służący
konstrukcji wyrażeń.
2-argumentowy
2-argumentowy
1-argumentowy
2-argumentowy
2-argumentowy
2-argumentowy
1-argumentowy
1-argumentowy
D. Makowiec: Programowanie dla I BioInf
4
2013-04-08
3+5*6
* 2-arg. ma wyższy priorytet niż + 2-arg.
kolejność: zgodnie z priorytetem
Realizacja obliczenia: 3 + (5 * 6) = 3+30= 33
120 / 6 * 5
* 2-arg. i / 2-arg. mają ten sam priorytet,
kolejność: od lewego do prawego
Realizacja obliczenia : (120 / 6) * 5 = 20 * 5 =100
char * str = “Alicja”;
char ch = *str++;
++ postfixowy
ma wyższy priorytet niż * 1-arg.
Realizacja obliczenia : ch= * (str++) , czyli ch uzyskuje wartość ’l’
char * str = “Alicja”;
char ch = *++str;
++ prefixowy ma ten sam priorytet co * 1-arg,
kolejność: od prawego do lewego
Realizacja obliczenia : ch= * (++str) , czyli ch uzyskuje wartość ’l’
5
D. Makowiec: Programowanie dla I BioInf
2013-04-08
Rodzaje
operatorów:
•Matematyczne
o dodawania: + ++
-o mnożenia: * / %
•Relacji
o równości:
==
onierówności : !=
oWiększości:
> >=
oMniejszości: < <=
•Logiczne:
oKoniunkcji:
&&
oAlternatywy :
||
oNegacji:
!
•Bitowe:
oKoniunkcji :
&
oAlternatywy :
|
oAlternatywy wyłączającej ^
oNegacji:
~
oPrzesunięcia w lewo <<
oPrzesunięcia w prawo >>
•Przypisania:
o podstawowy =
o += -= *= /= %= >>= <<=
•Operator 3 argumentowy :
•?:
D. Makowiec: Programowanie dla I BioInf
&=
^= !=
6
2013-04-08
Prio
ryte
-ty
++(przedrostek) --(przedrostek )
wywołanie funkcji [ ] { }
++ (przyrostek) -- (przyrostek)
- + (operatory znaku) ~ !
sizeof *( dereferencja)
& (adres) (wszystkie jednoargumentowe)
Od prawa do lewa
operato
rów
(typ)
Od prawa do lewa
* / %
Od lewa do prawa
+
Od lewa do prawa
-
(
)
Od lewa do prawa
(dwuargumentowe)
<< >>
od
<
najwyż
szego
==
prio
ryte
-tu:
&&
Od lewa do prawa
> <=
>=
!=
&
W zasadzie kolejność działań
jest zgodna z matematyczną
intuicją, najpierw
jednoargumentowe,
potem mnożenie,
dalej dodawanie.
Od lewa do prawa
O
P
E
R
T
O
R
Ó
W
Od lewa do prawa
Od lewa do prawa
Od lewa do prawa
^
Przypisanie ma prawie
najniższy priorytet
|
Od lewa do prawa
Od lewa do prawa
Uważać na operatory bitowe
II
Od lewa do prawa
? : (operator warunkowy)
Od prawa do lewa
= *=
^=
Ł
Ą
C
Z
N
O
Ś
Ć
/=
%=
, (przecinek)
D. Makowiec: Programowanie dla I BioInf
+=
-=
<<=
>>=
&= |=
Od prawa do lewa
2013-04-21
7
Od lewa do prawa
2013-04-08
iden=n;
kwadr= n*n;
Dołączyć
bibliotekę
<cmath>
n
main
n2
pierw=sqrt( double (n ) );
n1/ 2
log_2= log2(double (n ) );
log 2 n
nlogn= n* log2(double (n ) );
n log 2 n
pot_2= 1<<n;
2n
silnia = (n == 0 )? 1 : n*silnia;
n!
for(j=0; j<n; ++j)
n_n = (n==0)? 1: n*n_n;
nn
8
D. Makowiec: Programowanie dla I BioInf
2013-04-08
unsigned bit_pot_2 ( int n){
return 1<<n;}
double iden(double x){
return x;}
double n_n( double x){
double rob=1;
for(int j=1; j<= x; ++j)
rob *=x;
return rob;}
double pierw( double x){
return sqrt(x);}
double kwadr(double x){
return x*x; }
double log_2 ( double x){
return log2( x); }
double silnia ( double x){
if ( x < 1 ) return 1;
else return x*silnia(x-1);}
funkc
je
wska
znik
farray
double pot_2 ( double x){
if ( x < 1 ) return 1;
else return 2*pot_2(x-1);}
double nlogn( double x){
return x* log2(x);}
9
D. Makowiec: Programowanie dla I BioInf
2013-04-08
wyswietl to funkcja, której parametrem
wywołania jest wskaźnik do funkcji, której
parametrem jest liczba typu double a funkcja
daje wynik typu double
void wyswietl( double (*)(double), double, int, int);
ftab to tablica wskaźników do funkcji
wymienionych na liście inicjującej
double( *ftab[])(double)=
{iden, pierw, kwadr, log_2, nlogn, pot_2, silnia, n_n};
D. Makowiec: Programowanie dla I BioInf
2013-04-08