수학 및 일반 프로그래밍 (7) 대체 알고리즘

수학 및 일반 프로그래밍    https://blog.csdn.net/nameofcsdn/article/details/110448717

목차

하나, 매핑, 변환, 교체

1. 매핑

2. 변환

3. 교체

2. 변환 그룹, 순열 그룹, 대칭 그룹 (전체 순열 그룹)

1. 변환 그룹

2. 순열 그룹

3. 대칭 그룹 (전체 순열 그룹)

3. Cayley의 정리

네, 전치

다섯째, 교체는 주기로 나뉩니다.

여섯, 두 간격을 교환

일곱, 회전 (회전)

여덟, 루프를 사용하여 회전 수행

9, 거꾸로


하나, 매핑, 변환, 교체

1. 매핑

세트 A에서 세트 B로 매핑을 정의 할 수 있습니다.

주입 형인지, 대관 형인지에 따라 매핑은 비주 사형과 비주 사형, 주입 형 및 비 외설 형, Surjective 및 Non-injective, 일대일의 네 가지 유형으로 나눌 수 있습니다.

2. 변환

집합 A를 자신에 매핑하는 것을 변환이라고합니다.

당연히 세트 A에는 주입 변환, 대의 변환 및 일대일 변환이 있습니다.

일대일 매핑, 일대일 변환, ID 매핑 및 ID 변환은 모두 동일한 의미를 갖습니다.

3. 교체

A가 유한 집합이면 A에 대한 변환을 순열이라고합니다.

표준 표기 :

\ left (\ begin {array} {llll} 1 & 2 & 3 & 4 \\ 2 & 4 & 1 & 3 \ end {array} \ right)

단순화 된 표기 :

(2 4 1 3)

 

2. 변환 그룹, 순열 그룹, 대칭 그룹 (전체 순열 그룹)

1. 변환 그룹

여러 변환을 요소로, 복합을 연산으로 구성하는 그룹을 변환 그룹이라고합니다.

2. 순열 그룹

여러 순열을 요소로, 복합을 계산으로 구성하는 그룹을 순열 그룹이라고합니다.

3. 대칭 그룹 (전체 순열 그룹)

n 개 요소의 모든 순열에 의해 형성된 그룹을 대칭 그룹 Sn이라고하며 총 순열 그룹이라고도합니다.

정의에 따르면 대칭 그룹에는 다음과 같은 속성이 있습니다.

이진 연산 : 구성 (구성, 연산이 연관 됨)

역 연산 : 역순 열

단위 요소 : 신원 순열

 

3. Cayley의 정리

Cayley의 정리 : 요소가 n 개인 모든 그룹은 대칭 그룹 Sn의 하위 그룹과 동형입니다.

// TODO :이 정리의 증명은 많이 연구되지 않았습니다.

 

네, 전치

조옮김은 i 번째 및 j 번째 요소 (i ≠ j)를 대체하고 나머지 요소는 변경하지 않는 것입니다.

C ++의 스왑은 전치와 같은 의미입니다.

스왑 작업은 해당 매개 변수가 Semiregular 개념을 충족하기 만하면되고 Regular 일 필요는 없습니다.

전치 기본형 : 모든 종류의 순열은 여러 전치의 산물입니다.

 

다섯째, 교체는 주기로 나뉩니다.

순열은 여러 주기로 나눌 수 있습니다.

이 분해는 다음과 같이 쓸 수 있습니다. (235614) = (1235) (46)

하나의 요소를 포함하는주기를 사소한주기라고합니다.

길이 k의 중요하지 않은 각 루프를 완료하려면 k + 1 할당 연산이 필요합니다.

현장에서 대체 방법을 수행하려면 n-u + v 할당 작업이 필요합니다. 여기서 n은 요소의 수이고 u와 v는 대체 방법에서 사소하고 사소하지 않은주기의 수입니다.

 

여섯, 두 간격을 교환

first0 및 last0을 사용하여 첫 번째 간격의 왼쪽 및 오른쪽 경계를 나타내고 first1을 사용하여 두 번째 간격의 왼쪽 경계를 나타낼 수 있습니다.

데이터에 대해 스왑 작업을 호출 할 수 있으려면 I0의 값 유형이 I1의 값 유형과 동일한 지 확인해야합니다. 개념이 공식적으로 C ++ 언어에 통합되지 않았기 때문에이 요구 사항을 코드에 주석으로 일시적으로 표현합니다.

여기에 중요한 프로그래밍 원리가 있습니다 : 타입 분리의 원리.

두 개의 데이터가 다른 유형일 수 있다면 두 데이터가 동일한 유형이어야한다고 가정하지 마십시오.

위의 두 반복기 유형은 다를 수 있으므로 연결된 목록의 섹션과 배열의 섹션을 교환 할 수 있습니다.

 

일곱, 회전 (회전)

다음 형식의 k (k≥0) 값에 따라 n 개의 요소를 전치합니다. (k mod n, k + 1 mod n, ..., k + n-2 mod n, k + n-1 mod n) n 요소의 k 회전이라고합니다.

회전 Gries-Mills 알고리즘 :

회전 알고리즘이 알고리즘이 실행될 때 매개 변수 m의 새 값을 반환 할 수 있다면 값이 회전 전 첫 번째 요소의 위치와 회전 후 위치를 반영하기 때문에 많은 계산 시나리오에 유용합니다. 이 값을 사용하면 rotate (f, rotate (f, m, l), l)에 의해 동일성 순열을 얻을 수 있습니다.

알고리즘에 대한 할당 수는 3입니다 (n-gcd (n, k)).

Gries-Mills 알고리즘은 움직일 때마다 한 위치 만 전진하면됩니다. 즉, 알고리즘은 단일 연결 목록과 같은 데이터 구조에 사용할 수 있습니다.

 

여덟, 루프를 사용하여 회전 수행

n 요소의 k 회전에는 gcd (k, n) 사이클이 포함되어 있으므로 n + gcd (k, n) 할당 만 필요합니다.

루프의 도움으로 구현 된 회전 알고리즘은 범위가 1보다 큰 점프를 수행해야합니다. 즉, 반복자에 대한 요구 사항이 이전보다 더 높음을 의미합니다. 즉, 반복기가 랜덤 액세스를 지원해야합니다.

먼저 단일 루프를 구현합니다.

template <ForwardIterator I, Transformation F>
void rotate_cycle_from(I i, F from) {
    ValueType<I> tmp = *i;
    I start = i;
    for (I j = from(i); j = start; j = from(j)) {
        *i = *j, i = j;
    }
    *i = tmp;
}

rotate_cycle_from 함수는 반복기 i가있는 루프를 완료 할 수 있습니다. From은 점프 액세스를위한 반복기입니다. From (i)는 다음과 같이 이해할 수 있습니다. i 위치에있는 요소의 출처를 계산합니다.

루프를 사용하여 회전 수행 :

 

9, 거꾸로

Inversion (reverse)은 0 번째와 k-1 번째 요소가 서로 바뀌고, 1 번째와 k-2 번째 요소가 서로 바뀌도록 k 개의 요소를 포함하는 목록을 바꾸는 것입니다.

반전을 사용하여 회전 :

추천

출처blog.csdn.net/nameofcsdn/article/details/112448779