All pastes #513081 Raw Edit

Unnamed

public cpp v1 · immutable
#513081 ·published 2007-05-27 03:30 UTC
rendered paste body
	*GI&#7842;I THU&#7852;T IN CH&#7880;NH H&#7906;P KHÔNG L&#7862;P CH&#7862;P K C&#7910;A N PH&#7846;N T&#7916;•	Nh&#7855;c l&#7841;i ch&#7881;nh h&#7907;p : Ch&#7881;nh h&#7907;p l&#7863;p ch&#7863;p K c&#7911;a N ph&#7847;n t&#7917; s&#7869; là t&#7853;p h&#7907;p con bao g&#7891;m nh&#7919;ng ph&#7847;n t&#7917; c&#7911;a t&#7853;p cha N. Ví d&#7909; :  t&#7853;p N g&#7891;m { 1,2,3,4,5} thì ch&#7881;nh h&#7907;p không l&#7863;p ch&#7863;p k = 3 là {1,2,3} ho&#7863;c { 2,3,4}. Chú ý : {1,1,2 } không th&#7875; coi là 1 ch&#7881;nh h&#7907;p không l&#7863;p &#273;&#432;&#7907;c vì 1 và 1 là trùng nhau.•	Cài &#273;&#7863;t gi&#7843;i thu&#7853;t :1.	Chúng ta s&#7869; có c&#7845;u hình &#273;&#7847;u tiên là {1 2 3} và &#273;i &#273;&#7871;n c&#7845;u hình cu&#7889;i là {5,4,3}. Nhìn 1 cách t&#7893;ng quát chúng ta th&#7845;y ch&#7859;ng qua &#273;ây là k&#297; thu&#7853;t hoán v&#7883; nh&#432;ng là hoán v&#7883; 1 cách có l&#7921;a ch&#7885;n.2.	&#272;&#7847;u tiên ta s&#7869; xét v&#7883; trí t&#7841;i ch&#7863;p k t&#7913;c là A[k-1] v&#7899;i các ph&#7847;n t&#7917; sau ch&#7863;p. Ví d&#7909; :  T&#7853;p n = 5 và k = 3 thì : 1 2 3 [4 5] thì t&#7913;c là ta xét v&#7899;i các ph&#7847;n t&#7917; sau ch&#7863;p ( 4,5 ).+ N&#7871;u v&#7883; trí hi&#7879;n t&#7841;i ( cu&#7889;i cùng c&#7911;a ch&#7863;p A[k-1] ) mà l&#7899;n h&#417;n các ph&#7847;n t&#7917; sau ch&#7863;p t&#7913;c là nó &#273;ã g&#7847;n nh&#432; là c&#7845;u hình cu&#7889;i c&#7911;a ch&#7853;p ( Vì sao tôi l&#7841;i nói ch&#7919; g&#7847;n &#7903; &#273;ây, chúng ta s&#7869; kh&#7843;o sát &#7903; ph&#7847;n ti&#7871;p ). + N&#7871;u v&#7883; trí hi&#7879;n t&#7841;i v&#7851;n còn nh&#7887; h&#417;n thì ta s&#7869; &#273;&#7895;i ch&#7895; ( &#7903; &#273;ây ta dùng k&#297; thu&#7853;t swap ) &#273;&#7875; hoán &#273;&#7893;i. Ta l&#7841;i &#273;&#432;&#7907;c 1 c&#7845;u hình m&#7899;i. N&#7871;u không ta s&#7869; &#273;&#7871;n ph&#7847;n t&#7917; k&#7871; ti&#7871;p ( ph&#7847;n t&#7917; sau ch&#7863;p ). Ngh&#297;a là theo ví d&#7909; trên n&#7871;u ta &#273;ã swap A[2] = 3 và A[3] = 4 r&#7891;i thì l&#7847;n k&#7871; ti&#7871;p A[2] s&#7869; = 4 và A[3] = 3, t&#7913;c là l&#7847;n k&#7871; ti&#7871;p : 		1 2 4 [3 5]T&#7899;i &#273;&#7853;y rõ rang A[2] > A[3] thì ta s&#7869; xét ph&#7847;n t&#7917; k&#7871; ti&#7871;p A[4], n&#7871;u nh&#7887; h&#417;n thì ta swap, còn không thì ta s&#7869; sang 1 v&#7883; trí m&#7899;i c&#7911;a ch&#7863;p t&#7913;c là xét t&#7899;i A[1].3.	Nh&#432;ng li&#7879;u ph&#7847;n t&#7917; c&#7911;a ch&#7863;p l&#7899;n h&#417;n h&#7871;t các ph&#7847;n t&#7917; sau ch&#7863;p là c&#7845;u hình cu&#7889;i hay không? Nh&#7855;c l&#7841;i ch&#7919; “g&#7847;n” mà tôi &#273;ã nói &#7903; tr&#7879;n. Chúng ta s&#7869; xét them 1 ví d&#7909; sau &#273;ây:1 4 5 [2 3]Rõ rang là 4 > 2 và 3 nh&#432;ng nó v&#7851;n < 5, v&#7853;y thì nó v&#7851;n ch&#432;a th&#7875; là c&#7845;u      hình cu&#7889;i cùng &#273;&#432;&#7907;c. Cho nên chúng ta ph&#7843;i xét ti&#7871;p v&#7883; trí hi&#7879;n tai v&#7899;i các ph&#7847;n t&#7917; trong ch&#7863;p n&#7919;a &#273;&#7875; b&#7843;o &#273;&#7843;m ch&#7855;c r&#7857;ng nó là c&#7845;u hình cu&#7889;i cùng.			Chúng ta s&#7869; xét A[1] = 4 và A[2] = 5 :+ N&#7871;u A[1] > A[5] thì ta l&#7841;i xét ti&#7871;p các ph&#7847;n t&#7917; k&#7871; ti&#7871;p trong ch&#7863;p ( ví d&#7909; : 1 6 7 8 [2 3 4 5]) ) + N&#7871;u nh&#7887; h&#417;n thì ta swap sau &#273;ó s&#7855;p x&#7871;p l&#7841;i các ph&#7847;n t&#7917; tính t&#7915; v&#7883; trí &#273;ang xét cho &#273;&#7871;n cu&#7889;i t&#7853;p t&#7913;c là A[n-1] thành gi&#7843;m d&#7847;n t&#7913;c là ví d&#7909; :1 4 5 [2 3]thì ta s&#7869; swap A[1] và A[2] thành : 1 5 4 [2 3], nh&#432;ng n&#7871;u ta &#273;&#7875; nh&#432; th&#7871; thì ta s&#7869; b&#7887; sót c&#7845;u hình 1 5 2 , 1 5 3….etc. cho nên &#273;ó là lý do t&#7841;i sao tôi l&#7841;i s&#7855;p x&#7871;p l&#7841;i &#273;o&#7841;n sau v&#7883; trí &#273;ang xét.			T&#7913;c là : 1 5 2 3 4 C&#7913; th&#7871; chúng ta l&#7841;i quay l&#7841;i xét ph&#7847;n t&#7917; t&#7915; &#273;&#7847;u ch&#7863;p t&#7913;c là lúc này là : 1 5 2 [3 4] c&#7913; ti&#7871;p t&#7909;c nh&#432; th&#7871; &#273;i cho &#273;&#7871;n c&#7845;u hình cu&#7889;i cùng s&#7869; là 5 3 4 [1 2]•	Code cài &#273;&#7863;t b&#7857;ng C++:#include <iostream>#include <iomanip>const int size = 100;int A[size], Temp[size];int number;int subset;int position;void swap ( int &r, int &c){        int temp = r;        r = c;        c = temp;}void Sort () {         for(int a = position + 1; a < number-1; a++)                for( int b = a+1; b < number; b++)                        if ( A[a] > A[b])                                swap ( A[a], A[b] );                          }void do_dec(int &position){        position--;        if ( position >= 0 )        {                Sort();                int k = position + 1;                while ( k < number-1 )                {                         if ( A[k] < A[position] )                                 k++;                        else                                 break;                }                                if ( A[k] > A[position] )                        swap( A[position], A[k] );                else                          do_dec(position);        }}void main(){      bool check;      cout << " Enter the number array's elements need to be permutated: ";  cin  >> number;      cout << " Enter subset : "; cin >> subset;      for ( int i = 0; i < number; i++ ) A[i] = i+1;      for ( int i = 0; i < number; i++ ) cout << A[i] << setw(5);      cout << "\n\n";      cout << "-------permutation algorithm--------" << "\n\n";      do      {	      for ( int i = 0; i < number; i++ )              {                      if ( i < subset )                              cout << A[i] << ","  << setw(5);                      else                               cout << "[" << A[i] << "]" << setw(3);              }	      cout << "\n\n"; cin.get();	      check = true;	      position = subset - 1; /* before subset 1 2 "3" [4 5], or the last index element of subset, 3 is an example with number = 5 and subset = 3 */	                    for ( int k = subset; k < number; k++ )              {                      if ( A[position] < A[k] )                              check = false;              }              if ( check == false ) /* Check == false means there's still elements > than current position of subset so it's not a final configuration */              {                      if ( position >= 0 )                       {                                      /* check current posiont with the element after subset, if still not find one then increasing k */                                                            int k = subset;                               while ( A[k] < A[position] )                                      k++;                                                            swap ( A[k], A[position] ); /*Found, swap with current position */                      }              }        /*If there's no element greater than current position of subset, then check next position, position--*/	      else                        do_dec(position);      }      while ( position >= 0 ); }