Pentingnya Memahami Algoritma dan Struktur Data

baca 6 menit
Pentingnya Memahami Algoritma dan Struktur Data

Dalam artikel ini, kita akan membahas kenapa algoritma dan struktur data sangat penting bagi programmer. Kita akan coba lihat contoh nyata di mana pemahaman yang kuat tentang konsep ini dapat membuat penyelesaian masalah lebih efisien dan efektif. Mari kita mulai!

Tentang Algoritma

Kalau kita coba definisikan sera non formal, algoritma adalah langkah-langkah yang harus dilakukan untuk menyelesaikan sesuatu. Sederhana saja, tidak ada yang khusus.

Kalau di dunia nyata, kita bisa lihat contohnya di belakang bungkus mie instan. Iya, langkah-langkah membuat mie instan itu juga algoritma.

Kalau mau yang lebih teknikal, kita bisa lihat contoh algoritma perhitungan bilangan faktorial. Tahu kan ya, bilangan yang ada tanda seru di belakangnya itu.

Sekarang bayangkan menjelaskan faktorial ini ke orang yang tidak paham konsep faktorial, tapi dia paham betul konsep variabel, perkalian, dan pengurangan. Dengan bekal ini kita bisa merekayasa sebuah algoritma untuk mendapatkan hasil faktorial. Algoritmanya kurang lebih seperti ini:

  1. Tentukan bilangan yang akan dicari faktorialnya dan masukkan ke variabel n
  2. Buat variabel x bernilai 1
  3. Kalikan nilai x dengan nilai n lalu masukkan hasilnya ke variabel x
  4. Kurangi nilai n dengan 1 lalu masukkan hasilnya ke variabel n
  5. Jika nilai n lebih dari 1 kembali ke langkah 3. Jika tidak, kembalikan nilai x sebagai hasil faktorial

Nah, itu kalau algoritma ditulis dalam Bahasa Indonesia dan ditujukan untuk orang Indonesia. Sekarang bagaimana jika ditujukan ke komputer? Tentunya kita harus menjelaskannya dalam bahasa komputer alias bahasa pemrograman.

Kalau kita ubah menjadi kode Java/C/C++ maka akan jadi seperti ini:

java
int factorial(n int) { // langkah 1: inisialisasi variabel n
  int x = 1;      // langkah 2: buat variabel x bernilai 1
  do {
    x = x * n;    // langkah 3: kalikan x dengan n, masukkan ke variabel x
    n = n - 1;    // langkah 4: kurangi nilai n dengan 1
  } while(n > 1); // langkah 5: jika n lebih dari 1, kembali ke langkah 3
  return x;       // langkah 5: kembalikan nilai faktorial
}

Tentunya algoritma tersebut masih belum sempurna ya, ada kasus yang membuatnya malfungsi. Seperti ketika nilai n negatif atau pecahan. Nah, tidak semua algoritma harus sempurna, yang penting adalah bisa menyelesaikan masalah sesuai kebutuhan.

Tentang Struktur Data

Kalau algoritma berbicara tentang langkah-langkah yang dilakukan pada data, struktur data berbicara tentang bagaimana cara penyimpanan dan penyusunan data. Tujuannya untuk menata data sehingga algoritma bisa dieksekusi dengan "effort" seminimmal mungkin.

Algoritma dan Struktur Data ini saling mendukung satu sama lain dan merupakan satu kesatuan yang tidak bisa dipisahkan.

Secara umum, kita akan menemukan 4 jenis struktur data, yaitu:

  1. Linear — disimpan secara linear, contoh: array, queue, stack, dan linked list
  2. Tree — disimpan secara bercabang seperti hirarki, contoh: binary, heap, dan AVL
  3. Graph — disimpan saling terhubung antara satu data dan lainnya
  4. Hash — disimpan secara tersebar menggunakan hash function

Nah, semua struktur data tersebut punya algoritmanya masing-masing. Tentunya kita tidak bisa sembarangan dalam memilih pasangan tipe data dan algoritmanya, ada kondisi tertentu yang harus diperhatikan.

Pentingnya Memahami Algoritma dan Struktur Data

Sebenarnya inti dari pemrograman adalah bagaimana memilih pasangan algoritma dan struktur data yang tepat untuk menyelesaikan suatu masalah. Udah itu aja, seharusnya simpel kan tinggal "milih" aja.

Kenyataannya? Hohoho, tidak semudah itu ferguso

Sebelum tahu pasangan yang tepat kita perlu tahu dulu bentuk sebuah data dan bagaimana algoritma bekerja. Setelah tahu baru kita cocokkan dengan masalah yang akan diselesaikan.

Contohnya kalau kita lihat sosial media seperti instagram, facebook, dan kawan-kawannya. Jika diamati, mereka ini punya kemiripan satu sama lainnya yaitu adanya hubungan antar user. Entah itu dalam bentuk teman, follower, subscriber atau lainnya.

Kalau kita tahu tentang struktur data pasti akan langsung kepikiran bahwa di balik layar sistem semacam ini menggunakan struktur graph. Karena memang strukturnya yang membentuk koneksi-koneksi. Ada node sebagai user dan edge sebagai hubungannya (sebagai follower, teman, atau subscriber).

Adalah hal yang bagus jika kita tahu struktur datanya terlebih dahulu. Dengan begitu, pilihan algoritma yang bisa dipakai akan lebih mengerucut. Selain itu memilih struktur data juga lebih mudah dari memilih algoritma.

Nah, kalau sudah dapat pasangan algoritma dan struktur data yang tepat, maka program yang kita buat akan lebih efisien, mudah diskalakan, dan mudah dipahami.

Kode yang Lebih Efisien

Kalau bicara tentang efisiensi pada pemrograman maka kita akan berkutat dengan ruang dan waktu. Dalam prosesnya kita akan menyebabkan ketidakstabilan dalam space-time continuum. Haha canda.

Efisiensi ruang dan waktu disini maksudnya menggunakan memori (ruang) sekecil mungkin dengan waktu eksekusi secepat mungkin. Hal ini biasanya ditakar dengan notasi O besar alias "Big O Notation". Bisa dibaca-baca sendiri lah ya, intinya ini menunjukkan seberapa efisien sebuah algoritma pada kasus terburuknya (worst case scenario).

Tentunya algoritma dan struktur data yang tepat didesain untuk meminimalkan nilai kompleksitas big O ini.

Contoh kasusnya, kita diminta untuk menghitung jumlah deret angka berurutan mulai dari 1. Rumusnya seperti ini:

Sn=1+2+3+...+(n1)+nS_n = 1 + 2 + 3 + ... + (n-1) + n

Masih ingat rumus itu?

Kalau kita ubah menjadi kode program maka akan jadi seperti ini:

java
int jumlahDeret(n int) {
  int hasil = 0;
  for (int i = 1; i <= n; i++)
    hasil += i;
  return hasil;
}

Kode itu benar dan sesuai algoritma, tapi masih kurang efisien. Kalau kita lihat, algoritma itu melakukan perulangan sebanyak n kali. Dengan kata lain, kompleksitasnya adalah O(n).

Lain cerita jika kita pakai rumus lainnya, masih ingat rumus ini?

Sn=nn+12S_n = n * \frac{n+1}{2}

Dengan rumus itu kita bisa menghitung deret bilangan yang repetitif dengan beberapa operasi saja. Kalau diterjemahkan ke kode program akan jadi seperti ini:

java
int jumlahDeret(n int) {
  return n * (n + 1) / 2
}

Sekarang berapapun inputannya, fungsi itu hanya akan menjalankan operasi sebanyak satu kali karena tidak ada perulangan di dalamnya. Fungsi ini memiliki kompleksitas O(1) alias konstan.

Memudahkan Penulisan Kode

Algoritma dan struktur data sering kali berdasar pada keadaan sekitar. Oleh karena itu, pemilihan ASD yang tepat akan memudahkan kita sebagai programmer. Karena memang logika yang kita susun sudah "make sense" dari sananya.

Contoh gampangnya ada di struktur data stack. Kita bisa membayangkan stack seperti tumpukan piring. Pasti yang akan kita ambil yang paling atas kan, karena memang itu yang butuh effort paling minim.

Kalau mau menaruh piring juga kita akan menaruhnya dari atas, karena sekali lagi itu yang butuh effort paling minim. Dan memang cara kerja struktur data stack seperti itu, taruh dari atas ambil dari atas.

Sadar atau tidak struktur stack ini sangat dekat dengan kita. Pernah tau fitur undo? iya yang ctrl+z itu. Di balik layar, fitur ini menggunakan struktur data stack. Ketika ada aksi yang dilakukan maka dimasukkan ke dalam stack, dan ketika di tekan undo maka aksi tersebut akan dikeluarkan satu per satu. Persis seperti kasus tumpukan piring.

Nah ketika kita membuat kode, membayangkan hal seperti ini akan sangat membantu kita memahami masalah yang ada. Tinggal hubungkan saja dengan apa yang ada di sekitar kita lalu ambil struktur data yang paling masuk akal.

Selanjutnya Apa?

Di dunia ini tidak ada yang instan, bahkan bikin mie instan aja perlu perjuangan.

Belajar pemrograman juga begitu. Belajar bahasa pemrograman dan tahu sintaks saja masih belum cukup. Kita perlu memahami bagaimana cara menyelesaikan masalah. Setelah itu kita masih perlu belajar cara membuat algoritma yang efisien. Masih belum cukup juga, sebagai programmer kita harus terus belajar, karena dunia teknologi yang terus berkembang dengan sangat pesat.

Oleh karena itu jam terbang juga penting. Semakin sering dan semakin banyak menyelesaikan masalah, maka kualitas algoritma kita akan semakin bagus.

Selain terus ngoding, membaca kodingan orang lain juga bisa membantu kita memahami algoritma. Tentu tiap orang punya isi kepala yang berbeda. Dengan memahami kode orang lain maka kita juga akan mendapat insight tentang bagaimana alternatif penyelesaian masalah.

Website seperti hackerrank, sololearn, dan leetcode bisa jadi tempat untuk mengasah skill ini. Silahkan bisa coba akses dan selesaikan problem yang ada. Di sana kita juga bisa baca-baca kode orang lain sebagai bahan belajar.

Selamat berkoding ria 👋