You are on page 1of 29

,

,
. , '
.
' ,
. ,

,
: big O
.

production ,
,

. ,

"big O", " " " ".


, ,
. ,


.
,
,

.


(
).
, .
,
,
. , .
,
'
.
1


, .
,
,
(.. )
.
links
.
,
.
,


.
big O

, , .
.

, .
.

1:


. profilers
milliseconds
bottlenecks. ,
2

.


,
, .
' : .
milliseconds ' .
assembly
' ,
Python Ruby. , ,
" ".
,

,

.




(. 1)

. ,
.

.
, ;
1 1000,
;
, , ;
,
. ,
web
1000 ,

2000 . ,

testcases
.
,
. :
.



.
. ,
3


,
.
,
C++, . '
, C++
.
'
Javascript.
A n:
var M = A[ 0 ];
for ( var i = 0; i < n; ++i ) {
if ( A[ i ] > M ) {
M = A[ i ];
}
}

,
.
,
. ,

- ' .
:


'


( if
else if)
. , :
var M = A[ 0 ];

2 : A[ 0 ]
M ( n 1).
. for
.
:
i = 0;
i < n;

for.
for, , i
:
++i;
i < n;

, ,
4 + 2n. 4 for
2 n.
f( n ) , n,
. for ,
f( n ) = 4 + 2n.


, for,
:
if ( A[ i ] > M ) { ...

. if
, .
A[ i ] > M,
:
M = A[ i ]

f( n ) ,
n .
, A = [ 1, 2, 3, 4 ]
' , A = [ 4, 3, 2, 1 ]. ,
' .
;
; ,
A = [ 1, 2, 3, 4 ]. '
, M
.
' worst-case
analysis ' '
. , , 4
for, f( n ) = 4 + 2n + 4n = 6n + 4.
f, n,
.


,
. , ,
5

. ,


(..
AMD Intel Pentium PC MIPS
Playstation 2 ) .
"f" ""

.
, 6n + 4, : 6n 4.

(n) .
" ":

.
.
,
,
. ,

n . 4 4
n , 6n ,
. ,
4 f( n ) = 6n.
, 4 "
".
. ,
Java .
,
.

n, f( n ) = n. ,
. ,

. " "

. , C, A[ i ]
i , Pascal
. , Pascal:
M := A[ i ]

C:
if ( i >= 0 && i < n ) {
M = A[ i ];
}


.
Pascal
, Pascal 3
1 C.


.
" " "
"
. f( n ) = 2n + 8
f( n ) = n. ,
f n
,
, . ( ,
,

,
.)
.

2: n3, , 1999n,
, n = 45. ,
.


.
1. f( n ) = 5n + 12 f( n ) = n.
7

.
2. f( n ) = 109 f( n ) = 1.
109 * 1, 1
.
3. f( n ) = n2 + 3n + 112 f( n ) = n2
, n2 3n n,
.
4. f( n ) = n3 + 1999n + 1337 f( n ) = n3
n ,
n n3
1999n. n,
n3 (. 2).
5. f( n ) = n +

f( n ) = n

n
n.

1
1.
2.
3.
4.

f( n ) = n6 + 3n
f( n ) = 2n + 12
f( n ) = 3n + 2n
f( n ) = nn + n

( )
,
n .
, ;


,
.
, f( n ) = 1,
(
. ).
1 n f( n ) = n,
, ,
8

n
.

-,
. PHP
A n:
<?php
$exists = false;
for ( $i = 0; $i < n; ++$i ) {
if ( $A[ $i ] == $value ) {
$exists = true;
break;
}
}
?>


. , f( n ) = n (
"" ).
"break"
, .
,
A .
f( n ) = n.

2
PHP
n f( n ),
Javascript.
, , f( n ) = n.
Python
:
v = a[ 0 ] + a[ 1 ]

, f( n ) = 1.
C++ vector ( -)
A n :
bool duplicate = false;
for ( int i = 0; i < n; ++i ) {
for ( int j = 0; j < n; ++j ) {
if ( i != j && A[ i ] == A[ j ] ) {
duplicate = true;
break;
}
}
if ( duplicate ) {

break;
}
}

,
f( n ) = n2.
:
.
n f( n ) = n. f( n )
= n2. f( n ) = n3.

,
. ,
C:
int i;
for ( i = 0; i < n; ++i ) {
f( n );
}

f( n ) n ,

n2, n .
: ,
.

,
.

. f
, ( f( n ) ). ,
( 1 ), ( n2 ) ( n2 ) . ( n )
" ". f( n ),
, (
). , f( n ) = 2n
( n ) . 2n
( n ) " ".
:
2n,
n, .
,
:
1.
2.
3.
4.

n6 + 3n ( n6 )
2n + 12 ( 2n )
3n + 2n ( 3n )
nn + n ( nn )
10

, 1 ,
.
, ( ),
.
( n ) n. (
1 ), ( n ), ( n2 ) ( log( n ) ) .
( 1 ) , ( n )
, ( n2 ) ( log( n ) )
(
).
:
.

3:
.

.

Big-O
,
,
.
.
,
, .
.
.

11


. ,
A n ( ;)
.
.
,
.
, , 3D


, (. 3).
,

.

.
. .

Ruby. (, Ruby
,
.
.)
b = []
n.times do
m = a[ 0 ]
mi = 0
a.each_with_index do |element, i|
if element < m
m = element
mi = i
end
end
a.delete_at( mi )
b << m
end

.
( a,
m mi), (
b), .
,
,
.
,
. ,
. n
a.
a n ,
. n
, n - 1 , n - 2
12

,
.

, 1 + 2 + ... + (n - 1) + n.
" " .
( ,
) ,
.
,
,
. ,
, ,

.

.
,
,
.
n
. ,

. ,
( n2 ),
n .
, O( n2 ). O( n2 ) "big
oh " " ".
, , n2.
, . ,
( n2 ), O( n2
). ,
, ,
.
,
.
( n2 ) O( n2 ).
O( n2 ) ( n2 ). ,
( n ) O( n2 )
O( n ). ( n )
for n ,
for n ,
f( n ) = n2. ,
( a ) O( b ) b a.

.

13

n.
, .
, O( n2 ) :
n2.
n2.
.

.

3
:
1.
2.
3.
4.
5.
6.

( n ) O( n )
( n ) O( n2 )
( n2 ) O( n3 )
( n ) O( 1 )
O( 1 ) ( 1 )
O( n ) ( 1 )

1. ( n ).
O( n ) .
2. n2 n, .
3. n3 n2, .
4. 1 n, .
n ( ),

1 ( ).
5. .
6.
. . (
1 ), O( n ). O( n )
( 1 ). , ( n ) O( n ) ( 1 ).

4

O( n2 ) ( n2 ).
, Wikipedia .
O-
,
,
.
, o
. , ( n ),
n. , O( n ) O( n2 ).
14

( n ), O( n ) .
O( n2 ) ,
o( n2 ), "small oh "
.
,
,
.

5
.
. o( )
.
1.
2.
3.
4.
5.

( n ) O( n ).
( n2 ) O( n3 ).
( 1 ) O( n ).
( n ) O( 1 ).
( n ) O( 2n ).

1. , O
, .
2. O
. ,
O( n2 ) .
o( n3 ).
3. O
. O( 1 )
. O( n )
o( n ).
4.
, . ( n )
O( 1 ), n 1.
O .
5. ,
. .
2n n , O
. O(
2n ) = O( n )
.
: O-
- .

,
. , O o,
,
15

. ,
(
)
O. O
,

.

, .
.

.

. , ( n3 )
n3. ( n3 ),
( n4 ) ,
.
. ,
. , ( n3 )
( n4 ) ( n2 ). ( n ) "big omega ", ( n )
"small omega ".
,
"big oh", "big omega", "small oh" "small omega"
" "
" ".

6

O ,
.
1. ( 1 )
2.
3.
4.
5.

(
)
( n )
( n2 )
( n3 )

.
1. O( 1 ) ( 1 ). O-
O( n ). O . n
1 -
o( n ).
- ,
1 .
.
16

2. , O(
) (

) . -

O( n ), n


.
, o( n ).
( 1 ).
, ( 1 ).
3. O( n ) ( n ).
( 1 ) o( n3 ).
,
, .
4. O( n2 ) ( n2 ).
( 1 ) o( n3 )
.
5. O( n3 ) ( n3 ) .
(
n2 ) o(
n3 ).
,
.
O O

,
.
,
.
. O .

(
) "
".
n
.

.

,
.

o( )
<
O( )

( )
=
( )

( )
>
17

: O, o, ,
, O ,
.

4: n,
, log( n ). n,
, ,
, ,
, , log( n )
.
n n = 100, .

, .
,
,
.

.
.
.

(.
4). ,
, .
.
. :
2x = 1024

18

x. :
2 1024;
10. , 210 = 1024, .

. , 10 1024
log( 1024 ) " 1024".
2, .
,
.
,
. ,
2 .
: 0 1.
, .
2
.

7
.
. 2.
1.
2.
3.
4.
5.
6.

2x = 64
(22)x = 64
4x = 4
2x = 1
2x + 2x = 32
(2x) * (2x) = 64

.
1. x = 6 log( 64 ) = 6.
2. (22)x, , 22x.
2x = 6 log( 64 ) = 6
x = 3.
3. ,
4 22 (22)x = 4
22x = 4. log( 4 ) = 2 22 = 4
2x = 2. x = 1.
, 1
.
4. 0 1. log( 1 ) = 0
20 = 1 x = 0.
5.
. 2x + 2x 2 * (2x).
,
2x + 1
2x + 1 = 32. log( 32 ) = 5 x + 1 = 5 x = 4.
19

6. 2
(2x) * (2x) 22x.
22x =
64 x = 3.
: C++,
,
1,000,000
,
. ,
( n )
n = 1,000,000.

5:


.
.
; , Python,
.
. ,
5 5 * 4 * 3 * 2 * 1. "5!"
" " (
: "!!!")
def factorial( n ):
if n == 1:
return 1
return n * factorial( n - 1 )

20

.
, .

. , n
, n . ,
" " n = 5
. , n = 5, 5 ,
n 1 .
( n ).
,
. ,

f( n ) (
( n )).
5
factorial( 5 ).

.

6: . A
.
.
Luke Francl.


21


.
.
.

. : ,
. ,
,
. ,
.
.
:
def binarySearch( A, n, value ):
if n = 1:
if A[ 0 ] = value:
return true
else:
return false
if value < A[ n / 2 ]:
return binarySearch( A[ 0...( n / 2 - 1 ) ], n / 2 - 1, value )
else if value > A[ n / 2 ]:
return binarySearch( ( A[ n / 2 + 1 )...n ], n / 2 - 1, value )
else:
return true

.
, , ,
.
off-by-one 2
floor() ceil()
. ,

off-by-one,
. ,
.
.
6
.
,
" "
.
.
. ,
, ,
+ 1 - 1 .
+ 1 - 1
.
,
22

.
2, .
.

. ,
n
n / 2 .
n / 4 ,
n / 8 . ,
, 1 .
:
1.
2.
3.
4.
5.
6.
7.
8.

0 : n
1 : n / 2
2 : n / 4
3 : n / 8
...
i : n / 2i
...
: 1

i- , n / 2i .
,
.
2. i ,
n / 2i. , i

1 . i
,
:
1 = n / 2i

binarySearch() . i
.
2i :
2i = n
,
. i :
i = log( n )

log( n ) n
.

23

, . , n = 32,
32 .
1 ; : 32 16 8 4
2 1. 5 , 32.
( log( n ) ).

.
, log( n ) n,

,

.
:
,
""
.


. ,
big-O.
O( 1
), O( log( n ) ), O( n ), O( n2 ) . o, O, ,
. ,
.
. ,
.

. ,

, .
.
.

.

.

.
.
. .
,

. merge
24


. :
def merge( A, B ):
if empty( A ):
return B
if empty( B ):
return A
if A[ 0 ] < B[ 0 ]:
return concat( A[ 0 ], merge( A[ 1...A_n ], B ) )
else:
return concat( B[ 0 ], merge( A, B[ 1...B_n ] ) )

concat , "", , "",



"" ""
. , concat( 3, [ 4, 5, 6 ] ) [
3, 4, 5, 6 ]. A_n B_n
.

8
.

( for) .
(
n ), n (n = A_n + B_n).

9
merge ( n ).

. :
.
. :
def mergeSort( A, n ):
if n = 1:
return A # it is already sorted
middle = floor( n / 2 )
leftHalf = A[ 1...middle ]
rightHalf = A[ ( middle + 1 )...n ]
return merge( mergeSort( leftHalf, middle ), mergeSort( rightHalf, n
- middle ) )


, .

10

25

mergeSort. , mergeSort

. ,
" ".
, leftHalf rightHalf

(
floor).
, mergeSort.
mergeSort, ,
binarySearch. , ,
.
. ,
merge , ( n ).
, n / 2
. ,
n ( n ) .
7 .

7: .
.
mergeSort.
. mergeSort,
n.
. mergeSort
mergeSort ,
n / 2. .
, mergeSort
n / 4 ,
26

1.
,
( ,
).
,
n. , .
mergeSort
n, n.
mergeSort n / 2. n / 2 + n / 2 = n
n. , 4
n / 4,
n / 4 + n / 4 + n / 4 + n / 4 = 4n / 4 = n.
n .
, merge
.
,
n / 2 . , n / 2
n / 4 , mergeSort
(
), .
n / 2 . ,
n. ,
n / 2 (
) n / 2 .

n.
, ( n ).
,
, log( n ).
.
log( n ) ( n ),
mergeSort ( n * log( n ) ). ( n2 )
( log( n )
n, n * log( n ) n * n = n 2).
, :
.
mergeSort
.
,
.
,

.
. ,
( n * log( n ) ).
, Linux
,
27

, ( n log( n ) )
.
.
, :

.
,



, .
,
big-O

,
.


Creative Commons 3.0 Attribution.
,
, , ,
, , .
,
Creative Commons
.
,
. fugue icons.

Lea Verou. , ,
.


.

deviantART, , start-up, Zino
Kamibu
. Twitter
github , mail
.
. e-mail

.
. ,
, e-mail .
( ),
!
28


1. Cormen, Leiserson, Rivest, Stein. , MIT Press.
2. Dasgupta, , Vazirani. , McGraw-Hill Press.
3. .
.
4. .
.

29

You might also like