Cắt que bằng nhau từ các que khác nhau


10

Bạn có gậy có độ dài tùy ý, không nhất thiết phải tích phân.n

Bằng cách cắt một số que (một vết cắt cắt một que, nhưng chúng ta có thể cắt thường xuyên như chúng ta muốn), bạn muốn có được gậy như vậy:k<n

  • Tất cả các que này có cùng chiều dài;k
  • Tất cả các gậy ít nhất là dài như tất cả các gậy khác.k

Lưu ý rằng chúng tôi thu được sau khi thực hiện cắtCn+CC

Thuật toán nào bạn sẽ sử dụng sao cho số lần cắt cần thiết là tối thiểu? Và con số đó là gì?

Ví dụ: lấy và bất kỳ . Thuật toán sau có thể được sử dụng:n 2k=2n2

  • Sắp xếp các que theo thứ tự độ dài giảm dần sao cho .L1L2Ln
  • Nếu thì cắt thanh số 1 thành hai mảnh bằng nhau. Hiện tại có hai thanh có chiều dài , ít nhất bằng với các thanh còn lại .L 1 / 2 2 ... nL12L2L1/22n
  • khác ( ), cắt thanh số 1 thành hai mảnh có kích thước không bằng nhau và . Hiện tại có hai gậy có chiều dài , dài hơn và các gậy khác .L 2 L 1 - L 2 L 2 L 1 - L 2 3 ... nL1<2L2L2L1L2L2L1L23n

Trong cả hai trường hợp, một vết cắt duy nhất là đủ.

Tôi đã cố gắng khái quát hóa điều này để lớn hơn , nhưng dường như có rất nhiều trường hợp để xem xét. Bạn có thể tìm thấy một giải pháp thanh lịch?k

Câu trả lời:


6

Quan sát cốt lõi đầu tiên để giải quyết vấn đề này là tính khả thi của chiều dài cắt ,l

Feasible(l)=[i=1nLilk] ,

là piecewise-hằng, trái liên tục và không tăng trong . Vì số lần cắt cần thiết hoạt động tương tự nhau, việc tìm độ dài tối ưu chỉ làl

l=max{lFeasible(l)} .

Hơn nữa, như các câu trả lời khác đã đề xuất, tất cả các trường hợp không liên tục nhảy có dạng . Điều này khiến chúng ta gặp phải một vấn đề tìm kiếm một chiều, rời rạc, phù hợp với tìm kiếm nhị phân (sau khi sắp xếp một tập hợp các ứng cử viên hữu hạn).Li/j

Ngoài ra, xin lưu ý rằng chúng ta chỉ cần xem xét ngắn hơn -lestest, vì điều đó luôn khả thi.Lik

Sau đó, các giới hạn khác nhau trên dẫn đến các thuật toán có hiệu quả khác nhau.j

  • 1jk dẫn đến một không gian tìm kiếm có kích thước bậc hai (tính bằng ),k
  • 1jk/i theo dạng tuyến tính (giả sử được sắp xếp theo kích thước giảm dần) vàLi
  • giới hạn hơn một chút trong một tuyến tính.

Sử dụng điều này, chúng ta có thể giải quyết vấn đề được đề xuất trong thời gian và dấu cách .Θ(n+klogk)Θ(n+k)

Một quan sát nữa là tổng trong phát triển trong bởi cho mỗi ứng viên "thông qua", đếm các bản sao. Sử dụng điều này, chúng ta có thể sử dụng lựa chọn thứ hạng thay vì tìm kiếm binar và có được thuật toán chạy theo thời gian và không gian , là tối ưu.Feasiblel1Li/jΘ(n)

Tìm các chi tiết trong bài viết của chúng tôi Thuật toán hiệu quả cho bộ phận cây gậy không ghen tị với những vết cắt ít nhất (bởi Reitzig và Wild, 2015).


Hóa ra, các ý tưởng từ cách tiếp cận của chúng tôi đến việc cắt gậy chuyển sang vấn đề tổng quát hơn hoặc phân chia (tỷ lệ) , một vấn đề liên quan thực tế; xem bài viết ngắn của chúng tôi về điều đó .
Raphael

4

Như @randomA đã đề xuất, chúng tôi sẽ tiến hành theo hai giai đoạn: Trước tiên, chúng tôi tìm thấy bộ gậy sẽ được cắt và sau đó giảm thiểu số lần cắt.

Như trong trường hợp đặc biệt trong câu hỏi, chúng tôi sắp xếp / đặt tên cho các que sao cho . Điều này mất thời gian .L1L2LnO(nlogn)

Như @ user1990169 đã chỉ ra, chúng tôi không bao giờ phải cắt một mảnh .ik

Trong giai đoạn đầu tiên, chúng tôi sử dụng tìm kiếm nhị phân để tìm số , , sao cho các que có thể được cắt thành ít nhất phần có kích thước (cộng với một số phần nhỏ hơn) , nhưng các que không thể được cắt thành mảnh có kích thước . Điều này sẽ mất thời gian .s1sk1,,skLs1,,s1kLs1O(klogk)

Nếu , giá trị này là kích thước tối ưu và chúng ta có thể bỏ qua giai đoạn hai.Ls1=Ls

Mặt khác, chúng ta biết rằng kích thước tối ưu thỏa mãn và nếu thì kết quả từ việc cắt ít nhất một trong các que thành các miếng có kích thước bằng nhau. Giai đoạn hai sẽ xác định :oLs1>oLso>Lsoo

Đối với mỗi thanh , , hãy xác định một tập hợp các kích thước ứng viên như sau: Nếu cắt thành các mảnh có kích thước sẽ biến thanh thành các mảnh (bao gồm cả ngắn hơn, nếu có), thì các ứng cử viên cho điều này thanh là tất cả các giá trị , trong đó và . (Xem câu trả lời của @ user1990169 để biết lý do tại sao đây là các kích thước ứng cử viên duy nhất.)i1isLsriLijjriLij<Ls1

Duy trì cho từng kích thước ứng viên, tần suất xảy ra. Sử dụng cây tìm kiếm cân bằng, điều này có thể được thực hiện trong , vì tổng số kích thước ứng cử viên bị ràng buộc bởi .O(klogk)iri2k

Bây giờ kích thước ứng viên xảy ra thường xuyên nhất và dẫn đến cắt giảm hợp lệ là một trong đó cung cấp cho chúng tôi giải pháp tối ưu. Hơn nữa, nếu bất kỳ kích thước ứng cử viên nào dẫn đến việc cắt hợp lệ, thì bất kỳ kích thước nhỏ hơn nào cũng sẽ dẫn đến việc cắt hợp lệ.

Vì vậy, một lần nữa chúng ta có thể sử dụng tìm kiếm nhị phân để tìm độ dài ứng cử viên lớn nhất dẫn đến việc cắt hợp lệ trong . Sau đó, chúng tôi lặp lại tập hợp các độ dài ứng cử viên cho đến ngưỡng này và tìm ra nhóm có số lượng lớn nhất trong số họ trong .O(klogk)O(k)

Tổng cộng chúng ta có một thời gian chạy trong hoặc , nếu chúng ta bỏ qua (hoặc không phải làm) sắp xếp ban đầu.O(nlogn)O(klogk)


Trong bước tìm kiếm nhị phân, làm thế nào để bạn kiểm tra chính xác xem "gậy có thể được cắt thành ít nhất phần kích thước " không? 1,,skLs
Erel Segal-Halevi

Trong tính toán . Tổng của các giá trị này là số phần bạn có thể nhận được. 1isLi/Ls
FrankW

"Kích thước ứng viên xảy ra thường xuyên nhất ... là kích thước mang lại cho chúng tôi giải pháp tối ưu" - tại sao?
Erel Segal-Halevi

Becase mỗi lần nó xảy ra, chúng tôi có một cây gậy mang lại cho mảnh với vết cắt. tt1
FrankW

1
Tổng số lần cắt là trong trường hợp tốt nhất ( gậy có chiều dài bằng nhau, tất cả các que khác dài nhất bằng một nửa và theo như tôi có thể thấy sẽ không bao giờ nhiều hơn . (Nó Chắc chắn sẽ không bao giờ nhiều hơn , vì mỗi lần cắt mang lại một thanh có độ dài phù hợp và phần còn lại. Nhưng dường như, chúng ta luôn có thể chọn kích thước sao cho ít nhất một lần cắt để lại phần còn lại của độ dài chính xác. Tôi không có một bằng chứng cho điều đó, mặc dù.)k2k2k1k
FrankW

1

Sau khi bạn đã sắp xếp các que theo thứ tự giảm dần theo chiều dài của chúng, thì một thanh sẽ chỉ bị cắt nếu tất cả các gậy đã bị cắt.LiL1,L2,...Li1

Bây giờ vì , chúng tôi sẽ không thực hiện bất kỳ vết cắt nào trên gậy trở đi, vì chúng tôi luôn có thể có gậy có chiều dài .k<nLkkLk

Vì vậy, bây giờ thay vì , chúng ta chỉ xử lý các thanh (có thể thêm toàn bộ thanh thứ ) và số lần cắt tối đa sẽ được yêu cầu trong trường hợp xấu nhất .nk1k=k1

Ngoài ra, nếu số lần cắt tối ưu là , thì sẽ có ít nhất một bộ gậy trong số các gậy đó sẽ được lấy toàn bộ từ 1 thanh gốc<k1k1 (trong các phần hoặc trong 1 phần) , nghĩa là, không có phần nào của thanh gốc đó sẽ bị bỏ lại 'chưa được đánh dấu'. Điều này là do, theo nguyên tắc lỗ chim bồ câu , sẽ có ít nhất 1 vết cắt phải tạo ra nhiều hơn 1 cây gậy hợp lệ.

Sau đó, bạn có thể tiến hành hai vòng lặp lồng nhau (cả hai cho đến ). Vòng lặp bên ngoài sẽ biểu thị số thanh có tất cả các phần phải được thực hiện và vòng lặp bên trong sẽ biểu thị số phần được làm từ thanh đó. Đối với mỗi kích thước hãy kiểm tra xem bạn có thể lấy được gậy k khả thi hay không bằng cách cắt gậy trở đi liên tục và nếu có thể, thì hãy cập nhật các mức cắt tối thiểu cần thiết cho đến nay nếu số lượng yêu cầu hiện tại ít hơn.kij
LijL1

Tổng độ phức tạp của thuật toán trên làO(nlog(n)+k3)


1

Ý tưởng cấp cao sẽ là tìm kiếm nhị phân.

Kích thước của mỗi gậy k được yêu cầu sẽ ít nhất là que nhỏ nhất và nhiều nhất là que lớn nhất. Vì điều này, chúng tôi tiến hành bằng cách sử dụng tìm kiếm nhị phân trên kích thước của thanh giữa, xem số chúng tôi có thể nhận được, nếu này nhiều hơn cho trước thì chúng tôi biết rằng chúng tôi cần chọn kích thước ứng viên tham chiếu mới. Vì vậy, chúng tôi di chuyển đến lớn hơn hoặc nhỏ hơn bằng cách sử dụng thanh tham chiếu mới. Chúng ta dừng lại khi nhỏ hơnk kkkkkk

Khi chúng tôi đã tìm thấy thanh tham chiếu thích hợp, có một trường hợp góc mà chúng tôi sẽ cần phải tinh chỉnh kích thước hơn nữa. Chúng ta có thể sắp xếp tất cả các que cắt theo số lượng vết cắt trên chúng và kích thước của thanh. Chọn cái có số lần cắt ít nhất và kích thước nhỏ nhất. Giảm số lần cắt trên thanh này xuống 1 và làm cho tất cả các thanh phụ có kích thước bằng nhau. Đây sẽ là kích thước tham chiếu mới, kiểm tra xem kích thước mới này có thể dẫn đến chấp nhận được không . Tôi thừa nhận, tôi không biết làm thế nào để ràng buộc thời gian chạy trong trường hợp này.k

Hy vọng, tôi có thể thấy một cái gì đó hữu ích từ các câu trả lời khác.


2
Tôi nghĩ rằng ý tưởng cơ bản của phương pháp của bạn sẽ làm việc. Nhưng mô tả của bạn về thuật toán không đủ rõ ràng để chắc chắn. Bạn có thể thêm mã giả chi tiết hơn?
FrankW

@FrankW Tôi không quá chắc chắn về thời gian chạy. Tôi sẽ xem những gì người khác có, đây là một câu hỏi khá thú vị để hỏi.
Được thông báo vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.