이 정리 / 정렬 문제의 이름은?


10

길이 의 배열이 제공 됩니다. 배열의 각 요소는 클래스 중 하나에 속합니다 . 당신은 그래서 스왑 작업의 최소 번호를 사용하여 배열을 정렬 해야하는 모든 요소 로부터 같은 클래스 가 연속 된 부분 배열을 형성 항상 함께 그룹화됩니다. 예 : 3 개의 다른 유효한 배열이 남아 있습니다.nK

[2,1,3,3,2,2][2,2,2,1,3,3], or[2,1,3,3,2,2][1,2,2,2,3,3], or[2,1,3,3,2,2][3,3,2,2,2,1].

문학에서이 문제는 무엇입니까? 효율적인 알고리즘이 있습니까?


1
이 문제의 이름이 확실하지는 않지만 확실합니다. 생각할 수있는 모든 문제에 이름이있는 것은 아닙니다.
Yuval Filmus

2
실제로이를 그룹화 라고 합니다. 고전 알고리즘의 용어를 알지 못합니다. 스왑 수를 최소화하는 것은 "그룹의 최상의 순열을 찾는다"는 느낌을 가지며, 이는 순식간에 NP-hard-ish를 느낀다.
Raphael

잘 지내요, 고마워요 물론 나는 그 문제에 대한 해결책에 관심이 있지만, 그것이 이미 연구되어 참조를 요구하고 있다고 생각했다.
Marko Bukal

답변:


6

참고 : 그것은 경도 증거이며 정수 프로그래밍 등과 같은 실용적인 알고리즘이 있다고 생각합니다.

번호 를 크기의 빈에 싶은 BIN_PACKING 인스턴스가 주어지면 임을 보장 하고 인스턴스를 설계 할 수 있습니다 다음과 같이 문제의Kn1,,nKLm1,,mLni=mj=N

  • 거기 클래스;K+(N+1)(L1)
  • 첫 번째 클래스의 크기는 각각 이며 나머지 클래스는 각각 크기입니다. ;Kn1,,nKN+1
  • 다음 어레이는 크기의 슬롯들로 분할되고 여기서 크기의 각 슬롯 는 클래스로 묶여 있고 연속적으로 배열되고 나머지는 임의로 배열됩니다.
    m1,(N+1)2,m2,(N+1)2,m3,,(N+1)2,mL
    (N+1)2N+1

이제 중요한 관찰은 슬롯 에서 하나 이상의 클래스를 움직이지 않고 다른 클래스를 옮기는 것은 의미가 없다는 것입니다 ( 'bin'의 크기를 변경하지 않기 때문에). 따라서 스왑의 최소 수가 보다 크지 않은 경우에만 원래의 빈 포장을 사용할 수 있습니다 . 이후 BIN-포장이 강하게 NP-완료된 것으로 알려져있다 , 문제는 NP-어렵다.(N+1)2N


이것은 아름답다! 다른 사람도 어려움을 겪고있는 경우 : (1) 스왑은 하나의 요소를 최종 위치로 이동하기에 충분하기 때문에 크기가 인 슬롯에서 원하는 "빈 패킹"을 만들기에 항상 충분합니다. 이미 배치 된 요소를 방해하지 않습니다. (2) "bins"사이 의 length- "buffer zones"으로 할 수있는 것은 2 가지뿐입니다 : 다른 곳의 한쪽 끝에서 전체 길이- 클래스를 이동하십시오. (하지만이 비용 이 이미 스왑, 우리가 할 수없는 정도), 또는 "슬라이드"(오른쪽에서 왼쪽으로 또는 모든 것을 하나의 위치에 있지만, 각 ... "슬라이딩"이 수반Nm1,,mL(N+1)2(N+1)N+1
j_random_hacker

... 버퍼 왼쪽 또는 오른쪽의 한 위치에 클래스가 있으며 클래스 당 단일 스왑으로 수행 할 수 있지만 영역에 클래스가 있으므로 적어도 스왑이 필요하므로 다시 한 번 : 불가능한). 이 점은 비용 의 OP 문제에 대한 해결책 이 유효한 빈 포장을 의미 한다고 주장하는 데 필요합니다 . (3) 때문에 빈 포장이없는 강력하게 "노 더":) 여기에 적용되지 않습니다 입력으로 인코딩 된 숫자에 비례 가제트 (여기에서, 배열 요소)의 숫자 생성의 일반적인, NP-완료N+1N+1N
j_random_hacker를

1

나는 이것이 NP가 어렵다고 생각하지만 증거에 대한 아이디어가 없다면 휴리스틱 솔루션의 최적 성을 확인하거나 분기 및 바운드 검색을 정리하는 데 유용 할 수있는 신속하게 계산 가능한 하한값이 있습니다. .

클래스 요소를 포함 시키십시오 . 유효한 솔루션에서 클래스 는 위치에서 시작해야합니다 . 따라서 우리는 하한 계산할 수 클래스 "고정"의 비용 모든 가능한 시작 위치를 시도하여 비의 수 계산, 길이 - 요소 위치에서 시작하는 블록을 (이들 각각의 위치는 필요 스왑) 및 최소값을 사용합니다. 이 는 대해 슬라이딩 윈도우 방식을 사용하여 시간에 를 계산할 수 있습니다iniijLiijinijLiiO(n)O(Kn)전체 시간. 두 개의 전체 하한은 다음과 같습니다.

  1. 모든 보다 최대 값을 가져 . 대해서는 꽉 조이고 , 아마도 큰 대해서는 매우 약합니다 .LiK=2K
  2. 모든 하고 2로 나눕니다. 스왑은 최대 2 개의 잘못된 위치를 수정할 수 있기 때문에 유효합니다.Li

귀하의 예 에서이 경계는 모두 1을 제공합니다 (후자는 0.5를 반올림 할 수 있음). 물론 느슨합니다.

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