Saya memiliki banyak file media yang ingin saya rekam ke DVD, tetapi karena setiap DVD hanya sesuai dengan 4,5GB, saya harus menemukan cara optimal untuk mengatur file untuk menggunakan jumlah minimum DVD (jika tidak, ruang kosong tersisa di setiap DVD dapat dengan mudah ditambahkan). Apakah ada alat untuk membantu ini?
Bertahun-tahun yang lalu ada utilitas DOS untuk melakukan ini dengan floppy disk.
Jawaban:
Coba Rentang DVD gratis :
sumber
Ah, masalah ransel . Saya hanya dapat menemukan satu pemecah online untuk ini, di sini . Ukuran ransel Anda adalah 4,5GB, dan setiap paket adalah ukuran file Anda. Anda harus memijat outputnya sedikit agar sesuai dengan aplikasi khusus Anda, tetapi harus bisa diterapkan. Ini tidak akan berjalan sangat cepat, karena masalah ini sulit .
sumber
Gambaran
Jawaban Jeff Shattock benar bahwa ini setara (atau isomorfik, seperti yang ditulis matematikawan) untuk masalah optimisasi kombinatorial, tetapi sama dengan masalah pengemasan bin 1 dimensi , bukan masalah ransel .
Beruntung bagi Anda, saya memiliki beberapa kode untuk dibagikan yang akan menyelesaikan masalah ini untuk Anda, atau siapa pun, dengan akses ke komputer Windows dengan setidaknya versi 3.5 dari .NET Framework diinstal.
Solusi Kasar
Pertama, unduh dan instal LINQPad .
Kedua, unduh kueri LINQPad yang baru saja saya tulis - inilah linq (ha) ke file mentah. Simpan sebagai file .linq dan buka di LINQPad.
Ubah parameter:
Inilah bagian dalam kode kueri LINQPad yang harus Anda ubah:
int binSizeMb = 4476; // This is the (floor of the) total size of a DVD+R reported by CDBurnerXP. string rootFileFolderPath = @"F:\2006 - Polyester Pimpstrap Intergalactic Extravaganza multicam";
Ubah
binSizeMb
ke ukuran 'tempat sampah' Anda, mis. CD, DVD, mis.int binSizeMb = 650;
untuk CD.Catatan -
binSizeMb
nilai ditafsirkan sebagai apa yang kadang-kadang disebut sebagai mebibyte . Berlawanan dengan masa kecil saya, ketika semua kelipatan byte adalah 'biner', kadang-kadang 'MB' sekarang merujuk pada 'megabita desimal' atau tepatnya 1.000.000 byte, berbeda dengan 1.048.576 byte dari mebibyte (MiB), yang digunakan dalam kode saya . Jika Anda ingin mengubah ini, ubah barisconst int bytesPerMb = 1048576;
dalam kode menjadiconst int bytesPerMb = 1000000;
.Ubah
rootFileFolderPath
ke path lengkap folder yang berisi file yang ingin Anda 'masukkan ke dalam bins', mis.string rootFileFolderPath = @"C:\MySecretBinFilesFolder";
.Jalankan kueri dengan menekan F5atau mengklik tombol Execute di kiri atas tab kueri.
Hasil
Kode permintaan akan menyebutkan semua file dalam
rootFileFolderPath
folder, secara rekursif, yang berarti akan menyertakan file di semua subfolder juga.Maka itu akan membuat 'sampah' untuk file sehingga ukuran total semua file di setiap bin kurang dari atau sama dengan ukuran bin yang ditentukan.
Di panel hasil LINQPad Anda akan melihat dua daftar.
Daftar pertama adalah dari semua file yang ditemukannya, terdaftar dalam urutan menurun berdasarkan ukuran.
Daftar kedua adalah tempat sampah yang dibuat dengan 'mengemas file', dengan daftar file dan ukurannya, serta ukuran sampah yang tersisa.
Berikut screenshot yang menunjukkan daftar kedua dan dua nampan pertama dibuat:
Analisis Sepintas
Menurut Wikipedia, algoritma yang saya gunakan - strategi First Fit Decreasing (FFD) - tidak boleh terlalu buruk; Negara Wikipedia:
'OPT' mengacu pada strategi optimal (sebagai sesuatu yang berpotensi tidak dapat dijangkau, bukan strategi aktual tertentu).
Berdasarkan ingatan saya yang agak kabur dari istilah matematika yang terlibat, ini harus berarti bahwa strategi FFD harus, paling buruk, mengemas item menjadi ~ 1,22 kali jumlah tempat sampah yang strategi optimal akan. Jadi, strategi ini mungkin mengemas item menjadi 5 nampan bukan 4. Saya curiga kinerjanya cenderung sangat dekat dengan yang optimal kecuali untuk ukuran item 'patologis' tertentu.
Artikel Wikipedia yang sama juga menyatakan bahwa ada "algoritma yang tepat" . Saya mungkin memutuskan untuk mengimplementasikannya juga. Saya harus membaca makalah yang menjelaskan algoritma terlebih dahulu.
sumber
Anda bisa menggunakan alat kompresi yang memungkinkan pemisahan arsip saya pikir
sumber
Anda dapat mengambil salah satu varian program dalam panduan Hitchhiker untuk Haskell , mungkin setelah mengerjakan beberapa bagian dari tutorial itu; tutorial ini ditulis untuk menyelesaikan masalah Anda yang sebenarnya dalam mendistribusikan berbagai hal ke beberapa disk yang solusinya disempurnakan secara bertahap, sebagaimana dicontohkan oleh bagian berikut dari Bab 3 tutorial ini:
Lebih banyak ide: pertanyaan terkait
Berikut adalah pertanyaan serupa (walaupun tidak sama: itu tidak diminta untuk optimasi di sana), di mana Anda dapat menemukan solusi / program yang lebih berguna untuk tugas Anda (jika akan diposting):
Beberapa petunjuk untuk memahami pemrograman dalam tutorial yang disarankan
Secara umum, kode Haskell cukup ekspresif (karena Haskell adalah bahasa pemrograman pada abstraksi tingkat tinggi), dan karenanya dapat dengan mudah dipahami.
Ketika melihat kode dari salah satu solusi, ingatlah bahwa struktur tingkat atas dari program yang ingin kita tulis cukup sederhana, seperti yang dijelaskan di Bab 1 tutorial ini:
dan melihat lebih dekat pada bagian-bagian dari solusi.
sumber
Beberapa waktu yang lalu saya menulis skrip PHP untuk melakukan tugas seperti itu: https://bitbucket.org/borszczuk/php-backup-maker/
sumber
Coba juga Discfit, yang memilih file dan direktori untuk disalin ke berbagai disk:
https://sourceforge.net/projects/discfit/
sumber