합계 세트를 '누계 해제'하기위한 효율적인 알고리즘


24

자연수 X의 여러 세트가 주어지면 가능한 모든 합계 세트를 고려하십시오.

sums(X)={iAi|AX}

예를 들어 sums({1,5})={0,1,5,6} 반면 sums({1,1})={0,1,2} 입니다.

역 연산을 계산하기위한 가장 효율적인 알고리즘은 무엇입니까 (입력 합의 크기로 측정)? 특히 다음 중 하나를 효율적으로 계산할 수 있습니다.

  1. 주어진 집합이 유효한 합계 집합인지 여부 예를 들어 {0,1,2} 는 유효하지만 {0,1,3} 은 유효 하지 않습니다.
  2. 주어진 세트에 합산되는 멀티 세트.
  3. 주어진 집합에 합 되는 가장 작은 다중 집합입니다. (예를 들어, {1,2}{1,1,1} 모두 {0,1,2,3} 이지만 전자는 더 작습니다.)

1
당신은 아마도 우리에게 줄 수 MULTISET 합보다는 세트 합의를? 이것은 즐거운 대칭을 만들 것입니다 (여러 값으로 시작하는 것을 봅니다).
DW

1
또 다른 질문-이론적 결과 (예 : 점근 적 복잡성) 또는 실용적인 솔루션 (실제로는 잘 작동 할 수있는 기법)에 가장 관심이 있습니까? 후자의 경우 매개 변수에 대한 일반적인 값에 대한 아이디어가 있습니까 (예 : 다중 집합 X의 크기, 다중 집합 X에서 가장 큰 요소의 크기, 가장 높은 다중성)? 이는 ILP 솔버 또는 SAT 솔버와 같은 "큰 해머"를 적용하는 것이 합리적인지 여부에 영향을 줄 수 있습니다.
DW

@DW 나는 다중 집합 대신 합계 집합을 사용하는 데 확실히 관심이 있습니다 (흥미로운 문제 일 수도 있음). 또한 이것은 원래 오락 수학 문제 였기 때문에 나는 주로 실용적인 해결책보다는 복잡한 한계에 관심이 있습니다.
Uri Granta

3
여러 세트의 합계가 주어지면 욕심스럽게 수행하는 것이 매우 간단합니다 (예 : math.stackexchange.com/questions/201545/… ).
jschnei

@UriZarfaty 입력으로 제공된 세트가 이미 정렬되어 있습니까? 마지막으로 설정 또는 다중 설정입니까? 의견은 여전히 ​​당신이 순수한 세트를 원한다고 제안합니다.
Evil

답변:


9

해결책

솔루션에는 두 부분이 있습니다. 먼저 최소 집합을 찾은 다음 전력 합 집합을 나타낼 수 있음을 증명합니다. 솔루션은 프로그래밍 구현에 맞게 조정됩니다.

최소 세트 알고리즘

  1. 합 (다중) 집합에서 최대 요소 을 찾습니다 . P , 잠재적 최소 (멀티) 세트는 초기에 비어 있습니다.amP

  2. 하나의 그룹 대표가없는 m을 까지 추가 합산 한 쌍의 모든 가능한 방법 m은 , S I J = { ( I , J ) | a i + a j = a m }amamSij={(ai,aj)|ai+aj=am}

  3. 합계 집합의 모든 요소가 포함되어 있는지 확인하십시오.

  4. 최대 요소 찾기 모든로부터 S의 난의 j는 다음과 같은 속성을 (함께 의미를) 각각에 대한 S 나는 J를 , 에 중 하나 인 S의 난의 J , 또는 우리가 찾을 수 P는 그래서 금액의 집합에서 P는 +가 S를 I의 J .asSijSijasSijapap+asSij

  5. 이 경우라면 포함하지 않는 바로 합 S + P를 제거 P + S 에서 S의 난의 J를 (또는 무시할 수있는 마크 세트) 삽입 P이야 에서 S의 난의 J 대신.Sijasas+apap+asSijapasSij

  6. 요소가 모든 경우 모든 S i j에서 한 번 제거하고 (또는 무시하고 더 이상 터치하지 않도록 마크를 설정) 잠재적 인 최소 세트 P 의 요소 목록에 추가하십시오 .SijSijP

  7. 모든 가 비워 질 때까지 반복Sij

  8. 중 일부가 비어 있지 않고 계속할 수 없으면 모든 S i j 의 최대 값으로 다시 시도하십시오 .SijSij

  9. 제거하지 않고 재귀 단계를 다시 만들고 대한 전력 세트 적용 범위 알고리즘을 계속하십시오 . (이전에 P 에 두 요소의 합으로 표현 될 수없는 모든 요소가 포함되어 있는지 확실하게 확인할 수 있으므로 반드시 기본 세트에 있어야합니다. 예를 들어 최소 요소는 P에 있어야합니다 .)PPP

(10. 알고리즘의 목표 인 최소 설정 솔루션은 같은 수의 반복을 두 번 이상 포함 할 수 없습니다.)

예:

{2,3,5,7,8,10,12,13,15}

가능한 한 모든 방법으로 15를 일련의 합계에서 두 숫자의 합계로 나타냅니다.

(13,2),(12,3),(10,5),(8,7)

모든 그룹에 있거나 합계로 표시 될 수있는 최대 값을 찾으십시오. 분명히 우리는 8부터 검색을 시작할 수 있습니다.

첫 번째 그룹의 13은 13 = 8 + 5이므로 13은 괜찮지 만 두 번째 그룹의 12는 괜찮지 않습니다. 다음으로 우리는 7로 시도합니다. 그러나 즉시 13은 커버 할 수 없으며 6은 없습니다.

다음으로 5를 시도합니다. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5, 마지막 8 = 5 + 3 또는 7 = 5 + 2이지만 둘다는 아닙니다. 그룹은 다음과 같습니다.

((5,8),2),((5,7),3),((5,5),5),((5,3),7)

5는 모든 그룹에서 반복되므로 추출합니다 . 각 그룹에서 한 번만 5를 추출합니다.P={5}

(8,2),(7,3),(5,5),(3,7)

분명히 5보다 높은 점수는 없으므로 5를 다시 시도하십시오. 8 = 5 + 3, 7 = 5 + 2이므로 모두 괜찮습니다.

((5,3),2),((5,2),3),(5,5),(3,(5,2))

반복되므로 모든 그룹에서 다시 5를 추출하십시오. (이것은 일반적이지 않지만 반복되는 경우에 수행 할 작업을 표시하기 위해 의도적으로 작성되었습니다.) P={5,5}

(3,2),(2,3),(5),(3,2)

이제 3으로 시도하고 5 = 3 + 2가됩니다. 그룹에 추가하십시오.

(3,2),(2,3),(3,2),(3,2)

이제 3과 2가 어디에서나 반복되고 추출되기 때문에 이며 그룹은 비어 있습니다.P={5,5,3,2}

(),(),(),()

이제 제거하지 않고 재귀 단계를 다시 작성해야합니다. 이는 단순히 에서 요소를 P에 배치하고 더 이상 변경하지 않도록 표시하지 않고 위의 작업을 수행하는 것을 의미합니다 .SijP

( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7

(13,2),(12,3),(10,5),(8,7)
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
((5,8),2),((5,7),3),((5,5),5),((5,3),7)
((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))

전원 설정 범위

이 부분의 목적은 찾은 최소 세트가 전력 합 세트를 포함 할 수 있는지 확인하는 것입니다. 찾은 솔루션이 주어진 모든 합계를 포괄 할 수 있지만 전력 합은 아닙니다. (기술적으로는 찾은 최소 세트에서 파워 합계 세트를 생성하고 파워 세트가 지시하는대로 각 합계가 초기 합계 세트에 있는지 확인할 수 있습니다. 이것이 이미 가지고있는 것과 합쳐서 아무것도 낭비되지 않습니다. 재귀를 되 감는 동안이 부분을 수행 할 수 있습니다.)

  1. 2의 연속 제곱을 사용하여 최소 세트에서 모든 요소를 ​​인코딩하십시오. 순서는 중요하지 않습니다. 동일한 요소를 반복 할 때마다 새 값으로 인코딩하십시오. C = 1부터 시작하여 다음 요소마다 C = 2C가 있습니다.

(2=[1],3=[2],5=[4],5=[8])
  1. 복원 된 재귀 목록의 요소를 바꾸고

((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))

인코딩이있는 경우 : 2는 1, 3은 2, 5는 4, 또 다른 5는 8입니다. 각 요소가 반복 되더라도 다른 인코딩을 갖는지 확인하십시오.

((4,(8,2)),1),((4,(8,1)),2),((4,(2,1)),8),((8,2),(4,1))
  1. 우리가 가진 순간에 모든 중간 합계를 수집하십시오 (1,2,4,8)

((4,(10)),1),((4,(9)),2),((4,(3)),8),((10),(5))

(1,2,3,4,5,8,9,10)

((14),1),((13),2),((7),8),(15)

(1,2,3,4,5,8,9,10,13,14,15)

{(15),(15),(15),(15)}
  1. 2m1mm=4

  2. 12m1

(6,7,11,12)

  1. 다음과 같은 방식으로 부재를 정당화하십시오. 각 숫자를 이진 형식으로 표시하십시오.

(6=01102) (7=01112) (11=10112) (12=10102)

601102(2=[1],3=[2],5=[4],5=[8]){2,3,5,7,8,10,12,13,15}따라서 모든 것이 좋습니다.

701112(2=[1],3=[2],5=[4],5=[8])

1112 는 3 + 5이고 8은 목록에 있습니다.

이진 표현을 찾을 수없는 합계에 해당하는 경우 솔루션이 없음을보고하십시오.

(2,3,5,5) 가 해결책입니다. 최소한의 솔루션이기도합니다.

토론

합이 이진 확장에 숨겨져있는 전력 집합 완료를 포함하는지 확인하는 알고리즘을 제공해야했습니다. 예를 들어 초기 예제에서 8과 7을 제외해도 첫 번째 부분은 여전히 ​​솔루션을 제공하지만 두 번째 부분 만 누락 된 합계 조합을보고합니다.

mnlog(m)mlog2(m)mnlog(m) 이진 검색.

mlogmmlog2(m) 입니다.

mlog3(m)

알고리즘의 일부에서는 선형 시간으로 한 쌍의 합계를 찾을 수 있으며 정렬이 필요하다고 가정합니다.

잘못된 시작

2,3,4,5,6,7,8,9,10,11,12,13,152,3,4,6Sij

5,4,3,3

2,2,3,4,42,3,4,6

이 알고리즘의 목적은 솔루션을 모두 올바르게 시작한 후에 솔루션을 제공하는 것입니다.

개량

4 단계는 이러한 방식으로 업그레이드 할 수있는 단계입니다. 최대 값 대신 지정된 조건을 만족하는 모든 요소를 ​​내림차순으로 시도 할 수 있습니다. 각각에 대해 별도의 분기를 만듭니다. 일부 지점에서 솔루션을 제공하지 않으면 취소하십시오.

2,3,4,5,6,7,8,9,10,11,12,13,157,6,5,4그들 모두가 첫 번째 시험을 통과했기 때문에 별도의 방법으로. (기본 세트에 있어야한다는 것을 알기 때문에 2 또는 3을 사용할 이유가 없습니다.) 끝까지 도달 할 수있는 모든 버전을 수집 할 때까지 계속 진행하십시오. 이렇게하면 둘 이상의 기본 세트를 발견하는 전체 범위 솔루션이 작성됩니다.

또 다른 경우는, 사건이 최소 인 경우 하나 이상의 반복을 가질 수 없다는 것을 알고 있기 때문에이를 알고리즘에 통합 할 수 있습니다.

전체적으로, 4 단계에서 숫자가 모든 그룹에서 반복되거나 합을 생성 할 수 있어야한다는 조건은 우리가 직접적인 지수 수에서 벗어날 수있을만큼 강력합니다. 이는 단순히 모든 조합을 시도하고 힘을 만드는 알고리즘입니다 일치하는 것을 찾을 때까지 각각을 설정합니다.


1
더 넓게 : 나는 알고리즘에 대한 텍스트 설명을 보지만 (a) 의사 코드는 없으며 (b) 정확성의 증거는 없습니다. 이 접근 방식이 가능한 모든 입력에서 올바르게 작동하는 알고리즘을 제공한다고 생각하는 이유는 무엇입니까? 정당화 란 무엇입니까? 이것에 대한 정확성의 증거가 있습니까?
DW

나는 문제가 약 30 시간의 작업을 모두 한 시간에 한 번 수행했다고 생각합니다 (시간당 30 배 비율, 잘 ...). 그러나 유료 옵션은 없습니다.

마지막으로 답을 자세히 읽어보십시오. 훌륭한 일!
Uri Granta

1

참고 : 이것은 일반적으로 작동하지 않습니다. 아래 Uri의 카운터 예를 참조하십시오.

YY

  • 0Y
  • yYyXY
  • z1<<znYYY=Y+{0,y}0Yi=1,,nzi+yYziYziyYzi+yYzi+yYziY
  • Yy,y,

1yO(n)O(n2) 총 복잡성 (산술 연산에 대한 단가 계산 됩니다.

Y={0,1,3,4,5,6,7}{0,1,3,4,6}{0,1,3,5,6}yY{a+ky}YY


Y '가 막 다른 골목으로 이어지지 않는 것이 분명합니까? 결국 Y = Y '+ {0, y}와 같은 많은 Y가있을 수 있습니다. 예를 들어 {0,1,2,3,4} = {0,2,3} + {0,1} = {0,1,2,3} + {0,1}이지만 이전 분해로 인해 막 다른 골목.
Uri Granta

그것은 사실이며 실제 문제입니다. 수정이 가능한지 확인해야합니다. 감사!
클라우스 드라 거

YkY=Y+{0,y,,y}{0,y,,y}kyY
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.