Memotong batang yang sama dari batang yang berbeda

10

Anda memiliki tongkat panjang yang sewenang-wenang, tidak harus integral.n

Dengan memotong beberapa batang (satu potong memotong satu batang, tetapi kita dapat memotong sesering yang kita inginkan), Anda ingin mendapatkan batang sedemikian rupa sehingga:k<n

  • Semua tongkat ini memiliki panjang yang sama;k
  • Semua tongkat setidaknya sepanjang tongkat lainnya.k

Perhatikan bahwa kita mendapatkan stick setelah melakukan pemotongann+CC

Algoritma apa yang akan Anda gunakan sehingga jumlah pemotongan yang diperlukan minimal? Dan berapa angka itu?

Sebagai contoh, ambil dan . Algoritme berikut dapat digunakan:k=2n2

  • Pesan tongkat dengan urutan panjang sedemikian rupa sehingga .L1L2Ln
  • Jika maka potong stick # 1 menjadi dua bagian yang sama. Sekarang ada dua batang dengan panjang , yang setidaknya sepanjang tongkat yang tersisa .L.12L.2L.1/22...n
  • Kalau tidak ( ), potong stick # 1 menjadi dua potongan ukuran yang tidak sama dan . Sekarang ada dua batang dengan panjang , yang lebih panjang dari dan batang lainnya .L.1<2L.2L.2L.1-L.2L.2L.1-L.23...n

Dalam kedua kasus, satu potongan sudah cukup.

Saya mencoba untuk menggeneralisasi ini ke lebih besar , tetapi tampaknya ada banyak kasus untuk dipertimbangkan. Bisakah Anda menemukan solusi yang elegan?k

Erel Segal-Halevi
sumber

Jawaban:

6

Pengamatan inti pertama untuk memecahkan masalah ini adalah kelayakan panjang pemotongan ,l

,Layak(l)=[saya=1nL.sayalk]

adalah piecewise-konstan, kiri-kontinu dan tidak-meningkat di . Karena jumlah potongan yang diperlukan berperilaku sama, menemukan panjang optimal adalah adill

.l=max{lFeasible(l)}

Lebih jauh, seperti jawaban lain yang telah diajukan, semua lompatan diskontinuitas memiliki bentuk . Ini membuat kita dengan masalah, pencarian satu dimensi diskrit setuju untuk pencarian biner (setelah mengurutkan satu set kandidat yang terbatas).L.saya/j

Perhatikan lebih lanjut bahwa kita hanya perlu mempertimbangkan yang lebih pendek dari k- terbesar, karena yang satu selalu layak.L.sayak

Kemudian, batas yang berbeda pada mengarah pada algoritma dengan efisiensi yang berbeda.j

  • menghasilkan ruang pencarian ukuran kuadrat (dalam k ),1jkk
  • dalam linearitmik (dengan asumsi L i diurutkan berdasarkan ukuran yang menurun), dan1jk/sayaL.saya
  • batas sedikit lebih terlibat dalam linier.

Dengan menggunakan ini, kita dapat menyelesaikan masalah yang diajukan dalam waktu dan spasi Θ ( n + k ) .Θ(n+kcatatank)Θ(n+k)

Salah satu pengamatan lebih lanjut adalah bahwa jumlah di tumbuh di l oleh 1 untuk setiap calon L i / j "lulus", penghitungan duplikat. Dengan menggunakan ini, kita dapat menggunakan pemilihan peringkat daripada pencarian binar dan mendapatkan algoritma yang berjalan dalam ruang dan waktu Θ ( n ) , yang optimal.FeSebuahssayablel1L.saya/jΘ(n)

Temukan detailnya di artikel kami Algoritma Efisien untuk Divisi Tongkat Bebas-Iri dengan Pemotongan Paling Sedikit (oleh Reitzig dan Wild, 2015).

Raphael
sumber
Ternyata, ide-ide dari pendekatan kami untuk memotong tongkat dibawa ke masalah yang lebih umum atau pembagian (proporsional) , masalah relevansi praktis; lihat artikel singkat kami tentang itu .
Raphael
4

Seperti yang disarankan @randomA, kami akan melanjutkan dalam dua tahap: Pertama-tama kami menemukan set tongkat yang akan dipotong dan kemudian meminimalkan jumlah potongan.

Seperti dalam kasus khusus dalam pertanyaan, kami mengurutkan / memberi nama tongkat sehingga . Ini membutuhkan waktu O ( n log n ) .L.1L.2L.nO(nlogn)

Seperti yang ditunjukkan oleh @ user1990169, kita tidak perlu memotong sepotong .ik

Pada fase pertama kami menggunakan pencarian biner untuk menemukan angka , 1 s k , sehingga tongkat 1 , ... , s dapat dipotong menjadi setidaknya k keping ukuran L s (ditambah beberapa keping yang lebih kecil), tetapi tongkat 1 , , s - 1 tidak dapat dipotong menjadi k potong berukuran L s - 1 . Ini akan membutuhkan waktu O ( k log k ) .s1sk1,,skLs1,,s1kLs1O(klogk)

Jika , nilai ini adalah ukuran optimal dan kita dapat melewati fase dua.Ls1=Ls

Jika tidak kita tahu bahwa ukuran optimal memenuhi L s - 1 > o L s dan jika o > L s kemudian o hasil dari pemotongan setidaknya satu dari tongkat-potong berukuran sama. Fase dua akan menentukan o :oLs1>oLso>Lsoo

Untuk setiap tongkat , 1 i s , menentukan satu set ukuran kandidat sebagai berikut: Jika memotong menjadi potongan-potongan ukuran L s bergantian tongkat ke dalam r i buah (termasuk yang lebih pendek, jika ada), maka calon ini tongkat adalah semua nilai L ii1isLsri , di manajridanLiLijjri. (Lihatjawaban @ user1990169untuk alasan mengapa ini adalah satu-satunya ukuran kandidat.)Lij<Ls1

Pertahankan untuk setiap ukuran kandidat, seberapa sering hal itu terjadi. Menggunakan pohon pencarian yang seimbang, ini dapat dilakukan di , karena jumlah total ukuran calon terikat oleh Σ i r i2 k .O(klogk)iri2k

Sekarang ukuran kandidat yang paling sering terjadi dan mengarah ke pemotongan yang valid adalah yang memberikan kita solusi optimal. Selain itu, jika ada ukuran kandidat yang mengarah ke pemotongan yang valid, ukuran yang lebih kecil akan mengarah ke pemotongan yang valid juga.

Jadi kita dapat lagi menggunakan pencarian biner untuk menemukan panjang kandidat terbesar yang mengarah ke pemotongan valid . Kemudian kita beralih pada kumpulan panjang kandidat hingga ambang ini dan menemukan satu dengan banyak terbesar di antara mereka di O ( k ) .O(klogk)O(k)

Secara total kita mendapatkan runtime di , atau O ( k log k ) , jika kita mengabaikan (atau tidak harus melakukan) jenis awal.O(nlogn)O(klogk)

FrankW
sumber
Pada langkah pencarian biner, bagaimana tepatnya Anda memeriksa apakah "stik dapat dipotong menjadi setidaknya k potongan ukuran L s "? 1,,skLs
Erel Segal-Halevi
Untuk hitung L i / L s . Jumlah nilai-nilai ini adalah jumlah potongan yang bisa Anda dapatkan. 1isLi/Ls
FrankW
"ukuran kandidat yang paling sering terjadi ... adalah yang memberi kita solusi optimal" - mengapa?
Erel Segal-Halevi
Becase setiap kali terjadi, kita memiliki tongkat yang memberikan buah dengan t - 1 luka. tt1
FrankW
1
Jumlah total pemotongan adalah dalam kasus terbaik (kk2 batang dengan panjang yang sama, semua batang lainnya paling banyak sepanjang ini dan sejauh yang saya bisa lihat tidak akan lebih darik-1. (Ini pasti tidak akan pernah lebih darik, karena setiap potongan menghasilkan batang dengan panjang yang tepat dan sisanya. Tetapi tampaknya, kita selalu dapat memilih ukuran sehingga setidaknya satu potongan meninggalkan sisa dengan panjang yang benar. tidak punya bukti untuk itu.)k2k1k
FrankW
1

Setelah Anda telah memerintahkan tongkat dalam urutan panjang mereka, maka tongkat harus dipotong hanya jika semua tongkat L 1 , L 2 , . . . L i - 1 telah terpotong.LiL1,L2,...Li1

Sekarang karena , kita tidak akan membuat potongan pada tongkat L k dan seterusnya, karena kita selalu dapat memiliki tongkat k dengan panjang L k .k<nLkkLk

Jadi sekarang alih-alih , kita hanya berurusan dengan tongkat k - 1 (mungkin menambahkan tongkat k -th secara keseluruhan), dan jumlah pemotongan maksimum yang diperlukan dalam kasus terburuk = k - 1 .nk1k=k1

Juga, jika jumlah pemotongan optimal adalah , maka harus ada setidaknya satu set stik di antara stik k - 1 yang akan diambil secara keseluruhan dari 1 stik asli<k1k1 (baik dalam bagian atau dalam 1 potong) , yaitu, tidak ada bagian dari tongkat asli yang akan dibiarkan 'tidak terambil'. Ini karena, berdasarkan prinsip lubang-merpati , harus ada setidaknya 1 potongan yang harus menghasilkan lebih dari 1 batang yang valid.

Anda kemudian dapat melakukan dua bersarang untuk loop (keduanya hingga ). Loop luar akan menunjukkan jumlah tongkat saya yang semua bagian harus diambil dan loop batin akan menunjukkan jumlah bagian j terbuat dari tongkat itu. Untuk setiap ukuran L ikij
memeriksa apakah Anda bisa mendapatkan tongkat k yang layak dengan memotong tongkatL1dan seterusnya secara berurutan, dan jika Anda bisa, maka perbarui pemotongan minimum yang diperlukan sejauh ini jika jumlah yang dibutuhkan saat ini kurang.LijL1

Total kompleksitas algoritma di atas adalah O(nlog(n)+k3)

Abhishek Bansal
sumber
1

Ide tingkat tinggi adalah pencarian biner.

Ukuran masing-masing tongkat k yang diminta akan menjadi setidaknya tongkat terkecil dan paling besar yang terbesar. Karena itu, kami melanjutkan dengan menggunakan pencarian biner pada ukuran tongkat tengah, lihat nomor dapat kita peroleh, jika k ini lebih dari yang diberikan k maka kita tahu bahwa kita perlu memilih ukuran kandidat referensi baru. Jadi kami pindah ke tongkat referensi baru yang lebih besar atau lebih kecil. Kita berhenti ketika k kurang dari kkkkkk

Setelah kami menemukan tongkat referensi yang sesuai, ada tempat sudut di mana kami perlu memperbaiki ukuran lebih lanjut. Kita dapat mengurutkan semua potongan tongkat dengan jumlah potongan pada mereka dan ukuran tongkat. Pilih satu dengan jumlah pemotongan paling sedikit dan ukuran paling sedikit. Kurangi jumlah potongan pada stick ini sebanyak 1 dan buat semua sub-stick dengan ukuran yang sama. Ini akan menjadi ukuran referensi baru, periksa untuk melihat apakah ukuran baru ini dapat menyebabkan dapat diterima . Saya akui, saya tidak tahu bagaimana cara mengikat waktu berjalan dalam kasus ini.k

Semoga saya bisa melihat sesuatu yang bermanfaat dari jawaban lain.

InformedA
sumber
2
Saya pikir ide dasar dari pendekatan Anda akan berhasil. Tetapi deskripsi algoritma Anda tidak cukup jelas untuk memastikan. Bisakah Anda menambahkan kodesemu yang lebih detail?
FrankW
@ FrankW, saya tidak terlalu yakin tentang waktu yang berjalan. Saya akan melihat apa yang dimiliki orang lain, ini pertanyaan yang cukup menarik untuk ditanyakan.
InformedA