Segala macam campuran memang ada. Anda memiliki struktur data, yang tidak terkait dengan algoritma, algoritma, yang tidak memerlukan struktur data (nyata), tetapi paling sering keduanya datang dalam satu paket.
Sunting: seperti yang ditunjukkan @Doval dengan benar, struktur data per se tidak memiliki operasi apa pun yang terkait dengannya. Tindakan menggabungkan struktur data dan algoritma membentuk tipe data abstrak.
Struktur data tanpa algoritma
Pertimbangkan misalnya struktur data untuk menyimpan koordinat 2 dimensi, yang disebut dengan tepat Point
. Tidak ada banyak dalam hal algoritma yang harus dilakukan untuk suatu titik dan itu benar-benar hanya sebuah wadah untuk suatu x
dan y
nilai. Tentu saja, dengan memberikan struktur data ini, Anda sekarang dapat menambahkan semua jenis algoritma di atasnya (perhitungan jarak, lambung cembung, apa pun yang Anda miliki).
Anda dapat memikirkan banyak struktur data, yang hanya merupakan akumulasi dari data individual. Meskipun hal ini sering terjadi dalam praktik, mereka tidak menghasilkan bahan pengajaran yang baik, karena tidak ada yang dapat dipelajari darinya, setelah Anda mengerti, bahwa item data tunggal dapat diakumulasikan ke dalam struktur data baru (seperti apa yang Anda pelajari setelah Point
contoh di atas , jika saya memberi Anda struktur data yang luar biasa yang disebut Point3D
, yang dapat melakukan hal yang sama untuk ruang 3-dimensi?)
Algoritma tanpa struktur data (nyata)
"Nyata", karena jelas setiap algoritma yang menarik membutuhkan tipe data primitif seperti bilangan bulat atau boolean, dan kami tidak ingin menganggapnya sebagai struktur data dalam konteks ini. Demikian pula untuk di atas, algoritma ini biasanya agak sederhana. Secara khusus, mereka tidak datang dengan keadaan rumit apa pun, karena itu biasanya masuk ke dalam struktur data (lihat bagian selanjutnya).
Contoh untuk algoritma seperti itu akan menghitung pembagi umum terbesar dari dua angka. Algoritma Euklid untuk gcd benar-benar hanya perlu menampung dua bilangan bulat dan memanipulasinya.
Begitu semuanya mulai menjadi lebih menarik, Anda segera memasuki dunia tipe data abstrak. Misalnya, ayakan Eratosthenes didasarkan pada array. Kita bisa berdiskusi sekarang, apakah array masih primitif, atau bahkan, Anda bisa mendiskusikan jika integer belum menjadi struktur data. Either way, algoritma yang ada sepenuhnya tanpa struktur data agak membosankan, bahkan jika Anda menerima keberadaannya yang terisolasi.
Algoritma dikombinasikan dengan struktur data, alias tipe data abstrak
Sekarang ini yang menarik, tetapi karena dua alasan yang sangat berbeda. Biasanya, Anda dapat mendekati ini dari dua arah: struktur data terlebih dahulu, atau algoritma terlebih dahulu.
Sementara tipe data abstrak didefinisikan oleh kombinasi struktur data + algoritma / operasi, kita sering melihatnya dengan fokus pada salah satu dari mereka dan menganggap yang lain sebagai enabler.
Struktur data, lalu algoritma
Anda akan menemukan tipe data abstrak, yang agak mudah digunakan, tetapi melibatkan algoritma yang lebih atau kurang rumit untuk membuatnya bekerja secara internal. Sebagai contoh, sebuah HashMap
sepele untuk digunakan, tetapi melibatkan fungsi hash yang bagus dan berurusan dengan tabrakan hash di dalam. Namun, dari sudut pandang Anda sebagai pengguna, Anda peduli tentang hal itu sebagai sesuatu yang menyimpan data untuk Anda, bukan sesuatu yang melakukan sesuatu untuk Anda.
Berbeda dengan grup terakhir di bawah ini, struktur data ini tidak mengekspos penggunanya terhadap algoritma ini. Anda tidak perlu tahu, atau peduli, tentang HashMap
fungsi hash internal agar dapat menggunakannya. (Namun, untuk menggunakannya secara efektif, Anda mungkin ingin mengetahui hal-hal ini;)
Algoritma, lalu struktur data
Arah yang lain berarti Anda memiliki algoritme, yang Anda ingin dapat cukup gunakan, tetapi yang membutuhkan struktur data secara internal untuk membuatnya berfungsi sebagaimana dimaksud. Contohnya adalah algoritme pembagian ruang biner (BSP), yang dapat Anda minta 2-dimensi Point
dari sekumpulan titik besar yang paling dekat dengan titik kueri yang diberikan. Namun, Anda memerlukan struktur pohon (dan bahkan algoritma tambahan seperti perhitungan jarak) di dalam untuk benar-benar menulis algoritma.
Secara umum, dapat dikatakan bahwa algoritma dalam grup ini menggunakan struktur data yang terlibat untuk representasi keadaan internal mereka. Saya berpendapat, bahwa kelompok algoritma ini adalah yang paling beragam dan Anda akan menemukan banyak yang berbeda yang sesuai dengan skema umum ini. Mengenai sudut pandang, kami melihat ini sebagai menarik, karena mereka melakukan sesuatu (mis. Penyortiran) untuk kami, dan tidak terlalu peduli tentang bagian data holding.
Struktur dan algoritma data yang terkait erat
Akhirnya, Anda memiliki struktur data, yang sangat dekat terkait dengan algoritma yang berhubungan langsung dengan mereka. Contoh khas adalah pohon biner, yang, ketika Anda ingin melakukan sesuatu yang bermakna dengannya, memaksakan topik algoritma berjalan pohon pada Anda (kedalaman-pertama, luas-pertama, apa pun).
Untuk kasus ini, kami mengubah fokus pandangan kami tentang tipe data abstrak yang dihasilkan setiap begitu sering. Kadang-kadang Anda peduli tentang struktur pohon Anda, beberapa menit kemudian Anda peduli untuk dapat menjalankan operasi pencarian di atasnya, lalu Anda bertanya-tanya tentang menghapus sebuah simpul, dan segera tentang bagaimana struktur terlihat setelahnya. Walaupun semua ini berlaku untuk bagian lain di atas juga, itu bukan sesuatu yang menjadi fokus utama dalam pikiran Anda, misalnya, ketika Anda menyimpan / mengambil data ke / dari Map
, atau ketika Anda mengurutkan daftar yang ditautkan.