Fasa seperti yang saya lihat dinyatakan:
Tiada satu pun yang terasa amat sukar.
Dan sebahagian daripadanya sebenarnya kelihatan seperti satu lagi cabaran algoritma yang menyeronokkan!
Saya mahu mengubah ini:
1 |
|
Ke dalam ini:
1 |
|
Saya perlu mempertimbangkan:
Berikut ialah algoritma penjanaan cakera saya:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Berfungsi seperti azimat!
Apa yang akan menjadikan ini lebih mudah ialah mempunyai senarai semua tempat kosong pada cakera.
Saya perlu mengemas kini algoritma saya di dua tempat:
Mengujinya pada contoh menunjukkan nombor indeks yang dijangkakan bagi setiap satu .!
Ini ialah senarai yang akan saya ulangi semasa saya mengalihkan nilai dari penghujung senarai ke permulaan dan seterusnya.
Tetapi tunggu.
Ini mungkin lebih sukar daripada yang saya fikirkan.
Bagaimanakah saya akan tahu bila hendak berhenti cuba mengalihkan nilai?
Ini ialah keadaan terakhir contoh ringkas:
1 |
|
Dan contoh pertama:
1 |
|
Maksudnya ada satu titik di mana semua id berada di sebelah kiri dan semua ruang kosong berada di sebelah kanan.
Bagaimanakah saya akan menyemak keadaan itu?
Masukkan: nombor 10.
Jumlah ruang kosong bersebelahan tidak akan lebih tinggi daripada 9.
Jadi, jika saya terjumpa ruang kosong, lihat ke hadapan 9 ruang (atau pada penghujung senarai cakera) dan lihat semua ruang kosong, saya tahu saya akan selesai memecah belah.
Saya rasa saya tahu cara menulis baki algoritma ini!
Berikut ialah algoritma yang berfungsi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Cara ia berfungsi:
1 2 3 4 5 6 7 8 9 10 11 |
|
Syukurlah, saya melihat output yang sama seperti dalam kedua-dua contoh!
Ini nampaknya agak mudah dan mudah:
1 2 3 4 |
|
Dalam pseudokod:
1 2 3 |
|
Berjaya! Ia menjana jawapan yang betul untuk input contoh!
Adakah ia melakukan perkara yang sama untuk input teka-teki saya?
...
YA!!!
Woohoo!!!
Apakah kelainan untuk Bahagian Kedua? Sedikit pelarasan peraturan atau beberapa cabaran skala?
Adalah bahagian. Kini lengkap.
Ini pasti memerlukan sedikit pelarasan algoritma saya.
Mungkin penjejakan saiz celah dan blok yang lebih mantap.
Saya telah menjejaki di mana setiap kosong.
Saya rasa saya perlu menjejaki di mana - dan berapa besar - setiap kosong.
Apakah rupanya?
Cakar itu. Mungkin strategi baharu.
Menggunakan contoh pertama:
1 |
|
Saiz blok fail ialah nombor ganjil:
1 |
|
Saiz sel kosong ialah nombor genap:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Bermula dari penghujung nombor ganjil dan permulaan nombor genap, saya mencari nombor genap yang lebih besar daripada atau sama dengan nombor ganjil:
1 |
|
Saya segera mencari padanan.
Hasilnya:
1 |
|
Strategi ini pasti tidak akan berjaya.
Saya tidak suka implikasi prestasi yang satu ini.
Tetapi saya percaya ia akan berkesan...selagi ia selesai dijalankan.
Untuk setiap nombor dalam input cakera, saya akan merekodkan sebagai item senarai:
Sebagai contoh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Akan menjadi:
1 2 3 4 5 6 7 8 9 10 11 |
|
Eh, jom bersihkan:
1 2 3 4 |
|
Saya akan membezakan jurang daripada blok fail mengikut jenis data.
Mengalih blok fail akan kelihatan seperti ini dalam input contoh yang diubah:
1 2 3 |
|
Ini akan melibatkan setiap 100k lelaran:
Kedua-duanya adalah tugas yang sangat mahal.
Tetapi ini satu-satunya cara yang saya boleh fikirkan untuk menyelesaikan teka-teki ini.
Jadi, inilah pendekatan saya.
Berikut ialah JavaScript yang memberikan saya seni bina data di atas:
1 |
|
Bagaimanakah saya akan memulakan dan menamatkan gelung utama saya?
Cuba untuk mengalihkan setiap fail tepat sekali mengikut urutan mengurangkan nombor ID fail bermula dengan fail dengan nombor ID fail tertinggi
Nampaknya bergerak ke belakang ke hadapan akan melakukan apa yang saya perlukan.
Rangka gelung ini sepatutnya berfungsi:
1 |
|
1 |
|
Fasal kedua dalam if itu ialah nyahpepijat terakhir saya. Ia meletakkan ID terendah terlalu awal.
Saya menyedari bahawa saya terpaksa melihat cakera saya dipecahkan dalam masa hampir-nyata. Sekurang-kurangnya log itu, seperti dalam contoh panduan.
Syukurlah, pengekodan tidak sukar. Hanya bahagian di mana saya mencampurkan dua indeks dan melihat beberapa output pelik sebenar:
1 |
|
Ia berfungsi hebat! Saya dapat melihat tempat fail sedang dialihkan dan menyelesaikan masalah kod saya dengan lebih mudah!
1 |
|
Nampaknya algoritma pemindahan fail saya berfungsi!
Langkah terakhir ialah mengira jumlah semak baharu.
Dengan cara pengurangan dua kali:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Pada input contoh teka-teki? YA!
Pada input teka-teki saya?
...
YEEESSSSSS!
Wah. saya terkejut. Nombor yang saya serahkan untuk Bahagian 2 hampir sama dengan Bahagian 1. Saya fikir ia akan lebih tinggi.
Saya tidak berminat untuk menyiasat lebih lanjut.
Saya lebih suka mengambil dua bintang emas saya yang susah payah dan berjalan ke Hari 10.
Byeeeeee Hari ke-9!
Atas ialah kandungan terperinci Serpihan Cakera. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!