Tentang Kompleksitas Waktu: Mengapa Penting dalam Pemrograman?

By Rizky Kurniawan - March 14, 2023 ~5 mins read

Dalam dunia pemrograman, ada istilah yang disebut dengan kompleksitas waktu. Konsep ini berkaitan dengan berapa lama waktu yang diperlukan untuk menyelesaikan sebuah program atau fungsi. Semakin kompleks sebuah program atau fungsi, semakin banyak waktu yang dibutuhkan untuk mengeksekusinya. Oleh karena itu, pemahaman tentang kompleksitas waktu menjadi sangat penting bagi para pengembang, karena hal ini berdampak pada kinerja dan efisiensi program yang dibuat.

Apa itu kompleksitas waktu?

Secara sederhana, kompleksitas waktu mengacu pada berapa banyak waktu yang dibutuhkan oleh sebuah program atau fungsi untuk menyelesaikan suatu tugas atau operasi tertentu. Waktu yang dibutuhkan untuk mengeksekusi suatu program atau fungsi dipengaruhi oleh beberapa faktor, seperti jumlah data input yang diberikan, struktur algoritma, dan jumlah operasi yang dilakukan. Oleh karena itu, semakin besar input yang diberikan, semakin rumit struktur algoritma yang digunakan, atau semakin banyak operasi yang dilakukan, semakin lama waktu yang dibutuhkan untuk menyelesaikan tugas tersebut.

Kompleksitas waktu diukur dalam notasi Big O, yang menunjukkan seberapa cepat waktu eksekusi program atau fungsi meningkat ketika jumlah input ditingkatkan. Notasi Big O juga dapat digunakan untuk membandingkan kinerja program atau fungsi yang berbeda. Notasi Big O digunakan untuk menentukan kompleksitas waktu terbaik, terburuk, dan rata-rata dari sebuah program atau fungsi.

Kenapa kompleksitas waktu penting untuk diketahui?

Pemahaman tentang kompleksitas waktu sangat penting dalam pengembangan aplikasi karena hal ini mempengaruhi kinerja dan efisiensi program yang dibuat. Ketika sebuah program atau fungsi dijalankan, waktu yang dibutuhkan untuk menyelesaikan tugas yang diberikan dapat berdampak pada kinerja keseluruhan aplikasi. Jika program atau fungsi tersebut membutuhkan waktu yang lama untuk menyelesaikan tugas, maka aplikasi dapat menjadi lambat dan tidak responsif. Oleh karena itu, memahami kompleksitas waktu sangat penting dalam mengoptimalkan kinerja dan efisiensi program.

Selain itu, kompleksitas waktu juga penting untuk menentukan kebutuhan sumber daya untuk menjalankan program atau fungsi. Semakin kompleks sebuah program atau fungsi, semakin banyak sumber daya yang dibutuhkan untuk menjalankannya. Jika sumber daya yang tersedia terbatas, program atau fungsi yang kompleks mungkin tidak dapat dijalankan dengan lancar.

Contoh kompleksitas waktu

Contoh yang paling umum dari kompleksitas waktu adalah algoritma pengurutan. Algoritma pengurutan mengurutkan data input sesuai dengan urutan yang ditentukan. Beberapa algoritma pengurutan umum yang digunakan dalam pemrograman adalah bubble sort, insertion sort, dan quicksort. Setiap algoritma pengurutan memiliki kompleksitas waktu yang berbeda.

Bubble sort memiliki kompleksitas waktu O(n^2), yang berarti waktu eksekusi program akan meningkat dengan kuadratik sesuai dengan jumlah data input yang diberikan. Sebagai contoh, jika kita ingin mengurutkan 100 data input, maka waktu eksekusi program bubble sort akan sekitar 10.000 unit waktu. Jika kita ingin mengurutkan 1000 data input, maka waktu eksekusi program bubble sort akan sekitar 1 juta unit waktu. Ini menunjukkan bahwa bubble sort tidak efisien untuk mengurutkan jumlah data input yang besar.

Di sisi lain, quicksort memiliki kompleksitas waktu O(n log n), yang berarti waktu eksekusi program akan meningkat secara logaritmik sesuai dengan jumlah data input yang diberikan. Sebagai contoh, jika kita ingin mengurutkan 100 data input, maka waktu eksekusi program quicksort akan sekitar 700 unit waktu. Jika kita ingin mengurutkan 1000 data input, maka waktu eksekusi program quicksort akan sekitar 10.000 unit waktu. Ini menunjukkan bahwa quicksort lebih efisien daripada bubble sort untuk mengurutkan jumlah data input yang besar.

Selain algoritma pengurutan, kompleksitas waktu juga dapat ditemukan dalam banyak aspek pemrograman lainnya, seperti pencarian, manipulasi string, dan operasi matriks. Oleh karena itu, pemahaman yang kuat tentang kompleksitas waktu sangat penting bagi para pengembang untuk memastikan kinerja yang optimal dan efisiensi program yang dibuat.

Berikut ini beberapa contoh kompleksitas waktu dalam JavaScript:

  1. O(1) atau konstan: Operasi yang membutuhkan waktu yang sama untuk mengeksekusi tidak peduli ukuran input. Contohnya adalah mengakses elemen dalam array atau objek, menambahkan atau menghapus item dari array atau objek, dan lain-lain.

    const array = [1, 2, 3, 4];
    array.push(5); // O(1)
    console.log(array[0]); // O(1)
    
  2. O(n) atau linear: Operasi yang membutuhkan waktu sebanding dengan ukuran input. Contohnya adalah perulangan melalui array atau objek, pencarian linear dalam array atau objek, dan lain-lain.

    const array = [1, 2, 3, 4];
    for (let i = 0; i < array.length; i++) {
      // O(n)
      console.log(array[i]); // O(1)
    }
    
  3. O(n^2) atau kuadratik: Operasi yang membutuhkan waktu yang sebanding dengan kuadrat dari ukuran input. Contohnya adalah nested loop, seperti mencari elemen yang sama dalam dua array.

    const array1 = [1, 2, 3];
    const array2 = [3, 4, 5];
    for (let i = 0; i < array1.length; i++) {
      // O(n)
      for (let j = 0; j < array2.length; j++) {
        // O(n)
        if (array1[i] === array2[j]) {
          // O(1)
          console.log(array1[i]); // O(1)
        }
      }
    }
    
  4. O(log n) atau logaritmik: Operasi yang membutuhkan waktu yang sebanding dengan logaritma dari ukuran input. Contohnya adalah pencarian biner, yang memecah input menjadi setengah pada setiap langkahnya.

    const array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    let left = 0;
    let right = array.length - 1;
    while (left <= right) {
      // O(log n)
      const mid = Math.floor((left + right) / 2); // O(1)
      if (array[mid] === target) {
        // O(1)
        return mid; // O(1)
      } else if (array[mid] < target) {
        // O(1)
        left = mid + 1; // O(1)
      } else {
        right = mid - 1; // O(1)
      }
    }
    
  5. O(n log n) atau n logaritmik: Operasi yang membutuhkan waktu yang sebanding dengan hasil kali dari ukuran input dan logaritma dari ukuran input. Contohnya adalah algoritma pengurutan seperti quicksort atau mergesort.

    function quickSort(array) {
      if (array.length <= 1) {
        return array;
      }
      const pivot = array[0];
      const left = [];
      const right = [];
      for (let i = 1; i < array.length; i++) { // O(n)
        if (array[i] < pivot) { // O(1)
          left.push(array[i]); // O(1)
        } else {
          right.push(array[i]); // O(1)
        }
      }
      return
    

Kesimpulan

Kompleksitas waktu adalah konsep yang penting dalam pengembangan aplikasi. Hal ini mempengaruhi kinerja dan efisiensi program yang dibuat, dan juga dapat mempengaruhi kebutuhan sumber daya untuk menjalankan program. Pemahaman yang kuat tentang kompleksitas waktu juga dapat membantu para pengembang dalam memilih algoritma yang tepat untuk digunakan dalam program mereka. Oleh karena itu, pemahaman yang kuat tentang kompleksitas waktu sangat penting bagi para pengembang untuk memastikan program yang efisien dan responsif.

Ingin Berdiskusi?

Yuk bergabung di Grup Telegram Ruang Developer atau mulai diskusi melalui GitHub. See You!

Dapatkan contoh source code project backend, frontend, atau fullstack untuk kamu amati, tiru, dan modifikasi sesuka hati. Klik untuk melihat detail!
comments powered by Disqus

Berlangganan Gratis

Kamu akan menerima email update dari Ruang Developer

Beri Dukungan

Beri dukungan, dapatkan full source code project web untuk bahan referensi, tiru, dan modifikasi.
Lightbox