수학 및 일반 프로그래밍 https://blog.csdn.net/nameofcsdn/article/details/110448717
목차
2. 변환 그룹, 순열 그룹, 대칭 그룹 (전체 순열 그룹)
하나, 매핑, 변환, 교체
1. 매핑
세트 A에서 세트 B로 매핑을 정의 할 수 있습니다.
주입 형인지, 대관 형인지에 따라 매핑은 비주 사형과 비주 사형, 주입 형 및 비 외설 형, Surjective 및 Non-injective, 일대일의 네 가지 유형으로 나눌 수 있습니다.
2. 변환
집합 A를 자신에 매핑하는 것을 변환이라고합니다.
당연히 세트 A에는 주입 변환, 대의 변환 및 일대일 변환이 있습니다.
일대일 매핑, 일대일 변환, ID 매핑 및 ID 변환은 모두 동일한 의미를 갖습니다.
3. 교체
A가 유한 집합이면 A에 대한 변환을 순열이라고합니다.
표준 표기 :
단순화 된 표기 :
(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 개의 요소를 포함하는 목록을 바꾸는 것입니다.
반전을 사용하여 회전 :