Cięcie równych drążków z różnych drążków

10

Masz drążków o dowolnej długości, niekoniecznie integralnych.n

Cięcie niektórych patyków (jedno cięcie tnie jeden patyk, ale możemy ciąć tak często, jak chcemy), chcesz uzyskać takich, aby:k<n

  • Wszystkie te kije mają taką samą długość;k
  • Wszystkie kije są co najmniej tak długie, jak wszystkie inne kije.k

Pamiętaj, że po wykonaniu cięć uzyskujemy drążkiC.n+CC

Jakiego algorytmu byś użył, aby liczba niezbędnych cięć była minimalna? A jaki jest ten numer?

Jako przykład weźmy i dowolne . Można zastosować następujący algorytm:n 2k=2n2

  • Uporządkuj drążki, malejąco według długości, aby .L1L2Ln
  • Jeśli pociąć drążek nr 1 na dwie równe części. Istnieją teraz dwa drążki o długości , które są co najmniej tak długie, jak pozostałe drążki .L 1 / 2 2 ... nL12L2L1/22n
  • W przeciwnym razie ( ) pociąć drążek nr 1 na dwa nierówne kawałki o rozmiarach i . Istnieją teraz dwa drążki o długości , która jest dłuższa niż a pozostałe drążki .L 2 L 1 - L 2 L 2 L 1 - L 2 3 nL1<2L2L2L1L2L2L1L23n

W obu przypadkach wystarczy jedno cięcie.

Próbowałem uogólnić to na większe , ale wydaje się, że jest wiele przypadków do rozważenia. Czy potrafisz znaleźć eleganckie rozwiązanie?k

Erel Segal-Halevi
źródło

Odpowiedzi:

6

Pierwszą podstawową obserwacją do rozwiązania tego problemu jest to, że wykonalność długości cięcia ,l

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

jest stały kawałek, lewy ciągły i nie rośnie w . Ponieważ liczba niezbędnych cięć zachowuje się podobnie, znalezienie optymalnej długości jest po prostu odpowiedniel

l=max{lFeasible(l)}

Ponadto, jak sugerują inne odpowiedzi, wszystkie nieciągłości skoku mają postać . To pozostawia nam dyskretny, jednowymiarowy problem wyszukiwania, który może być przeszukiwany binarnie (po posortowaniu skończonego zestawu kandydatów).Li/j

Zauważ ponadto, że musimy wziąć pod uwagę tylko które są krótsze niż największy, ponieważ jest to zawsze możliwe. kLik

Następnie różne granice prowadzą do algorytmów o różnej wydajności.j

  • k1jk powoduje, że przestrzeń wyszukiwania ma kwadratowy rozmiar (w ),k
  • L i1jk/i w (zakładając, że są sortowane według malejącego rozmiaru), iLi
  • nieco więcej zaangażowanych granic w liniową.

Korzystając z tego, możemy rozwiązać proponowany problem w czasie i spacja .Θ ( n + k )Θ(n+klogk)Θ(n+k)

Kolejnym spostrzeżeniem jest to, że suma w rośnie w o dla każdego kandydata „zdał”, licząc duplikaty. Korzystając z tego, możemy użyć wyboru rangi zamiast wyszukiwania binarnego i uzyskać algorytm działający w czasie i przestrzeni , który jest optymalny. l 1 L i / j Θ ( n )Feasiblel1Li/jΘ(n)

Znajdź szczegóły w naszym artykule Efektywne algorytmy dla podziału kija bez zazdrości o najmniejszych cięciach (Reitzig i Wild, 2015).

Raphael
źródło
Jak się okazuje, pomysły z naszego podejścia do cięcia lasek przenoszą się na bardziej ogólny problem lub (proporcjonalny) podział , problem mający praktyczne znaczenie; zobacz nasz krótki artykuł na ten temat .
Raphael
4

Zgodnie z sugestią @randomA, przejdziemy do dwóch etapów: Najpierw znajdziemy zestaw lasek, które zostaną wycięte, a następnie zminimalizujemy liczbę cięć.

Podobnie jak w przypadku szczególnym w pytaniu, sortujemy / nazywamy patyki tak, aby . Zajmuje to czas . O ( n log n )L1L2LnO(nlogn)

@ User1990169 jak podkreślił, nie musimy wyciąć kawałek .ik

W pierwszej fazie wykorzystujemy wyszukiwanie binarne w celu znalezienia liczby , , aby kije można było pociąć na co najmniej kawałków o rozmiarze (plus kilka mniejszych) , ale drążków nie można pokroić na kawałków o rozmiarze . Zajmie to czas .1 s k 1 , , s k L s 1 , , s - 1 k L s - 1 O ( k log k )s1sk1,,skLs1,,s1kLs1O(klogk)

Jeśli , ta wartość jest optymalnym rozmiarem i możemy pominąć fazę drugą.Ls1=Ls

W przeciwnym razie wiemy, że optymalna wielkość spełnia a jeśli następnie wynikach cięcia co najmniej jeden z patyczków na równe wielkości kawałki. Faza druga określi :oLs1>oLso>Lsoo

Dla każdego kija , określ zestaw rozmiarów kandydatów w następujący sposób: Jeśli cięcie na kawałki o rozmiarze zamienia kij na kawałki (w tym krótszy, jeśli taki istnieje), kandydaci na to stick to wszystkie wartości , gdzie i . (Zobacz odpowiedź @ user1990169, aby dowiedzieć się, dlaczego są to jedyne rozmiary kandydatów).i1isLsriLijjriLij<Ls1

Zachowaj dla każdego rozmiaru kandydata, jak często to miało miejsce. Korzystając ze zrównoważonego drzewa wyszukiwania, można to zrobić w , ponieważ całkowita liczba kandydatów jest ograniczona przez .O(klogk)iri2k

Teraz najczęściej wybierany rozmiar, który prowadzi do prawidłowego cięcia, to taki, który zapewnia nam optymalne rozwiązanie. Ponadto, jeśli jakikolwiek rozmiar kandydujący prowadzi do prawidłowego cięcia, każdy mniejszy rozmiar doprowadzi również do prawidłowego cięcia.

Możemy więc ponownie zastosować wyszukiwanie binarne, aby znaleźć największą długość kandydata, która prowadzi do prawidłowego cięcia w . Następnie iterujemy zestaw długości kandydatów do tego progu i znajdujemy tę o największej liczbie spośród nich w .O(klogk)O(k)

W sumie otrzymujemy środowisko wykonawcze w lub , jeśli zignorujemy (lub nie będziemy musieli) sortować początkowe.O(nlogn)O(klogk)

FrankW
źródło
W kroku wyszukiwania binarnego, jak dokładnie sprawdzasz, czy „kije można pociąć na co najmniej kawałków o rozmiarze ”? 1,,skLs
Erel Segal-Halevi
Dla obliczaj . Suma tych wartości to liczba sztuk, które można uzyskać. 1isLi/Ls
FrankW
„najczęściej występująca wielkość kandydata… to ta, która daje nam optymalne rozwiązanie” - dlaczego?
Erel Segal-Halevi
Ponieważ za każdym razem, gdy to nastąpi, mamy kij, który daje kawałków z cięciami . tt1
FrankW
1
Całkowita liczba cięć to w najlepszym przypadku ( drążki o równej długości, wszystkie inne drążki co najwyżej o połowę tak długie i o ile widzę, nigdy nie będą większe niż . (To na pewno nigdy nie będzie większe niż , ponieważ każde cięcie daje kij o odpowiedniej długości i pozostałej części. Wygląda jednak na to, że zawsze możemy wybrać rozmiar, aby co najmniej jedno cięcie pozostawiło resztę o właściwej długości. mają jednak na to dowód.)k2k2k1k
FrankW
1

Po uporządkowaniu drążków w kolejności malejącej według ich długości, drążek zostanie przecięty tylko wtedy, gdy wszystkie drążki zostaną przecięte.LiL1,L2,...Li1

Odkąd , nie będziemy robić nacięć na dalej, ponieważ zawsze możemy mieć drążków o długości .L k k L kk<nLkkLk

Więc teraz zamiast mamy do czynienia tylko z kijami (ewentualnie dodając ty kij jako całość), a maksymalna liczba cięć, które będą wymagane w najgorszym przypadku .k - 1 k = k - 1nk1k=k1

Ponadto, jeśli optymalna liczba cięć wynosi , to wśród tych drążków musi znajdować się co najmniej jeden zestaw drążków, które należy pobrać w całości z 1 oryginalnego drążkak - 1<k1k1 (w częściach lub w jednym kawałku) , tj. żadna część tego oryginalnego patyka nie może pozostać „niewykorzystana”. Wynika to z tego, że zgodnie z zasadą gołębnika należy wykonać co najmniej 1 cięcie, które będzie musiało wytworzyć więcej niż 1 ważny sztyft.

Następnie możesz przeprowadzić dwa zagnieżdżone dla pętli (oba do ). Pętla zewnętrzna oznacza numer patyka którego wszystkie części muszą zostać pobrane, a pętla wewnętrzna oznacza liczbę części wykonanych z tego patyka. Dla każdego rozmiaru sprawdź, czy możesz uzyskać wykonalne kijki, przecinając kolejno i jeśli to możliwe, zaktualizuj wymagane do tej pory minimalne cięcia, jeśli aktualna wymagana liczba jest mniejsza.i j L ikij
L1LijL1

Całkowita złożoność powyższego algorytmu wynosiO(nlog(n)+k3)

Abhishek Bansal
źródło
1

Ideą wysokiego poziomu byłoby wyszukiwanie binarne.

Rozmiar każdego z wymaganych drążków k będzie wynosił co najmniej najmniejszy drążek, a co najwyżej największy. Z tego powodu kontynuujemy wyszukiwanie binarne na podstawie rozmiaru środkowego drążka, zobaczmy, jaką liczbę możemy uzyskać, jeśli to jest większe niż podane to wiemy, że musimy wybrać nowy referencyjny rozmiar kandydata. Więc przechodzimy do większego lub mniejszego za pomocą nowego drążka odniesienia. Zatrzymujemy się, gdy jest mniejsze niżk k k kkkkkk

Po znalezieniu odpowiedniego drążka referencyjnego pojawia się narożny futerał, w którym należałoby jeszcze bardziej ulepszyć rozmiar. Możemy posortować wszystkie nacięte pałeczki według liczby nacięć na nich i wielkości patyka. Wybierz ten, który ma najmniejszą liczbę cięć i najmniejszy rozmiar. Zmniejsz liczbę cięć na tym drążku o 1 i zrób wszystkie drążki tego samego rozmiaru. To będzie nowy rozmiar odniesienia, sprawdź, czy ten nowy rozmiar może prowadzić do akceptowalnego . Przyznaję, że nie wiem, jak ograniczyć czas pracy w tym przypadku.k

Mam nadzieję, że widzę coś pożytecznego z innych odpowiedzi.

Poinformowano
źródło
2
Myślę, że podstawowa idea twojego podejścia zadziała. Ale twój opis algorytmu nie jest wystarczająco jasny, aby się upewnić. Czy możesz dodać bardziej szczegółowy pseudokod?
FrankW
@FrankW Nie jestem jednak zbyt pewny co do czasu działania. Zobaczę, co mają inni ludzie, to jest dość interesujące pytanie.
InformedA