Internet Engineering Czesław Smutnicki Discrete Mathematics – Combinatorics
CONTENT S Functions and distributions Combinatorial objects K-subsets Subsets Sequences Set partitions Number partitions Stirling numbers Bell numbers Permutations Set on/off rule
FUNCTIONS AND DISTRIBUTIONS XY X elements, Y boxes Element can be packed to any box: n-length sequence Each box contains at most one element: set partition Box contains exactly one element: permutation
K-SUBSETS Generate all subsets with k-elements from the set of n elements
SUBSETS
SET PARTITION (1) (1,2) (1)(2) (1,2,3) (1,2)(3) (1,3)(2)(1)(2,3) (1)(2)(3)
NUMBER PARTITION
SECOND TYPE STIRLING NUMBERS
BELL NUMBERS nBnBn
PERMUTATIONS. INTRODUCTION Permutation Inverse permutation Id permutation Composition Inversions Cycles Sign
complexity variance mean receipt number of inversion in -1 o n minus the number of cycles in -1 o n minus the lenght of the maximal increasing subsequence in -1 o measure D A ( , ) D S ( , ) D I ( , ) Move type API NPI INS PERMUTATIONS. DISTANCE MEASURES
GENERATING PERMUTATIONS. IN ANTYLEX ICOGRAPHICAL ORDER void swap(int& a, int& b) { int c=a; a=b; b=c; } void reverse(int m) { int i=1,j=m; while (i<j) swap(pi[i++],pi[j--]); } void antylex(int m) { int i; if (m==1) { for (i=1;i<=m;i++) cout << pi[i] << ' '; cout << endl; } else for (i=1;i<=m;i++) { antylex(m-1); if (i<m) { swap(pi[i],pi[m]); reverse(m-1); }} }
GENERATING PERMUTATIONS. MINIMAL NUMBER OF TRANSPOSITIONS void swap(int& a, int& b) { int c=a; a=b; b=c; } int B(int m, int i) { return (!(m%2)&&(m>2))?(i<(m-1)?i:m-2):m-1; } void perm(int m) { int i; if (m==1) { for (i=1;i<=n;i++) cout << pi[i] << ' '; cout << endl; } else for (i=1;i<=m;i++) { perm(m-1); if (i<m) swap(pi[B(m,i)],pi[m]); } }
GENERATING PERMUTATIONS. MINIMAL NUMBER OF ADJACENT SWAPS void swap(int& a, int& b) { int c=a; a=b; b=c; } void permtp(int m) { int i,j,x,k; int *c=new int[m+1],*pr=new int[m+1]; for (i=1;i<m;i++) { pi[i]=i; c[i]=1; pr[i]=1; } c[m]=0; for (j=1;j<=n;j++) cout << pi[j] << ' '; cout << endl; i=1; while (i<m) { i=1; x=0; while (c[i]==(m-i+1)) { pr[i]=!pr[i]; c[i]=1; if (pr[i]) x++; i++; } if (i<m) { k=pr[i]?c[i]+x:m-i+1-c[i]+x; swap(pi[k],pi[k+1]); c[i]++; for (j=1;j<=n;j++) cout << pi[j] << ' '; cout << endl; } delete[] c; delete[] pr; }
Thank you for your attention DISCRETE MATHEMATICS Czesław Smutnicki