Algoritma adalah “cara melakukan sesuatu”. Hanya diskrit. Dibagi menjadi beberapa langkah. Rencana langkah demi langkah untuk mencapai tujuan tertentu. Ini memastikan memberikan output yang sama untuk satu input. Panduan pasti untuk memecahkan suatu masalah. Itu Algoritma.

Pemrograman (atau Pengkodean / Rekayasa Perangkat Lunak atau kata keren apa pun yang kita gunakan saat ini) memiliki Algoritma (algosingkatnya) sebagai intinya. Suatu tindakan tanpa rencana tidak akan mencapai harapan seperti yang kita ketahui. Dalam pemrograman algo adalah perencanaan kita.

Ada banyak referensi web yang tersedia online yang membahas hal yang sama dengan cara yang berbeda. Namun tidak ada yang mengalahkan membaca buku 📚seperti yang mungkin Anda setujui 😁.

Buku yang sangat direkomendasikan:

Pengantar Algoritma, Edisi ke-3 (The MIT Press)

oleh Thomas H. Cormen,
Charles E. Leiserson,
dkk. | 31 Juli 2009

https://www.amazon.com/Data-Structures-Thomas-H-Cormen-Algorithms/

Diagram alur:

Diagram alur adalah jenis diagram yang mewakili alur kerja atau proses. Diagram alur juga dapat didefinisikan sebagai representasi diagram dari suatu algoritma, pendekatan langkah demi langkah untuk menyelesaikan suatu tugas. — wikipedia

Memvisualisasikan solusi Anda sering kali membantu mengatasi kasus-kasus sulit dan menjernihkan pikiran. Diagram alur adalah cara yang sangat membantu dalam menyajikan desain suatu algoritma kepada orang lain dan juga diri Anda sendiri.

Diagram alurnya keren. Gunakan draw.io.
Untuk memecahkan masalah — Gunakan algo — untuk mewakili algo — gunakan diagram alur.

Dingin. tetaplah bersamaku. hal-hal menarik ke depan:

Kompleksitas:

Setelah kami memiliki solusi yang diverifikasi melalui setiap langkah. Kita harus mempertimbangkan kemungkinan bahwa solusi lain mungkin akan memberikan hasil yang lebih baik. Sekarang, bagaimana cara membandingkan solusi? "Benar. Anda. Temanku”(Referensi Master Yoda): Kompleksitas.

Dalam industri Perangkat Lunak, kami menganggap kompleksitas sebagai ukuran untuk memutuskan apakah akan memilih suatu algoritma atau tidak. Kompleksitas dapat memiliki 2 faktor:

  1. WAKTU: kira-kira. jumlah waktu yang dibutuhkan oleh solusi Anda
  2. RUANG: kira-kira. ruang yang diambil oleh solusi Anda

Kita akan merepresentasikan kompleksitas relatif terhadap 'n' dengan n adalah panjang kumpulan input.

Peringatan aturan praktis 🚨

👍 Waktu sangat berharga. Ruang bisa dibeli
👍 Notasi Oh(O) Besar adalah teman kita
👍 Pernyataan eksekusi dan loop memakan waktu Anda
👍 Rekursi memakan waktu Anda

Notasi O Besar:

O(1): read(urutan 1) adalah yang terbaik yang bisa dilakukan. O(n): read(urutan en) berarti kompleksitas meningkat seiring dengan faktor panjang kumpulan masukan (yaitu n). Program menghabiskan sebagian besar waktunya dalam putaran. Jadi perhatikanlah.

Contoh (kompleksitas waktu) 🖥 ⏰

O(1): Tidak berhubungan dengan 'n'

alias Waktu yang konstan. Tujuan pemrograman 🤞.

sum = a+b // constant time O(1)
anotherSum = (a+b) * 10000000000 // constant time O(1)
somethingElse = functionCall() // depends of function def. duh!

O(n): faktor konstanta 'n'

Urutan 'n'. Yang terbaik yang dapat Anda capai hampir sepanjang waktu.

for(var i=0; i<n; i++) {} // loop runs n times
for(var i=0; i<100000; i++) { // loop runs 100000*n times
  for (var i=0; j<n; j++) {}
}

O(log n): faktor logaritma(basis2) dari 'n'

Jika dalam satu loop, nilai 'i' berkurang setengah(karena basis2) atau bertambah dua kali nilainya di setiap iterasi.

/*
* for n=256, loop runs 8 times
* for n=128, loop runs 7 times
* for n=016, loop runs 4 times
* looks like "log2 n" in picture
*/
for(var i=n; i>=0; i/=2) {}  // i reduces by 1/2 in each iteration
for(var i=0; i<n; i*=2) {}  // i increases by *2 in each iteration

Jika 'i' mengurangi sepertiga, di setiap iterasi, log (base3):

/*
* for n=003, loop runs 1 times
* for n=009, loop runs 2 times
* for n=027, loop runs 3times
* looks like "log3 n" in picture
*/
for(var i=n; i>=0; i/=3) {}
// or
for(var i=0; i<n; i*=3) {}

Cara yang sama untuk kompleksitas log7 n, 'i' harus dikurangi sepertujuh di setiap iterasi

for(var i=0; i<n; i*=7) {}
for(var i=n; i>=0; i/=7) {}

Sekarang kita bisa melakukan mix & match dengan kompleksitas dasar kita

for(var i=0; i<n; i*=7) { // O(log7 n)
  for(var j=0; j<n; j++) {} // O(n)
}
// Total complexity: O(n * log7 n)

Hal yang perlu diperhatikan: kompleksitas satu sama lain berlipat ganda dimana satu dengan yang lain: tambahkan.

Menyenangkan sekali, bukan. Mari temukan beberapa cara menarik untuk mengidentifikasi kompleksitas di bagian selanjutnya!

HAI(catatan log n):

'i' bertambah kuadrat atau dikurangi akar kuadrat:

// Complex examples:
for (var i=0; i<n; i++) {
  for (var j=2; j<=n; j++){   
    j=j*j;
  }
}
/*
* n=2;      2^1   2^(2^0)  i: 0...1     j:2(1 time)
* n=4;      2^2   2^(2^1)  i: 0...3     j:2,4 (2 times)
* n=16;     2^4   2^(2^2)  i: 0...15    j:2,4,16 (3 times)
* n=256;    2^8   2^(2^3)  i: 0...155   j:2,4,16,256 (4 times)
* n=65536;  2^16  2^(2^4)  i: 0...65535 j:2,4,16,256,65536 (5 times)
* 
* we can see that i's loop runs n times
* whereas j's loop runs k+1 times where
* 2^(2^k) = n
* log(2^(2^k)) = log n
* 2^k = log n
* log(2^k) = log log n
* k = log log n
* 
* So total complexity of above program is: O(n (log (log n))) 🤯
*
* */

Nah, di situlah kami membutuhkan sedikit waktu & usaha. Dalam contoh yang diberikan, basis log adalah 2, untuk basis lainnya Anda tahu apa yang harus dilakukan. Hal yang sama yang kita lakukan untuk kompleksitas log n pada contoh sebelumnya.
Lebih seru lagi di bagian selanjutnya!

Salam 🍻