길이 의 배열이 제공 됩니다. 배열의 각 요소는 클래스 중 하나에 속합니다 . 당신은 그래서 스왑 작업의 최소 번호를 사용하여 배열을 정렬 해야하는 모든 요소 로부터 같은 클래스 가 연속 된 부분 배열을 형성 항상 함께 그룹화됩니다.
예 :
3 개의 다른 유효한 배열이 남아 있습니다.
문학에서이 문제는 무엇입니까? 효율적인 알고리즘이 있습니까?
길이 의 배열이 제공 됩니다. 배열의 각 요소는 클래스 중 하나에 속합니다 . 당신은 그래서 스왑 작업의 최소 번호를 사용하여 배열을 정렬 해야하는 모든 요소 로부터 같은 클래스 가 연속 된 부분 배열을 형성 항상 함께 그룹화됩니다.
예 :
3 개의 다른 유효한 배열이 남아 있습니다.
문학에서이 문제는 무엇입니까? 효율적인 알고리즘이 있습니까?
답변:
참고 : 그것은 경도 증거이며 정수 프로그래밍 등과 같은 실용적인 알고리즘이 있다고 생각합니다.
번호 를 크기의 빈에 싶은 BIN_PACKING 인스턴스가 주어지면 임을 보장 하고 인스턴스를 설계 할 수 있습니다 다음과 같이 문제의
이제 중요한 관찰은 슬롯 에서 하나 이상의 클래스를 움직이지 않고 다른 클래스를 옮기는 것은 의미가 없다는 것입니다 ( 'bin'의 크기를 변경하지 않기 때문에). 따라서 스왑의 최소 수가 보다 크지 않은 경우에만 원래의 빈 포장을 사용할 수 있습니다 . 이후 BIN-포장이 강하게 NP-완료된 것으로 알려져있다 , 문제는 NP-어렵다.
나는 이것이 NP가 어렵다고 생각하지만 증거에 대한 아이디어가 없다면 휴리스틱 솔루션의 최적 성을 확인하거나 분기 및 바운드 검색을 정리하는 데 유용 할 수있는 신속하게 계산 가능한 하한값이 있습니다. .
클래스 요소를 포함 시키십시오 . 유효한 솔루션에서 클래스 는 위치에서 시작해야합니다 . 따라서 우리는 하한 계산할 수 클래스 "고정"의 비용 모든 가능한 시작 위치를 시도하여 비의 수 계산, 길이 - 요소 위치에서 시작하는 블록을 (이들 각각의 위치는 필요 스왑) 및 최소값을 사용합니다. 이 는 대해 슬라이딩 윈도우 방식을 사용하여 시간에 를 계산할 수 있습니다전체 시간. 두 개의 전체 하한은 다음과 같습니다.
귀하의 예 에서이 경계는 모두 1을 제공합니다 (후자는 0.5를 반올림 할 수 있음). 물론 느슨합니다.