다른 스틱에서 동일한 스틱 절단


10

당신은 반드시 통합하지 임의의 길이의 스틱.n

일부 막대기를 자르면 (한 컷은 하나의 막대기를 자르지 만 원하는만큼 자주자를 수 있습니다), 다음 과 같은 막대기 를 얻으려고 합니다.k<n

  • 이 모든 스틱의 길이는 같습니다.k
  • 모든 스틱은 다른 스틱보다 길다.k

컷 을 수행 한 후 스틱을 얻습니다 .Cn+CC

필요한 컷 수가 최소화되도록 어떤 알고리즘을 사용 하시겠습니까? 그리고 그 숫자는 무엇입니까?

예를 들어 및 . 다음과 같은 알고리즘을 사용할 수 있습니다., N 2k=2n2

  • 과 같이 길이의 내림차순으로 스틱을 주문하십시오 .L1L2Ln
  • 만약 L12L2 다음 잘라 스틱 # 1 개의 동일한 조각. 길이 의 두 개의 스틱 1/2이 있으며, 최소한 나머지 스틱 만큼 깁니다 2.
  • 그렇지 않으면 ( 1<22 ), 스틱 # 1을 크기가 다른 두 개의 L2 조각으로 자릅니다 L1L2. 길이가 L2 인 두 개의 스틱이 있는데 , 이는 보다 길고 L1L2다른 스틱은 3n 입니다.

두 경우 모두 단일 컷으로 충분합니다.

나는 이것을 더 큰 로 일반화하려고 시도했지만 케이고려해야 할 많은 사례가있는 것 같습니다. 당신은 우아한 해결책을 찾을 수 있습니까?

답변:


6

이 문제를 해결하기위한 제 1 코어 관찰된다는 절단 길이의 타당성 ,

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

로 상수, 왼쪽 연속 및 비 증가입니다 . 필요한 절단 횟수가 비슷하게 동작하므로 최적의 길이를 찾는 것은

=최대{실현 가능 한()}

또한 다른 답변이 제안 모든 점프 불연속은 형식 입니다. 이로 인해 유한 한 후보 집합을 정렬 한 후 이진 검색에 적합한 불연속 1 차원 검색 문제가 발생합니다.나는/제이

또한 가장 큰 보다 짧은 만 고려하면 점에 하십시오 . K나는케이

그런 다음 다른 경계 는 다른 효율의 알고리즘으로 이어집니다.제이

  • k1제이케이 는 2 차 크기 ( ) 의 검색 공간을 생성합니다 .케이
  • L i1제이케이/나는 선형 선형으로 ( 가 크기를 줄이면 정렬 된다고 가정)에서나는
  • 선형으로 약간 더 많은 범위를 포함합니다.

이를 사용하여 제안 된 문제를 시간 및 공간 에서 해결할 수 있습니다 .Θ ( n + k )Θ(+케이로그케이)Θ(+케이)

하나 개의 상기 관찰의 합이다 에서 성장 로 각 후보 중복 계산 "통과". 이를 사용하여 이진 검색 대신 순위 선택을 사용하고 시간 및 공간 에서 실행되는 알고리즘을 얻을 수 있으며 이는 최적입니다. l 1 L i / j Θ ( n )에프이자형에스나는이자형1나는/제이Θ()

Fewest Cuts가있는 Envy-Free Stick Division의 효율적인 알고리즘 (Reitzig and Wild, 2015) 에서 자세한 내용을 확인하십시오 .


밝혀진 바와 같이, 우리의 절단 스틱 접근 방식의 아이디어는보다 일반적인 문제 또는 (비례적인) 배분 , 실질적인 관련성 문제로 이어진다. 우리의 짧은 기사를 참조하십시오 .
Raphael

4

@randomA가 제안한 바와 같이, 우리는 두 단계로 진행할 것입니다. 먼저 절단 할 스틱 세트를 찾은 다음 절단 수를 최소화합니다.

문제의 특별한 경우와 마찬가지로 스틱을 정렬 / 이름 지정하여 합니다. 이것은 O ( n log n ) 시간 이 걸립니다 .12영형(로그)

@ user1990169가 지적했듯이, 우리는 조각을자를 필요가 없습니다 .나는케이

첫 번째 단계에서는 번호 찾기 위해 이진 검색을 사용하는 , 1 S K 때문에 스틱 것을 1 , ... , S는 로 될 수 컷 적어도 K의 크기의 조각 L S (및 약간의 작은 조각들)이지만 스틱 1 , , s - 1 은 크기 L s - 1 k 조각 으로 절단 할 수 없습니다 . 이것은 O ( k log k ) 시간이 걸립니다.에스1에스케이1,,에스케이에스1,,에스1케이에스1영형(케이로그케이)

경우 ,이 값은 최적의 크기이고 우리는 두 단계를 건너 뛸 수있다.에스1=에스

그렇지 않으면 최적의 크기 L s - 1 > o L s를 충족 하고 o > L s 이면 o 중 하나 이상을 같은 크기의 조각으로 자르면 발생합니다. 2 단계는 o 를 결정합니다 .영형에스1>영형에스영형>에스영형영형

각 스틱 , 1 i s 에 대해 다음과 같이 후보 크기 세트를 결정하십시오. 크기 L s 로 자르면 스틱이 r i 피스 (더 짧은 경우 포함) 를 켭니다. 스틱은 모든 값 L i나는1나는에스에스아르 자형나는 , 여기서JRIL에서I나는제이제이아르 자형나는입니다. (이들이 유일한 후보 크기 인 이유는@ user1990169의 답변을참조하십시오.)나는제이<에스1

각 후보 크기마다 발생 빈도를 유지하십시오. 균형 검색 트리를 사용하면 후보 크기의 총 개수가 i r i2 k로 제한되므로 로 수행 할 수 있습니다 .영형(케이로그케이)나는아르 자형나는2케이

이제 가장 자주 발생하고 유효한 절단으로 이끄는 후보 크기는 최적의 솔루션을 제공하는 크기입니다. 또한, 후보 크기가 유효한 절단으로 이어지는 경우, 작은 크기도 유효한 절단으로 이어집니다.

우리가 다시 가장 큰 후보 길이를 찾기 위해 이진 검색을 사용할 수 있다는 점에서 유효한 절단에 리드 . 그런 다음이 임계 값까지 후보 길이 집합을 반복하고 O ( k ) 에서 가장 큰 수를 갖는 것을 찾습니다 .영형(케이로그케이)영형(케이)

초기 정렬을 무시하거나 수행 할 필요가없는 경우 총 런타임은 또는 O ( k log k ) 로 표시됩니다.영형(로그)영형(케이로그케이)


이진 탐색 단계에서, "스틱 가 적어도 k 개의 크기 L s 로 절단 될 수 있는지"를 정확히 어떻게 확인 합니까? 1,,에스케이에스
Erel Segal-Halevi

옵션 컴퓨팅 L I / L . 이 값들의 합은 얻을 수있는 조각의 수입니다. 1나는에스Li/Ls
FrankW

"가장 자주 발생하는 후보 크기는 ... 우리에게 최적의 솔루션을 제공하는 크기"입니다. 왜 그렇습니까?
Erel Segal-Halevi

그것이 발생할 때마다, 우리는 t - 1 컷으로 조각 을주는 막대기를 가지고 있습니다 . 1
FrankW

1
총 컷 수는 가장 좋은 경우 2 (k케이2길이가 같은 2 개의 막대기, 다른 모든 막대기는 이것들만큼 길고 내가 볼 수있는 한k-1보다 크지 않을 것입니다. (모든 컷이 올바른 길이의 스틱과 나머지를 만들어 내기때문에 절대로k보다 크지 않습니다. 그러나 적어도 하나의 컷이 올바른 길이의 나머지를 남기도록 항상 크기를 선택할 수 있습니다. 그러나 이에 대한 증거는 없습니다.)케이2케이1케이
FrankW

1

당신이 그들의 길이의 내림차순으로 스틱을 주문한 후, 다음 막대기 단지 모든 경우 스틱 절단되어야 L 1 , L 2 , . . . L i - 1 이 절단되었습니다.나는1,2,...나는1

이제 이기 때문에 , 우리는 막대기 L k를 앞으로 자르지 않을 것입니다. 우리는 항상 길이가 L k 인 k 개의 막대기를 가질 수 있기 때문 입니다.케이<케이케이케이

그래서 지금 대신 , 우리는 다루고있는 K - 1 개 스틱 (아마도 추가 K , 최악의 경우에 요구해야한다 상처의 최대 수를 전체 번째 스틱) = K - 1 .케이1케이=케이1

상처의 최적의 개수 인 경우에도, , 그 다음 그 중에서 스틱 중 적어도 하나 개의 세트가된다 K - 1 개 1 개 원래 스틱에서 전체적으로 수행된다 스틱<케이1케이1 (부품에 있거나, 1 개 조각)을 즉, 원래 스틱의 어떤 부분도 '깨지지 않은'상태로 두지 않아야합니다. 이는 비둘기 구멍 원리에 의해 유효한 스틱을 1 개 이상 생산해야하는 컷이 1 개 이상 있어야하기 때문입니다.

그런 다음 두 개의 중첩 된 for 루프를 수행 할 수 있습니다 (둘 다 까지 ). 외부 루프는 스틱 번호 나타낸다한다 그 모든 부분이 취해질 및 내부 루프는 부품의 개수 나타낸다한다 J 그 스틱 제조한다. 각 크기를 들면 L의 케이나는제이
스틱L1을순차적으로절단하여 실행 가능한 k 스틱을 얻을 수 있는지 확인하고 가능하면 현재 필요한 수가 적 으면 지금까지 필요한 최소 컷을 업데이트하십시오.나는제이1

위 알고리즘의 총 복잡도는 영형(영형()+케이)


1

높은 수준의 아이디어는 이진 검색입니다.

요청 된 k 개의 스틱 각각의 크기는 적어도 가장 작은 스틱이자 최대의 스틱이 될 것입니다. 이 때문에, 우리는 중간 스틱의 크기에 이진 검색을 사용하여 진행 무슨 수를 참조 이 있다면, 우리가 얻을 수 k는 ' 더 주어보다 K 우리가 새로운 참조 후보 크기를 선택해야합니다 알고 다음. 따라서 새로운 기준 스틱을 사용하여 더 크거나 작게 이동합니다. k 'k 보다 작을 때 우리는 멈춘다케이'케이'케이케이'케이

적절한 참조 스틱을 찾으면 크기를 더 세분화해야하는 코너 케이스가 있습니다. 모든 컷 스틱을 컷 수와 스틱 크기로 정렬 할 수 있습니다. 최소 컷 수와 최소 크기를 가진 것을 선택하십시오. 이 스틱의 절단 횟수를 1 씩 줄이고 이의 모든 하위 스틱을 같은 크기로 만드십시오. 이것이 새로운 참조 크기가 될 것입니다.이 새로운 크기가 수용 가능한 이어지는 지 확인하십시오 . 나는이 경우에 러닝 타임을 묶는 방법을 모른다는 것을 인정한다.케이'

바라건대, 나는 다른 답변에서 유용한 것을 볼 수 있습니다.


2
나는 당신의 접근 방식의 기본 아이디어가 효과가 있다고 생각합니다. 그러나 알고리즘에 대한 설명은 확실하지 않습니다. 더 자세한 의사 코드를 추가 할 수 있습니까?
FrankW

@FrankW 나는 실행 시간에 대해 너무 확신하지 못했습니다. 다른 사람들이 가진 것을 볼 것입니다. 이것은 매우 흥미로운 질문입니다.
InformedA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.