Anda di halaman 1dari 34

Analisa Kompleksitas Algoritma

Sunu Wibirama
Referensi
✦ Cormen, T.H., Leiserson, C.E., Rivest,
R.L., Stein, C., Introduction to Algorithms
2nd Edition, Massachusetts: MIT Press,
2002
✦ Sedgewick, R., Algorithms in C++ Part
1-4, Massachusetts: Addison-Wesley
Publisher, 1998
✦ Video lecture MIT Opencourseware
ke-1: Introduction
✦ Video lecture IIT Kharagpur, India
ke-18: Complexity of Algorithm
Video lecture MIT
Opencourseware ke-1:
Introduction

Video lecture IIT


Kharagpur, India ke-18:
Complexity of Algorithm
Agenda Hari Ini

• Pentingnya Analisa Algoritma


• Prinsip Perbandingan Algoritma
• Dasar-dasar Matematika dan Teori Big-O
• Contoh Implementasi
• Kesimpulan
Apa yang pertama kali Anda menjadi
pertimbangan Anda saat membeli komputer,
selain PERFORMA?
• Kehandalan dalam menyelesaikan masalah (robustness)

• Fungsionalitas (functionality)

• Tampilan grafis (user interface)

• Daya tahan (reliability)

• Keamanan (security)

• Kesederhanaan (simplicity)

• Kemudahan dalam penggunaan (user friendly)

• Kemudahan dalam pemeliharaan (maintainability)


Algoritma dan Performa

• Hal-hal yang menjadi pertimbangan utama Anda


tidak muncul dengan gratis

• Performa sistem menjadi alat tukar seperti uang.

• Algoritma program memegang peran kunci

• Algoritma adalah teknologi, engineered,


sebagaimana perangkat keras komputer
Pentingnya Analisa Algoritma
• Algoritma membantu kita memahami skalabilitas
program kita

• Performa terkadang menjadi pembeda antara


yang mungkin dilakukan dan yang tidak mungkin
dilakukan

• Analisa algoritma memberi gambaran informasi


tentang ‘perilaku program’ kita

• Mempelajari bagaimana menerapkan algoritma


yang baik untuk kasus tertentu membedakan
profesi system analyst dan programmer
Prinsip Perbandingan Algoritma
• Apa yang membuat sebuah algoritma dikatakan LEBIH
BAIK dari algoritma yang lain?

• Kompleksitas waktu (Time Complexity)

• Kompleksitas ruang (Space Complexity)

• Kecenderungan saat ini:

• ruang (hard disk) semakin murah

• kapasitas data yang diproses semakin besar

• waktu pemrosesan harus semakin cepat

• Kompleksitas waktu menjadi variabel yang sangat penting


Penyebab variasi pada hasil analisa algoritma
• Program aras tinggi diterjemahkan ke bahasa mesin. Setiap
tipe prosesor memiliki prosedur bahasa mesin yang berbeda

• Aplikasi dijalankan di shared environment, sehingga


terpengaruh oleh penggunaan memori

• Program sangat sensitif terhadap masukan dan akan


menunjukkan performa yang jauh berbeda untuk rentang
masukan yang tidak terlalu berbeda

• Program tidak dipahami dengan baik, sehingga analisa


matematika kurang merepresentasikan kondisi yang
sesungguhnya

• Program tersebut memang tidak bisa dibandingkan dengan


program yang lain karena hanya optimal untuk input-input
tertentu
Hal-hal yang perlu diperhatikan
pada analisa algoritma
• Memisahkan operasi pada tingkat abstraksi
dan implementasi.
Contoh: menghitung jumlah instruksi scanf
pada program lebih diprioritaskan daripada
memahami berapa nanoseconds instruksi
scanf dieksekusi
• Mengidentifikasi data masukan:
- Strategi average dan worst case
- Strategi random dan biggest data
Dasar Matematika & Teori Big-O

• Sebagian besar algoritma memiliki parameter primer


N yang sangat mempengaruhi waktu eksekusi

• Parameter N bisa berupa:


- derajat polinomial
- ukuran berkas (file) yang diproses
- jumlah karakter pada text string
- ukuran data yang diproses

• Pengukuran kompleksitas: Big-O


3.1 Asymptotic notation

c2 g(n) cg(n)

Teori Big-O f (n)

c1 g(n)
f (n)

n n
n0 n0 n0
f (n) = !(g(n)) f (n) = O(g(n)) f (n) = "
Teorema Matematika:
(a) (b) (c)

O(g(N )) = { f (N ) : jika terdapat konstanta positif c dan N 0 , sehingga


Figure 3.1 Graphic examples of the !, O, and " notations. In each part, the value of

0 ≤ f (Nwithin
) ≤ constant
cg(Nfactors.
) untukWe writesemua N ≥if there
the minimum possible value; any greater value would also work. (a) !-notation bounds a
f (n) = !(g(n)) N 0 }exist positive constants n0, c1,
that to the right of n 0 , the value of f (n) always lies between c1 g(n) and c2 g(n) inclus
Engineering: notation gives an upper bound for a function to within a constant factor. We write f (n)
if there are positive constants n 0 and c such that to the right of n 0 , the value of f (n) alw

•Hilangkan orde yang lebih rendah dan


or below cg(n). (c) "-notation gives a lower bound for a function to within a constan
write f (n) = "(g(n)) if there are positive constants n 0 and c such that to the right of n
of f (n) always lies on or above cg(n).
konstanta. Gunakan1 hanya orde tertinggi
pada polinomialc n ≤ 2 n − 3n ≤ c n
2 2 2
1 2

Contoh: 3n + 90n −1 5n3 + 6046 = O(N )


2
3 for 2all n ≥ n . Dividing by n yields3 0

c1 ≤ − ≤ c2 .
2 n
Macam-macam Parameter N
Sebagian besar instruksi dieksekusi satu kali atau dalam
1 jumlah yang tidak terlalu banyak (waktu eksekusi
konstan)

Pertumbuhan waktu eksekusi program tidak terlalu cepat.


log N Waktu eksekusi ini terdapat pada program yang
memecahkan masalah dengan kapasitas yang cukup
besar, dipecah-pecah menjadi beberapa bagian

Waktu eksekusi program linier. Sebagian besar masukan


N diproses dalam jumlah yang tidak terlalu banyak

Waktu eksekusi ini terdapat pada program yang


N log N memecahkan masalah menjadi beberapa bagian,
menyelesaikannya secara terpisah, kemudian
menggabungkannya kembali
Macam-macam Parameter N
(cont’d)
Biasanya digunakan untuk memecahkan masalah dalam
2 jumlah kecil. Biasanya terdapat pada program yang
N memproses pasangan data (quadratic) atau array dua
dimensi secara bersamaan (double-nested loop)

Biasanya digunakan untuk memecahkan masalah dalam


3 jumlah kecil. Biasanya terdapat pada program yang
N memproses tiga buah data (cubic) atau array tiga dimensi
secara bersamaan (triple-nested loop)

N Waktu eksekusi program linier. Sebagian besar masukan


2 diproses dalam jumlah yang tidak terlalu banyak
Beberapa perbandingan Getting Started

kompleksitas algoritma
Figure 1-1 shows how the various measures of complexity compare with one another. The horizontal
axis represents the size of the problem — for example, the number of records to process in a search algo-
rithm. The vertical axis represents the computational effort required by algorithms of each class. This is
not indicative of the running time or the CPU cycles consumed; it merely gives an indication of how the
computational resources will increase as the size of the problem to be solved increases.

O(N2)

O(N log N) O(N)


Running Time O(N!)

(seconds)

O(1)

O(log N)

Figure 1-1: Comparison of different orders of complexity.


Input size (N)
Referring back at the list, you may have noticed that none of the orders contain constants. That is, if an
Formula Kondisi Periodik
• Sebagian besar algoritma terdiri dari proses
penyelesaian masalah dengan memanfaatkan
perulangan (rekursif)
• Bagian yang berulang tersebut secara tidak
langsung berkontribusi pada kompleksitas
sebuah algoritma
• Perlu mengetahui formula-formula dasar
untuk kondisi periodik
Formula Kondisi Periodik
• Formula 1: kondisi periodik muncul pada program
rekursif yang mengeliminasi satu item input

Sedgewick, R., Algorithms in C++ Part 1-4, Massachusetts: Addison-Wesley Publisher, 1998
Formula Kondisi Periodik
• Formula 2: kondisi periodik muncul pada program rekursif yang
membagi input menjadi dua bagian hanya dengan satu langkah

Sedgewick, R., Algorithms in C++ Part 1-4, Massachusetts: Addison-Wesley Publisher, 1998
Formula Kondisi Periodik
• Formula 3: kondisi periodik muncul pada program rekursif yang
membagi input menjadi dua bagian, namun perlu memeriksa
tiap-tiap input

Sedgewick, R., Algorithms in C++ Part 1-4, Massachusetts: Addison-Wesley Publisher, 1998
Formula Kondisi Periodik
• Formula 4: kondisi periodik muncul pada program rekursif yang
mengolah input secara linear sebelum, pada saat, dan sesudah
membagi input menjadi dua bagian

Sedgewick, R., Algorithms in C++ Part 1-4, Massachusetts: Addison-Wesley Publisher, 1998
Formula Kondisi Periodik
• Formula 5: kondisi periodik muncul pada program rekursif yang
membagi input menjadi dua bagian, kemudian mengerjakan input
lain dengan kapasitas konstan

Sedgewick, R., Algorithms in C++ Part 1-4, Massachusetts: Addison-Wesley Publisher, 1998
Jenis analisa waktu eksekusi
• Strategi Worst case (umum digunakan)
T(N) = waktu eksekusi maksimum untuk
jumlah data N
• Strategi Average case (jarang digunakan)
T(N) = waktu yang diharapkan dari sebuah
algoritma untuk mengeksekusi data
sejumlah N. Perlu ada asumsi statistik untuk
distribusi data masukan
Analisa worst case

• Biasanya mengambil batas maksimal (upper bound),


untuk memberi jaminan bahwa program tidak akan
terus berjalan saat batas maksimal waktu eksekusi
tercapai

• Waktu eksekusi juga tergantung pada kondisi awal


input : data yang sudah terproses akan lebih mudah
dieksekusi daripada yang belum

• Untuk worst-case, diambil kemungkinan yang paling


buruk (data tidak terproses sama sekali, pada kondisi
yang berlawanan dengan kondisi akhir yang
diharapkan)
Machine-independent
Running Time
• Berapakah waktu eksekusi terburuk (worst-case)
dari sebuah algoritma?

• Tergantung dari kecepatan mesin kita:


- kecepatan relatif: berjalan di komputer yang sama
- kecepatan absolut: berjalan di komputer yang
berbeda

• Kita ingin mengukur kecepatan algoritma tanpa


mempertimbangkan kecepatan komputer

Analisa Asymptotic : Pertumbuhan waktu eksekusi T(N)


saat N → ∞
Performa Asymptotic
!"#$%&'&()*%+,-',$./)+
Pada jumlah data tertentu (> N
57"<(" ?"$6(:@'?"("<89?7*(@(Θ2" 0), algoritma+ dengan kompleksitas
3 @:?8'>$7%(
rendah O(n2) bisa saja lebih efisien
13 @:?8'>$7%0dibandingkan algoritma
?,B?30 &"@$6(@(Θ2"
dengan kompleksitas tinggi
4 5"(6789:;<=$(>?<8'"(
Kita tidak boleh meremehkan
@6A%#$8$>B@::A(6:8C"'(
sebuah algoritma yang secara
asymptotic lebih lambat
@:?8'>$7%6*(78C"D"'0
4 E"@:FC8':;(;"6>?<(
Dalam disain riil, kita perlu
O(n2) 6>$9@$>8<6(8G$"<(B@::(G8'(@(
menyeimbangkan proses engineering
A2"3 B@'"G9:(&@:@<B><?(8G(
dengan melihat algoritma yang
O(n3) "<?><""'><?(8&H"B$>D"60
sesuai untuk masalah yang dihadapi
4 I6A%#$8$>B(@<@:A6>6(>6(@(
Analisa Asymptotic membantu
96"G9:($88:($8(7":#($8(
kita untuk berlaku lebih adil
" ", 6$'9B$9'"(89'($7><J><?0
terhadap algoritma yang kita
1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"
!"#$"%&"'()*(+,,- gunakan
!"#$%&'(#)%"*#%*+,-%$)#./0 ./0+1
Teori Big-O
• Untuk membandingkan dua buah algoritma,
bandingkan tingkat kompleksitasnya
f (N ) Untuk N besar
lim →∞
N →∞ g(N ) g(N) lebih efisien dari f(N)

f (N ) Untuk N besar
lim →0
N →∞ g(N ) f(N) lebih efisien dari g(N)
!"#$%&'()#*$'+$,'&-./0
Implementasi: Insertion Sort
!"#$%& 1"23"45"((¢?/*(?+*(6*(?"² 78(43%&"'10

'$%#$%& #"'%3$9$:74((¢?A/B*?A+B*6B*?A"² 135;


$;9$((?A/ ≤ ?A+ ≤ 6 ≤ ?A" 0

123*%)#4
!"#$%& <((+((=((>((?((@
'$%#$%& +((?((=((@((<((>
1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"
!"#$"%&"'()*(+,,- !"#$%&'(#)%"*#%*+,-%$)#./0 ./0-

Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C., Introduction to Algorithms 2nd Edition, Massachusetts: MIT Press, 2002
!"#$%&'()*(+,-'./+),(-)./
2 + 1 3 4 5
!"#$%&'()*(+,-'./+),(-)./
Implementasi:!"#$%&'()*(+,-'./+),(-)./
Insertion
+1
2
2+
+
12
3
33 Sort
4
44
5
55
1
!"#$%&'()*(+,-'./+),(-)./!"#$%&'()*(+,-'./+),(-)./
+ 1 2 3 4 5 + 1 2 3 4 5
+1 2+ 32 43 54 15
!"#$%&'()*(+,-'./+),(-)./
1 + 2 3 4 5
!"#$%&'()*(+,-'./+),(-)./
++1 12+ 2
1
3
3
4
4
5
5
++ 31 22 43 54 15
+ 1 2 3 4 5
2 + 3 1 4 5 + 2 1 3 4 5
!"#$%&'()*(+,-'./+),(-)./
1 + 2 3 4 5
!"#$%&'()*(+,-'./+),(-)./ ++ 32 21 43 54 15

11+ ++1 222 333 444 555 ++ 52 31 23 44 15


!"#$%&'()*(+,-'./+),(-)./
!"#$"%&"'()*(+,,-
1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"
!"#$%&'(#)%"*#%*+,-%$)#./0 ./0/1

++ 11 22 33 44 55 + 4 2 1 3 5
2 + 3 4 1 5 1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"
!"#$"%&"'()*(+,,- !"#$%&'(#)%"*#%*+,-%$)#./0 ./0/-
+ 4 2 5 1 3 &%">
1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"
+ 2 1 3 4 !"#$"%&"'()*(+,,-
5 !"#$%&'(#)%"*#%*+,-%$)#./0 ./0/1
+ 2 3 4 1 5
1%23$)-.#*4 566789*:$);*<=*<>/?)">
566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"
?"&*1.?$,>0*:=*@>)0>$0%"
+ 3 2 4 1 5
1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%" 1%23$)-.#*4
%&"'()*(+,,- !"#$%&'(#)%"*#%*+,-%$)#./0 !"#$"%&"'()*(+,,- ./01
!"#$"%&"'()*(+,,- !"#$%&'(#)%"*#%*+,-%$)#./0
!"#$%&'(#)%"*#%*+,-%$)#./0 ./0/)
./0/1

1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"


%&"'()*(+,,- !"#$%&'(#)%"*#%*+,-%$)#./0
1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"
./01
%&"'()*(+,,- !"#$%&'(#)%"*#%*+,-%$)#./0 ./0/,
Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C., Introduction to Algorithms 2nd Edition, Massachusetts: MIT Press, 2002

1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"


%&"'()*(+,,- !"#$%&'(#)%"*#%*+,-%$)#./0
1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%" ./0//
%&"'()*(+,,- !"#$%&'(#)%"*#%*+,-%$)#./0 ./0/+
Implementasi:
!"#$%&'(")#(%&Insertion Sort
12!3451627!645(8+*("9 ຆ +:/(0(0(";
*(% A*ĸ + &( "
+( ;>3*ĸ +:(A;
)*ĸ A*B /
A#B"C>DED>"F ,-'.$ )*C*, <=>(+:);(?(;>3
+( +:)D/;(ĸ +:);
)*ĸ )*B /
+:)D/;(@(;>3
/ ) A "
+G
;>3
BD'$">
1%23$)-.#*4 566789*:$);*<=*<>/?)"> ?"&*1.?$,>0*:=*@>)0>$0%"
!"#$"%&"'()*(+,,- !"#$%&'(#)%"*#%*+,-%$)#./0 ./0)

Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C., Introduction to Algorithms 2nd Edition, Massachusetts: MIT Press, 2002
2 do key ← A[ j ] c2 n−1
3case occurs andInsert
!if theso they A[ take
array is nothe
already
j ] into time.sorted.
sorted For each j = 2, 3, . . . , n, we then find
that A[i] ≤ key in line 5 when i has its initial value of j − 1. Thus t j = 1 2.2 for Analyzing algorithms
sequence A[1 . . j − 1]. 0 n−1
j = 2, 3, . .I.NSERTION
, n, and the-Sbest-case ORT (A) running time is cost times
4 i ← j −1 c4 n!− 1
5T (n) = 1while c1 n for
+ ic2j> (n← 0−and 21)to+A[i]
length[A]
c4 (n>−key 1) + c5 (n − 1)c+ 5 8c (n − 1)cn 1 t n
j =2 j case occurs if the array is already sorte
2 do key ← A[ j ] !cn 2 n − 1 that A[i] ≤ key in line 5 when i has i
6 = (c1 + doc2A[i+ c+ + 1] c ← + A[i]
c )n − (c + c + c c
56+ c ) . (t − 1)
3 !4 5
Insert A[8 j ] into 2the sorted
4 8
!nj =2 j j = 2, 3, . . . , n, and the best-case runni
7This running time can i← i − 1 sequence
be expressed as an A[1+ b .for − 1]. c7
. j constants a and0j =2
(t j −depend
b that n1)− 1 Ton (n) = c1 n + c2 (n − 1) + c4 (n − 1
8the statement A[i + 1] ←
4 costs ci ; iti is←thuskey j −a 1linear function of n. c 8 n − c4 1 n!− 1
n = (c1 + c2 + c4 + c5 + c8 )n −
5 is in reverse
If the array whilesorted i > 0order—that
and A[i] >is,keyin decreasing corder—the 5 tj
worst
j =2
Theresults.
running time of the algorithm is the sum !
case 6 We must compare do A[i each+element
1] ← A[i] A[of j ] running
with eachtimes element
c6
for each
in thestatementThis running time can be expressed as a
n entire
(t
j =2 the j − 1)
executed; a statement
sorted subarray A[1 . . that
j − takes
1], and i steps
cso t = tofor
j execute
j = 2, and
3, . .is. , executed
n. Noting times
nthat
! n will
statement costs ci ; it is thus a linear
i ← i − 15 (t j If−the
contribute c7i n to the total running c7
of1) array is in reverse sorted orde
j
time. To compute T (n), the runningj =2 time
I!
n
NSERTION
8+
n(n-S ORT1) , we sum A[i + the ← key of the cost and times columns,
1]products c8 − 1 case results. We must compare each ele
n obtaining
j= −1 sorted subarray A[1 . . j − 1], and so t j
2 nis the sum" n running times for each statement
j =2 The running time of the algorithm" of ! n
T (n) = cexecuted; n(n + 1)
1 n + c2 (na− 1) + c 4 (n − 1) + c5 t j + c 6 (t
statement that takes ci steps to execute and is executed n times will − 1j − 1) j =
and 2
j =2 5 j =2
! n contribute c i n to the total running time. To compute T (n), the running
j =2 time of
n(n " n− 1)
( j − 1) I= NSERTION -S ORT, we sum the products of the cost and times columns, and obtaining
+ c7 2 (t j − 1) + c8 (n − 1) . n
j =2
" n " n ! n(n − 1)
j =2 ( j − 1) =
(see Appendix T (n)A for = a creview1 n + cof 2 (nhow− 1)to+solve − 1) summations),
c4 (nthese + c5 t j + cwe 6 find − 1)
(t jthat j in
=2
2
theEven
worstforcase,
inputs of a given
the running timesize, an algorithm’s
of I NSERTION -S ORT runningis j =2 time may j =2 depend on
which input of that size is given. " n For example, " in I NSERTION # -S ORT, the(see best Appendix A for a review of how t
+ c7 (t j − 1) + c8 (nn(n − 1) + .1) the worst case, the running time of I NSE
T (n) = c1 n + c2 (n − 1) + c4 (n − 1) + c5 −1
j =2 2
"
5 This characteristic does # " # T (n) = c1 n + c2 (n − 1) + c4 (n − 1
n(n not necessarily
−inputs
1) of a given hold for
n(n −size, a resource such as memory.
1) an algorithm’s running time may A statement that
Even for
+ c6of memory and is +executed
c7 + cnot − 1) depend on" # "
references m words n times does 8 (nnecessarily consume mn words of n(n − 1) n(
which input 2 of that size is given. 2 For example, in I NSERTION -S ORT , the+ best
c + c
memory in total. $c % $ % 6
2
7
5 c 6 c 7 c 5 c 6 c 7
= + + n 2 + c1 + c2 + c4 + − − + c8 n $c
5 c6 c7 % 2 $
2 2 2 2 2 2 = + + n + c1 +
5− + c4 + c5 +
(c2characteristic c8 )not
. necessarily hold for a resource such as memory. A statement that 2 2 2
This does
references m words of memory and is executed n2 times does not necessarily consume mn words of
This worst-case
memory in total.time can be expressed as an + bn + c for constants a,This
running b, worst-case running time can be exp O(n ) −2(c2 + c4 + c5 + c8 ) .
Implementasi: Insertion Sort
Worst-case (seluruh input diurutkan terbalik):
N
T (N ) = ∑ O( j) = O(n ) 2
Deret aritmatika
j=2

Apakah Insertion Sort algoritma yang cepat?


- Ya, jika N kecil
- Tidak, jika N besar
Lihat perbandingannya dengan Merge Sort di
slide berikutnya
Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C., Introduction to Algorithms 2nd Edition, Massachusetts: MIT Press, 2002
Contoh komparasi
• Komputer A:
Insertion Sort, lebih cepat untuk N kecil,
2
memproses N data dengan waktu eksekusi c1 N
Kecepatan eksekusi prosesor 109 instruksi/detik

• Komputer B:
Merge Sort, lebih lambat untuk N kecil,
memproses N data dengan waktu eksekusi c2 N log N
Kecepatan eksekusi prosesor 107 instruksi/detik

• Diketahui: c1  c2
Jika c1=2, c2=50, N = 106 ,
mana algoritma yang lebih efisien?
Kesimpulan
• Analisa algoritma diperlukan untuk
perbandingan algoritma tanpa tergantung
spesifikasi mesin

• Analisa algoritma membantu kita memecahkan


masalah sesuai kondisi dan data yang kita hadapi

• Analisa algoritma bukan alat mutlak untuk


memilih algoritma terbaik, tapi membantu
memahami perilaku algoritma saat diterapkan di
dunia nyata
Terima Kasih

Anda mungkin juga menyukai