[{"data":1,"prerenderedAt":240},["ShallowReactive",2],{"tag-labels":3,"site-header":4,"article-pentingnya-memahami-algoritma-dan-struktur-data-id":72},{},{"featuredPost":5,"navigations":29},{"id":6,"title":7,"title_id":8,"slug":9,"excerpt":10,"excerpt_id":11,"has_translation":12,"published_at":13,"reading_time":14,"hidden_from_listing":15,"tags":16,"thumbnail_image":21,"og_image":22,"series":23,"authors":28},110,"When You Pick a Framework Just to Look Different","Ketika Pilih Framework Cuma Biar Kelihatan Beda","ketika-pilih-framework-cuma-biar-kelihatan-beda","The last time you chose a new framework or library, was it because your problem needed that tool, or because it sounded cool and few people around you were using it? That question is uncomfortable. Technology decisions are often made for reasons that never appear in any technical document.","Terakhir kali kamu milih framework atau library baru, itu karena masalahmu butuh alat itu, atau karena alatnya kedengaran keren dan belum banyak yang pakai? Pertanyaan ini nggak enak dijawab. Soalnya keputusan teknologi sering diambil dengan alasan yang nggak pernah ditulis di dokumen teknis mana pun.",true,"2026-10-06T15:25:21.000Z",5,false,[17,18,19,20],"karier","framework","opini","pengalaman",null,"\u002Fog\u002Fketika-pilih-framework-cuma-biar-kelihatan-beda.png",{"id":24,"title":25,"title_id":26,"slug":27},9,"Articles","Artikel","all",[],[30,46,67],{"collection":31,"item":32},"series",{"__typename":31,"title":25,"title_id":26,"slug":27,"children_series":33},[34,38,42],{"title":35,"title_id":36,"slug":37},"Artificial Intelligence","Kecerdasan Artifisial","kecerdasan-artifisial",{"title":39,"title_id":40,"slug":41},"Programming Fundamentals","Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"title":43,"title_id":44,"slug":45},"Algorithms and Data Structures","Algoritma dan Struktur Data","algoritma-struktur-data",{"collection":31,"item":47},{"__typename":31,"title":48,"title_id":48,"slug":49,"children_series":50},"Tutorial","tutorial",[51,55,59,63],{"title":52,"title_id":53,"slug":54},"Learning Python","Belajar Python","belajar-python",{"title":56,"title_id":57,"slug":58},"Learning Go","Belajar Golang","belajar-golang",{"title":60,"title_id":61,"slug":62},"Learning Java","Belajar Java","belajar-java",{"title":64,"title_id":65,"slug":66},"Learning Pascal","Belajar Pascal","belajar-pascal",{"collection":31,"item":68},{"__typename":31,"title":69,"title_id":69,"slug":70,"children_series":71},"Lab","lab",[],{"article":73,"renderedBody":124,"renderedTakeaway":125,"latestArticles":126,"toc":222},{"id":74,"title":75,"title_id":75,"slug":76,"excerpt":77,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":85,"series":86,"authors":116,"seoTitle":21,"seoDescription":21,"body_locale":119,"available_locales":120,"body":122,"takeway":123,"prerequisite":21},47,"Pentingnya Memahami Algoritma dan Struktur Data","pentingnya-memahami-algoritma-dan-struktur-data","Sebagai konsep fundamental, algoritma menentukan seberapa mahal sebuah masalah diselesaikan. Contohnya ada di bungkus mie instan, di bilangan faktorial, dan di tombol undo.","2026-11-19T01:00:00.000Z",7,[81,82,83,84],"algoritma","struktur-data","konsep","dasar","\u002Fog\u002Fpentingnya-memahami-algoritma-dan-struktur-data.png",{"id":87,"title":88,"title_id":89,"slug":90,"description":91,"description_id":92,"articles":93,"children_series":105,"parent_series":106},27,"About Algorithms and Data Structures","Tentang Algoritma dan Struktur Data","asd-intro","Why algorithms and data structures matter, and why learning them isn't just to pass a course.","Kenapa algoritma dan struktur data penting, dan kenapa belajar keduanya bukan cuma buat lulus mata kuliah.",[94],{"id":74,"title":95,"title_id":75,"slug":76,"excerpt":96,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":85,"series":97,"authors":98},"Why Understanding Algorithms and Data Structures Actually Matters","An algorithm is an ordered list of steps, and that order decides how expensive a problem is. The examples are on the back of an instant noodle packet, in a factorial, and behind ctrl+z.",{"id":87,"title":88,"title_id":89,"slug":90},[99],{"authors_id":100},{"id":101,"name":102,"slug":103,"role":104,"profile_picture":21},1,"Daffa Izzuddin","izzudd","Writer",[],{"id":107,"title":43,"title_id":44,"slug":45,"parent_series":108,"children_series":109},15,{"id":24,"title":25,"title_id":26,"slug":27},[110,111],{"id":87,"title":88,"title_id":89,"slug":90,"cover_image":21},{"id":112,"title":113,"title_id":114,"slug":115,"cover_image":21},28,"Linear Data Structures","Struktur Data Linear","asd-struktur-linear",[117],{"authors_id":118},{"id":101,"name":102,"slug":103,"role":104,"profile_picture":21},"id",[121,119],"en","\nKodenya jalan, tes yang kamu tulis lolos, tapi halamannya tetap lambat begitu datanya nyata. Tidak ada yang kelihatan rusak di berkasnya. Urutan langkahnya yang salah, dan begitu juga bentuk data yang dipakai. Dua pilihan itulah yang menentukan seberapa mahal sebuah masalah diselesaikan, dan tidak ada yang membukanya lagi sampai lambatnya sudah kelihatan di layar orang lain.\n\n## Tentang Algoritma\n\nSecara non-formal, algoritma adalah langkah-langkah yang harus dilakukan untuk menyelesaikan sesuatu. Sederhana saja, tidak ada yang khusus.\n\nContohnya ada di belakang bungkus mie instan. Langkah-langkah memasak mie instan itu juga algoritma, lengkap dengan urutan yang tidak bisa ditukar: rebus air dulu, baru masukkan mie.\n\nKalau mau yang lebih teknikal, ada contoh perhitungan bilangan faktorial. Tahu kan ya, bilangan yang ada tanda seru di belakangnya itu.\n\nSekarang bayangkan menjelaskan faktorial ke orang yang tidak paham konsep faktorial, tapi paham betul konsep variabel, perkalian, dan pengurangan. Dengan bekal itu saja, algoritmanya bisa direkayasa:\n\n1. Tentukan bilangan yang akan dicari faktorialnya, masukkan ke variabel `n`\n2. Buat variabel `x` bernilai 1\n3. Kalikan nilai `x` dengan nilai `n`, masukkan hasilnya ke variabel `x`\n4. Kurangi nilai `n` dengan 1, masukkan hasilnya ke variabel `n`\n5. Kalau nilai `n` masih lebih dari 1, kembali ke langkah 3. Kalau tidak, kembalikan nilai `x` sebagai hasil faktorial\n\nItu kalau algoritma ditulis dalam Bahasa Indonesia dan ditujukan untuk orang Indonesia. Untuk komputer, bahasanya harus bahasa pemrograman. Versi Java-nya seperti ini, sudah dicoba compile dan jalankan dengan javac 21:\n\n```java\npublic class Factorial {\n  static long factorial(int n) {\n    long x = 1;\n    while (n > 1) {\n      x = x * n;\n      n = n - 1;\n    }\n    return x;\n  }\n\n  public static void main(String[] args) {\n    System.out.println(factorial(5));\n    System.out.println(factorial(10));\n  }\n}\n```\n\nKalau dijalankan, hasilnya:\n\n```plain\n120\n3628800\n```\n\nAlgoritma itu masih belum sempurna. Nilai negatif dan nilai pecahan tidak ditangani, dan keduanya membuat hasilnya salah. Kalau programmu cuma pernah minta faktorial 5 atau 10, algoritma ini sudah cukup. Tapi tidak semua algoritma harus sempurna, yang penting bisa menyelesaikan masalah **sesuai kebutuhan**.\n\n## Tentang Struktur Data\n\nKalau algoritma berbicara tentang langkah-langkah yang dilakukan pada data, struktur data berbicara tentang bagaimana data itu disimpan dan disusun. Ambil array dan linked list: array disimpan berurutan dan punya indeks, jadi membaca elemen ke-500 itu lompat langsung ke sana, O(1). Linked list harus menelusuri node satu per satu untuk sampai ke posisi yang sama. Tujuannya satu: menata data supaya algoritma bisa dieksekusi dengan usaha seminimal mungkin.\n\nAlgoritma dan struktur data saling mendukung dan sulit dipisahkan. Satu memilih urutan langkah, satu lagi menentukan bentuk data yang diolah.\n\nSecara umum ada empat keluarga struktur data:\n\n1. **Linear**: disimpan berurutan, contohnya array, queue, stack, dan linked list\n2. **Tree**: disimpan bercabang seperti hirarki, contohnya binary tree, heap, dan AVL\n3. **Graph**: simpul yang saling terhubung, contohnya jaringan pertemanan dan peta jalan\n4. **Hash**: disimpan tersebar lewat hash function, contohnya hash table dan set\n\nMasing-masing punya algoritmanya sendiri, dan di situlah kita mulai perlu memilih. Karena itu memilih pasangan algoritma dan struktur data tidak bisa sembarangan, ada kondisi yang harus diperhatikan.\n\n## Pentingnya Memahami Algoritma dan Struktur Data\n\nInti pemrograman sebenarnya ada di situ: **memilih** pasangan algoritma dan struktur data yang tepat untuk masalah yang sedang dihadapi. Kedengarannya simpel, tinggal memilih.\n\nKenyataannya tidak. Sebelum tahu pasangan yang tepat, bentuk datanya harus dipahami lebih dulu, lalu cara kerja algoritmanya, baru dicocokkan dengan masalahnya.\n\nContohnya media sosial. Instagram, Facebook, dan kawan-kawannya punya satu kemiripan: ada hubungan antar pengguna, entah sebagai teman, follower, atau subscriber. Kalau strukturnya sudah dikenal, jawabannya langsung terlihat, yaitu **graph**. Ada **node** sebagai pengguna dan **edge** sebagai hubungannya.\n\nDi titik itu pilihan algoritmanya jadi lebih mengerucut, karena memilih struktur data biasanya lebih mudah daripada memilih algoritma. Kalau pasangannya sudah tepat, program jadi lebih efisien, lebih mudah diskalakan, dan lebih mudah dipahami orang lain.\n\n### Kode yang Lebih Efisien\n\nEfisiensi di pemrograman selalu soal dua hal: ruang dan waktu. Ruang berarti memori yang dipakai, waktu berarti lama eksekusinya. Ukurannya biasa ditakar dengan notasi O besar, yang menunjukkan seberapa cepat biaya sebuah algoritma naik saat inputnya membesar.\n\nAmbil contoh menghitung jumlah deret angka berurutan mulai dari 1:\n\n$$\nS_n = 1 + 2 + 3 + ... + (n-1) + n\n$$\n\nKalau kita terjemahkan apa adanya jadi kode, hasilnya perulangan. Versi rumusnya juga ditulis, supaya bedanya kelihatan:\n\n```java\npublic class SumRange {\n  static long withLoop(int n) {\n    long total = 0;\n    for (int i = 1; i \u003C= n; i++) {\n      total += i;\n    }\n    return total;\n  }\n\n  static long withFormula(int n) {\n    return (long) n * (n + 1) \u002F 2;\n  }\n\n  public static void main(String[] args) {\n    System.out.println(withLoop(100) + \" \" + withFormula(100));\n    System.out.println(withLoop(1_000_000) + \" \" + withFormula(1_000_000));\n  }\n}\n```\n\nDua metode itu menghitung hal yang sama, dan hasilnya memang sama:\n\n```plain\n5050 5050\n500000500000 500000500000\n```\n\nBedanya di biaya yang kita bayar. Versi perulangan melakukan penambahan sebanyak `n` kali, jadi kompleksitasnya **O(n)**. Versi rumus cuma melakukan beberapa operasi, berapa pun nilai `n`-nya, jadi kompleksitasnya **O(1)**. Untuk satu juta angka, selisihnya bukan soal cepat atau lambat, tapi soal pekerjaan yang sebenarnya tidak perlu dikerjakan.\n\n### Memudahkan Penulisan Kode\n\nPilihan struktur data juga memengaruhi seberapa mudah kode ditulis, karena logikanya jadi masuk akal dengan sendirinya. Ini yang dimaksud efisiensi ruang dan waktu tadi, cuma kali ini terasa di kepala, bukan di mesin.\n\nContoh paling gampang ada di struktur data **stack**. Bayangkan tumpukan piring: yang diambil pasti yang paling atas, karena itu yang butuh usaha paling kecil. Menaruh piring juga dari atas, alasannya sama. Cara kerja stack memang begitu, masuk dari atas, keluar dari atas.\n\nTanpa sadar, pola ini dekat sekali dengan pekerjaan harian. Fitur undo, yang jalan lewat `ctrl+z`, di balik layar memakai stack: setiap aksi didorong masuk, dan setiap kali undo ditekan, aksi terakhir dikeluarkan satu per satu. Persis tumpukan piring.\n\nKetika kita menulis kode, membayangkan hal seperti ini sangat membantu. Tinggal hubungkan masalahnya dengan benda di sekitar, lalu ambil struktur data yang paling masuk akal.\n\n## Selanjutnya Apa?\n\nDi dunia ini tidak ada yang instan, bahkan memasak mie instan pun perlu perjuangan.\n\nBelajar pemrograman juga begitu. Tahu sintaks bahasa pemrograman saja belum cukup. Yang perlu dilatih adalah cara menyelesaikan masalah, lalu cara menyusun algoritma yang efisien di atasnya. Setelah itu jam terbang yang menentukan: semakin sering menyelesaikan masalah, semakin bagus kualitas algoritmanya.\n\nMembaca kode orang lain juga membantu. Tiap orang punya isi kepala yang berbeda, dan dari kode orang lain biasanya muncul alternatif penyelesaian yang tidak terpikirkan sebelumnya. Website seperti [HackerRank](https:\u002F\u002Fwww.hackerrank.com\u002F), [Sololearn](https:\u002F\u002Fwww.sololearn.com\u002F), dan [LeetCode](https:\u002F\u002Fleetcode.com\u002Fproblemset\u002Fall\u002F) bisa dipakai untuk mengasah ini.\n\nMulai dari satu soal sehari, bukan dari daftar seratus soal yang tidak pernah dibuka.\n\nSelamat berkoding ria 👋\n","- Algoritma adalah urutan langkah, dan urutan itulah yang menentukan seberapa mahal sebuah masalah diselesaikan.\n- Struktur data menentukan bagaimana data disusun, supaya algoritma bisa berjalan dengan usaha seminimal mungkin.\n- Memilih pasangan algoritma dan struktur data lebih mudah kalau bentuk datanya dipahami dulu: deret berurutan cukup dengan array, hubungan antar pengguna butuh graph.\n- Algoritma tidak harus sempurna. Yang penting cukup untuk kebutuhan yang sedang dihadapi.","\u003Cp>Kodenya jalan, tes yang kamu tulis lolos, tapi halamannya tetap lambat begitu datanya nyata. Tidak ada yang kelihatan rusak di berkasnya. Urutan langkahnya yang salah, dan begitu juga bentuk data yang dipakai. Dua pilihan itulah yang menentukan seberapa mahal sebuah masalah diselesaikan, dan tidak ada yang membukanya lagi sampai lambatnya sudah kelihatan di layar orang lain.\u003C\u002Fp>\n\u003Ch2 id=\"tentang-algoritma\">Tentang Algoritma\u003C\u002Fh2>\n\u003Cp>Secara non-formal, algoritma adalah langkah-langkah yang harus dilakukan untuk menyelesaikan sesuatu. Sederhana saja, tidak ada yang khusus.\u003C\u002Fp>\n\u003Cp>Contohnya ada di belakang bungkus mie instan. Langkah-langkah memasak mie instan itu juga algoritma, lengkap dengan urutan yang tidak bisa ditukar: rebus air dulu, baru masukkan mie.\u003C\u002Fp>\n\u003Cp>Kalau mau yang lebih teknikal, ada contoh perhitungan bilangan faktorial. Tahu kan ya, bilangan yang ada tanda seru di belakangnya itu.\u003C\u002Fp>\n\u003Cp>Sekarang bayangkan menjelaskan faktorial ke orang yang tidak paham konsep faktorial, tapi paham betul konsep variabel, perkalian, dan pengurangan. Dengan bekal itu saja, algoritmanya bisa direkayasa:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Tentukan bilangan yang akan dicari faktorialnya, masukkan ke variabel \u003Ccode>n\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Buat variabel \u003Ccode>x\u003C\u002Fcode> bernilai 1\u003C\u002Fli>\n\u003Cli>Kalikan nilai \u003Ccode>x\u003C\u002Fcode> dengan nilai \u003Ccode>n\u003C\u002Fcode>, masukkan hasilnya ke variabel \u003Ccode>x\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Kurangi nilai \u003Ccode>n\u003C\u002Fcode> dengan 1, masukkan hasilnya ke variabel \u003Ccode>n\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Kalau nilai \u003Ccode>n\u003C\u002Fcode> masih lebih dari 1, kembali ke langkah 3. Kalau tidak, kembalikan nilai \u003Ccode>x\u003C\u002Fcode> sebagai hasil faktorial\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Itu kalau algoritma ditulis dalam Bahasa Indonesia dan ditujukan untuk orang Indonesia. Untuk komputer, bahasanya harus bahasa pemrograman. Versi Java-nya seperti ini, sudah dicoba compile dan jalankan dengan javac 21:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">JAVA\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"public%20class%20Factorial%20%7B%0A%20%20static%20long%20factorial(int%20n)%20%7B%0A%20%20%20%20long%20x%20%3D%201%3B%0A%20%20%20%20while%20(n%20%3E%201)%20%7B%0A%20%20%20%20%20%20x%20%3D%20x%20*%20n%3B%0A%20%20%20%20%20%20n%20%3D%20n%20-%201%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20x%3B%0A%20%20%7D%0A%0A%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20System.out.println(factorial(5))%3B%0A%20%20%20%20System.out.println(factorial(10))%3B%0A%20%20%7D%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>public class Factorial {\n  static long factorial(int n) {\n    long x = 1;\n    while (n &gt; 1) {\n      x = x * n;\n      n = n - 1;\n    }\n    return x;\n  }\n\n  public static void main(String[] args) {\n    System.out.println(factorial(5));\n    System.out.println(factorial(10));\n  }\n}\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Kalau dijalankan, hasilnya:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PLAIN\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"120%0A3628800\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>120\n3628800\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Algoritma itu masih belum sempurna. Nilai negatif dan nilai pecahan tidak ditangani, dan keduanya membuat hasilnya salah. Kalau programmu cuma pernah minta faktorial 5 atau 10, algoritma ini sudah cukup. Tapi tidak semua algoritma harus sempurna, yang penting bisa menyelesaikan masalah \u003Cstrong>sesuai kebutuhan\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Ch2 id=\"tentang-struktur-data\">Tentang Struktur Data\u003C\u002Fh2>\n\u003Cp>Kalau algoritma berbicara tentang langkah-langkah yang dilakukan pada data, struktur data berbicara tentang bagaimana data itu disimpan dan disusun. Ambil array dan linked list: array disimpan berurutan dan punya indeks, jadi membaca elemen ke-500 itu lompat langsung ke sana, O(1). Linked list harus menelusuri node satu per satu untuk sampai ke posisi yang sama. Tujuannya satu: menata data supaya algoritma bisa dieksekusi dengan usaha seminimal mungkin.\u003C\u002Fp>\n\u003Cp>Algoritma dan struktur data saling mendukung dan sulit dipisahkan. Satu memilih urutan langkah, satu lagi menentukan bentuk data yang diolah.\u003C\u002Fp>\n\u003Cp>Secara umum ada empat keluarga struktur data:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Linear\u003C\u002Fstrong>: disimpan berurutan, contohnya array, queue, stack, dan linked list\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Tree\u003C\u002Fstrong>: disimpan bercabang seperti hirarki, contohnya binary tree, heap, dan AVL\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Graph\u003C\u002Fstrong>: simpul yang saling terhubung, contohnya jaringan pertemanan dan peta jalan\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Hash\u003C\u002Fstrong>: disimpan tersebar lewat hash function, contohnya hash table dan set\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Masing-masing punya algoritmanya sendiri, dan di situlah kita mulai perlu memilih. Karena itu memilih pasangan algoritma dan struktur data tidak bisa sembarangan, ada kondisi yang harus diperhatikan.\u003C\u002Fp>\n\u003Ch2 id=\"pentingnya-memahami-algoritma-dan-struktur-data\">Pentingnya Memahami Algoritma dan Struktur Data\u003C\u002Fh2>\n\u003Cp>Inti pemrograman sebenarnya ada di situ: \u003Cstrong>memilih\u003C\u002Fstrong> pasangan algoritma dan struktur data yang tepat untuk masalah yang sedang dihadapi. Kedengarannya simpel, tinggal memilih.\u003C\u002Fp>\n\u003Cp>Kenyataannya tidak. Sebelum tahu pasangan yang tepat, bentuk datanya harus dipahami lebih dulu, lalu cara kerja algoritmanya, baru dicocokkan dengan masalahnya.\u003C\u002Fp>\n\u003Cp>Contohnya media sosial. Instagram, Facebook, dan kawan-kawannya punya satu kemiripan: ada hubungan antar pengguna, entah sebagai teman, follower, atau subscriber. Kalau strukturnya sudah dikenal, jawabannya langsung terlihat, yaitu \u003Cstrong>graph\u003C\u002Fstrong>. Ada \u003Cstrong>node\u003C\u002Fstrong> sebagai pengguna dan \u003Cstrong>edge\u003C\u002Fstrong> sebagai hubungannya.\u003C\u002Fp>\n\u003Cp>Di titik itu pilihan algoritmanya jadi lebih mengerucut, karena memilih struktur data biasanya lebih mudah daripada memilih algoritma. Kalau pasangannya sudah tepat, program jadi lebih efisien, lebih mudah diskalakan, dan lebih mudah dipahami orang lain.\u003C\u002Fp>\n\u003Ch3 id=\"kode-yang-lebih-efisien\">Kode yang Lebih Efisien\u003C\u002Fh3>\n\u003Cp>Efisiensi di pemrograman selalu soal dua hal: ruang dan waktu. Ruang berarti memori yang dipakai, waktu berarti lama eksekusinya. Ukurannya biasa ditakar dengan notasi O besar, yang menunjukkan seberapa cepat biaya sebuah algoritma naik saat inputnya membesar.\u003C\u002Fp>\n\u003Cp>Ambil contoh menghitung jumlah deret angka berurutan mulai dari 1:\u003C\u002Fp>\n\u003Cspan class=\"katex-display\">\u003Cspan class=\"katex\">\u003Cspan class=\"katex-mathml\">\u003Cmath xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML\" display=\"block\">\u003Csemantics>\u003Cmrow>\u003Cmsub>\u003Cmi>S\u003C\u002Fmi>\u003Cmi>n\u003C\u002Fmi>\u003C\u002Fmsub>\u003Cmo>=\u003C\u002Fmo>\u003Cmn>1\u003C\u002Fmn>\u003Cmo>+\u003C\u002Fmo>\u003Cmn>2\u003C\u002Fmn>\u003Cmo>+\u003C\u002Fmo>\u003Cmn>3\u003C\u002Fmn>\u003Cmo>+\u003C\u002Fmo>\u003Cmi mathvariant=\"normal\">.\u003C\u002Fmi>\u003Cmi mathvariant=\"normal\">.\u003C\u002Fmi>\u003Cmi mathvariant=\"normal\">.\u003C\u002Fmi>\u003Cmo>+\u003C\u002Fmo>\u003Cmo stretchy=\"false\">(\u003C\u002Fmo>\u003Cmi>n\u003C\u002Fmi>\u003Cmo>−\u003C\u002Fmo>\u003Cmn>1\u003C\u002Fmn>\u003Cmo stretchy=\"false\">)\u003C\u002Fmo>\u003Cmo>+\u003C\u002Fmo>\u003Cmi>n\u003C\u002Fmi>\u003C\u002Fmrow>\u003Cannotation encoding=\"application\u002Fx-tex\">S_n = 1 + 2 + 3 + ... + (n-1) + n\u003C\u002Fannotation>\u003C\u002Fsemantics>\u003C\u002Fmath>\u003C\u002Fspan>\u003Cspan class=\"katex-html\" aria-hidden=\"true\">\u003Cspan class=\"katex-base\">\u003Cspan class=\"katex-strut\" style=\"height:0.8333em;vertical-align:-0.15em;\">\u003C\u002Fspan>\u003Cspan class=\"mord\">\u003Cspan class=\"mord mathnormal\" style=\"margin-right:0.0576em;\">S\u003C\u002Fspan>\u003Cspan class=\"msupsub\">\u003Cspan class=\"vlist-t vlist-t2\">\u003Cspan class=\"vlist-r\">\u003Cspan class=\"vlist\" style=\"height:0.1514em;\">\u003Cspan style=\"top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;\">\u003Cspan class=\"pstrut\" style=\"height:2.7em;\">\u003C\u002Fspan>\u003Cspan class=\"katex-sizing reset-size6 size3 mtight\">\u003Cspan class=\"mord mathnormal mtight\">n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"vlist-s\">​\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"vlist-r\">\u003Cspan class=\"vlist\" style=\"height:0.15em;\">\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2778em;\">\u003C\u002Fspan>\u003Cspan class=\"mrel\">=\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2778em;\">\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"katex-base\">\u003Cspan class=\"katex-strut\" style=\"height:0.7278em;vertical-align:-0.0833em;\">\u003C\u002Fspan>\u003Cspan class=\"mord\">1\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003Cspan class=\"mbin\">+\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"katex-base\">\u003Cspan class=\"katex-strut\" style=\"height:0.7278em;vertical-align:-0.0833em;\">\u003C\u002Fspan>\u003Cspan class=\"mord\">2\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003Cspan class=\"mbin\">+\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"katex-base\">\u003Cspan class=\"katex-strut\" style=\"height:0.7278em;vertical-align:-0.0833em;\">\u003C\u002Fspan>\u003Cspan class=\"mord\">3\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003Cspan class=\"mbin\">+\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"katex-base\">\u003Cspan class=\"katex-strut\" style=\"height:0.6667em;vertical-align:-0.0833em;\">\u003C\u002Fspan>\u003Cspan class=\"mord\">...\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003Cspan class=\"mbin\">+\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"katex-base\">\u003Cspan class=\"katex-strut\" style=\"height:1em;vertical-align:-0.25em;\">\u003C\u002Fspan>\u003Cspan class=\"mopen\">(\u003C\u002Fspan>\u003Cspan class=\"mord mathnormal\">n\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003Cspan class=\"mbin\">−\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"katex-base\">\u003Cspan class=\"katex-strut\" style=\"height:1em;vertical-align:-0.25em;\">\u003C\u002Fspan>\u003Cspan class=\"mord\">1\u003C\u002Fspan>\u003Cspan class=\"mclose\">)\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003Cspan class=\"mbin\">+\u003C\u002Fspan>\u003Cspan class=\"mspace\" style=\"margin-right:0.2222em;\">\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"katex-base\">\u003Cspan class=\"katex-strut\" style=\"height:0.4306em;\">\u003C\u002Fspan>\u003Cspan class=\"mord mathnormal\">n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cp>Kalau kita terjemahkan apa adanya jadi kode, hasilnya perulangan. Versi rumusnya juga ditulis, supaya bedanya kelihatan:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">JAVA\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"public%20class%20SumRange%20%7B%0A%20%20static%20long%20withLoop(int%20n)%20%7B%0A%20%20%20%20long%20total%20%3D%200%3B%0A%20%20%20%20for%20(int%20i%20%3D%201%3B%20i%20%3C%3D%20n%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20total%20%2B%3D%20i%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20total%3B%0A%20%20%7D%0A%0A%20%20static%20long%20withFormula(int%20n)%20%7B%0A%20%20%20%20return%20(long)%20n%20*%20(n%20%2B%201)%20%2F%202%3B%0A%20%20%7D%0A%0A%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20System.out.println(withLoop(100)%20%2B%20%22%20%22%20%2B%20withFormula(100))%3B%0A%20%20%20%20System.out.println(withLoop(1_000_000)%20%2B%20%22%20%22%20%2B%20withFormula(1_000_000))%3B%0A%20%20%7D%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>public class SumRange {\n  static long withLoop(int n) {\n    long total = 0;\n    for (int i = 1; i &lt;= n; i++) {\n      total += i;\n    }\n    return total;\n  }\n\n  static long withFormula(int n) {\n    return (long) n * (n + 1) \u002F 2;\n  }\n\n  public static void main(String[] args) {\n    System.out.println(withLoop(100) + \" \" + withFormula(100));\n    System.out.println(withLoop(1_000_000) + \" \" + withFormula(1_000_000));\n  }\n}\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Dua metode itu menghitung hal yang sama, dan hasilnya memang sama:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PLAIN\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"5050%205050%0A500000500000%20500000500000\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>5050 5050\n500000500000 500000500000\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Bedanya di biaya yang kita bayar. Versi perulangan melakukan penambahan sebanyak \u003Ccode>n\u003C\u002Fcode> kali, jadi kompleksitasnya \u003Cstrong>O(n)\u003C\u002Fstrong>. Versi rumus cuma melakukan beberapa operasi, berapa pun nilai \u003Ccode>n\u003C\u002Fcode>-nya, jadi kompleksitasnya \u003Cstrong>O(1)\u003C\u002Fstrong>. Untuk satu juta angka, selisihnya bukan soal cepat atau lambat, tapi soal pekerjaan yang sebenarnya tidak perlu dikerjakan.\u003C\u002Fp>\n\u003Ch3 id=\"memudahkan-penulisan-kode\">Memudahkan Penulisan Kode\u003C\u002Fh3>\n\u003Cp>Pilihan struktur data juga memengaruhi seberapa mudah kode ditulis, karena logikanya jadi masuk akal dengan sendirinya. Ini yang dimaksud efisiensi ruang dan waktu tadi, cuma kali ini terasa di kepala, bukan di mesin.\u003C\u002Fp>\n\u003Cp>Contoh paling gampang ada di struktur data \u003Cstrong>stack\u003C\u002Fstrong>. Bayangkan tumpukan piring: yang diambil pasti yang paling atas, karena itu yang butuh usaha paling kecil. Menaruh piring juga dari atas, alasannya sama. Cara kerja stack memang begitu, masuk dari atas, keluar dari atas.\u003C\u002Fp>\n\u003Cp>Tanpa sadar, pola ini dekat sekali dengan pekerjaan harian. Fitur undo, yang jalan lewat \u003Ccode>ctrl+z\u003C\u002Fcode>, di balik layar memakai stack: setiap aksi didorong masuk, dan setiap kali undo ditekan, aksi terakhir dikeluarkan satu per satu. Persis tumpukan piring.\u003C\u002Fp>\n\u003Cp>Ketika kita menulis kode, membayangkan hal seperti ini sangat membantu. Tinggal hubungkan masalahnya dengan benda di sekitar, lalu ambil struktur data yang paling masuk akal.\u003C\u002Fp>\n\u003Ch2 id=\"selanjutnya-apa\">Selanjutnya Apa?\u003C\u002Fh2>\n\u003Cp>Di dunia ini tidak ada yang instan, bahkan memasak mie instan pun perlu perjuangan.\u003C\u002Fp>\n\u003Cp>Belajar pemrograman juga begitu. Tahu sintaks bahasa pemrograman saja belum cukup. Yang perlu dilatih adalah cara menyelesaikan masalah, lalu cara menyusun algoritma yang efisien di atasnya. Setelah itu jam terbang yang menentukan: semakin sering menyelesaikan masalah, semakin bagus kualitas algoritmanya.\u003C\u002Fp>\n\u003Cp>Membaca kode orang lain juga membantu. Tiap orang punya isi kepala yang berbeda, dan dari kode orang lain biasanya muncul alternatif penyelesaian yang tidak terpikirkan sebelumnya. Website seperti \u003Ca href=\"https:\u002F\u002Fwww.hackerrank.com\u002F\">HackerRank\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fwww.sololearn.com\u002F\">Sololearn\u003C\u002Fa>, dan \u003Ca href=\"https:\u002F\u002Fleetcode.com\u002Fproblemset\u002Fall\u002F\">LeetCode\u003C\u002Fa> bisa dipakai untuk mengasah ini.\u003C\u002Fp>\n\u003Cp>Mulai dari satu soal sehari, bukan dari daftar seratus soal yang tidak pernah dibuka.\u003C\u002Fp>\n\u003Cp>Selamat berkoding ria 👋\u003C\u002Fp>\n","\u003Cul>\n\u003Cli>Algoritma adalah urutan langkah, dan urutan itulah yang menentukan seberapa mahal sebuah masalah diselesaikan.\u003C\u002Fli>\n\u003Cli>Struktur data menentukan bagaimana data disusun, supaya algoritma bisa berjalan dengan usaha seminimal mungkin.\u003C\u002Fli>\n\u003Cli>Memilih pasangan algoritma dan struktur data lebih mudah kalau bentuk datanya dipahami dulu: deret berurutan cukup dengan array, hubungan antar pengguna butuh graph.\u003C\u002Fli>\n\u003Cli>Algoritma tidak harus sempurna. Yang penting cukup untuk kebutuhan yang sedang dihadapi.\u003C\u002Fli>\n\u003C\u002Ful>\n",[127,144,149,167,184,204],{"id":128,"title":129,"title_id":130,"slug":131,"excerpt":132,"excerpt_id":133,"has_translation":12,"published_at":134,"reading_time":135,"hidden_from_listing":15,"tags":136,"thumbnail_image":21,"og_image":139,"series":140,"authors":141},48,"What a Linked List Actually Is","Tentang Struktur Data LinkedList","tentang-struktur-data-linked-list","A linked list is a linear chain of nodes, each holding data and a pointer to the next node. Here is what that chain costs next to an array, plus a minimal implementation you can run.","Linked list adalah rantai linear berisi node, dan setiap node menyimpan data plus pointer ke node berikutnya. Ini ongkosnya dibanding array, plus implementasi paling sederhananya.","2026-11-21T01:00:00.000Z",3,[82,137,138,83],"linked-list","pointer","\u002Fog\u002Ftentang-struktur-data-linked-list.png",{"id":112,"title":113,"title_id":114,"slug":115},[142],{"authors_id":143},{"id":101,"name":102,"slug":103,"role":104,"profile_picture":21},{"id":74,"title":95,"title_id":75,"slug":76,"excerpt":96,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":85,"series":145,"authors":146},{"id":87,"title":88,"title_id":89,"slug":90},[147],{"authors_id":148},{"id":101,"name":102,"slug":103,"role":104,"profile_picture":21},{"id":150,"title":151,"title_id":152,"slug":153,"excerpt":154,"excerpt_id":155,"has_translation":12,"published_at":156,"reading_time":14,"hidden_from_listing":15,"tags":157,"thumbnail_image":21,"og_image":162,"series":163,"authors":164},108,"At 11 a.m. the AI Quota Runs Out, and the Work Stops There","Jam 11 siang kuota AI-nya habis, dan kerjaan berhenti di situ","jam-11-kuota-ai-habis-kerjaan-berhenti","The panel says the usage limit is reached and the work stops, not because it is finished. Three guesses explain it, and all three are wrong: the limit is shaped like a cliff, and the day is built on top of one tool.","Panel di layar bilang batas pemakaian tercapai, dan kerja berhenti di situ. Bukan karena selesai. Ada tiga tebakan kenapa ini terjadi, dan ketiganya salah: batasnya berbentuk tebing, dan harinya dibangun di atas satu alat.","2026-11-12T01:00:00.000Z",[158,159,160,161],"ai","tooling","rate-limit","produktivitas","\u002Fog\u002Fjam-11-kuota-ai-habis-kerjaan-berhenti.png",{"id":24,"title":25,"title_id":26,"slug":27},[165],{"authors_id":166},{"id":101,"name":102,"slug":103,"role":104,"profile_picture":21},{"id":168,"title":169,"title_id":170,"slug":171,"excerpt":172,"excerpt_id":173,"has_translation":12,"published_at":174,"reading_time":14,"hidden_from_listing":15,"tags":175,"thumbnail_image":21,"og_image":178,"series":179,"authors":181},139,"Python Classes: the History Every Account Shared","Python Class: Riwayat yang Dipakai Bersama Semua Akun","python-class-object","Two accounts, and each history lists the other account's deposits. The list sat in the class body, `append` never writes to the object, so both accounts appended into the same one.","Dua akun, dan riwayat masing-masing memuat setoran akun lain. List-nya duduk di body class, `append` tidak pernah menulis ke objek, jadi kedua akun menambah ke list yang sama.","2026-11-07T01:00:00.000Z",[176,177],"python","oop","\u002Fog\u002Fpython-class-object.png",{"id":180,"title":52,"title_id":53,"slug":54},10,[182],{"authors_id":183},{"id":101,"name":102,"slug":103,"role":104,"profile_picture":21},{"id":185,"title":186,"title_id":187,"slug":188,"excerpt":189,"excerpt_id":190,"has_translation":12,"published_at":191,"reading_time":14,"hidden_from_listing":15,"tags":192,"thumbnail_image":21,"og_image":195,"series":196,"authors":201},137,"Java Operators: the Average That Came Out a Whole Number","Operator Java: Rata-Rata yang Keluar Sebagai Bilangan Bulat","java-operators","Three scores, one division, and the average prints as 82. Both operands are `int`, so the fraction is cut off, and the obvious cast prints `82.0` without fixing anything.","Tiga nilai, satu pembagian, dan rata-ratanya tercetak 82. Kedua operand-nya `int`, jadi pecahannya dipotong, dan cast yang paling wajar malah mencetak `82.0` tanpa memperbaiki apa pun.","2026-11-06T01:00:00.000Z",[193,194],"java","operator","\u002Fog\u002Fjava-operators.png",{"id":197,"title":198,"title_id":199,"slug":200},22,"Variables, Types, and Operations","Variabel, Tipe Data, dan Operasi","java-variabel-tipe-data",[202],{"authors_id":203},{"id":101,"name":102,"slug":103,"role":104,"profile_picture":21},{"id":205,"title":206,"title_id":207,"slug":208,"excerpt":209,"excerpt_id":210,"has_translation":12,"published_at":191,"reading_time":79,"hidden_from_listing":15,"tags":211,"thumbnail_image":21,"og_image":213,"series":214,"authors":219},136,"Python Modules: the Import That Printed the Report","Modul Python: Import yang Mencetak Laporannya","python-modules","You pull one function out into its own file, import it, and the whole report runs again and eats your input. A module is a file, `import` runs it top to bottom, and one line decides which of the two jobs it is doing.","Kamu memindahkan satu fungsi ke file sendiri, meng-import-nya, dan seluruh laporan jalan lagi lalu memakan inputmu. Modul adalah file, `import` menjalankannya dari atas ke bawah, dan satu baris menentukan pekerjaan mana yang sedang dijalankan file itu.",[176,212],"modules","\u002Fog\u002Fpython-modules.png",{"id":215,"title":216,"title_id":217,"slug":218},18,"Working with Python Scripts","Menggunakan Script Python","python-pemrograman-dengan-script",[220],{"authors_id":221},{"id":101,"name":102,"slug":103,"role":104,"profile_picture":21},[223,227,230,231,234,237],{"text":224,"depth":225,"id":226},"Tentang Algoritma",2,"tentang-algoritma",{"text":228,"depth":225,"id":229},"Tentang Struktur Data","tentang-struktur-data",{"text":75,"depth":225,"id":76},{"text":232,"depth":135,"id":233},"Kode yang Lebih Efisien","kode-yang-lebih-efisien",{"text":235,"depth":135,"id":236},"Memudahkan Penulisan Kode","memudahkan-penulisan-kode",{"text":238,"depth":225,"id":239},"Selanjutnya Apa?","selanjutnya-apa",1794029326121]