锘??xml version="1.0" encoding="utf-8" standalone="yes"?> http://www.notonlysuccess.com/ 鍥藉唴鎼濧CM鐨?/p> http://www.keithschwarz.com/ 涓涓佸鐢⊿TL瀹炵幇鐨勭畻娉曚唬鐮?/p> http://www.possibility.com/Cpp/CppCodingStandard.html CPP浠g爜瑙勮寖
]]>
]]>
浠婂ぉ涓昏鏄兂鍥炲繂涓婦FS錛屾墍浠ュ氨閭e叏鎺掑垪寮鍒浜嗭紝鑷繁鍐欎簡涓涓彂鐜扮綉涓婄殑瑙f硶鐪熶笉閿欏氨鎯蟲葷粨涓嬶細
涓銆佸埄鐢―FS瀹炵幇錛堣嚜宸卞啓鐨勶級
搴熻瘽灝變笉璇翠簡 涓婁唬鐮侊細
瀵逛簬閫掑綊鐨勫熀鏈儴鍒?閲囩敤n=1銆傚綋鍙湁涓涓厓绱犳椂,鍙彲鑳戒駭鐢熶竴縐嶆帓鍒楁柟寮?鎵浠erm(E) = (e)錛屽叾涓璭鏄疎涓殑鍞竴鍏冪礌銆傚綋n>1鏃訛紝perm(E) = e1.perm(E1) + e2.perm(E2)+ e3.perm(E3錛?.......+en.perm(En)銆傝繖縐嶉掑綊瀹氫箟褰㈠紡鏄噰鐢╪涓猵erm(X)鏉ュ畾涔塸erm(E)錛屽叾涓瘡涓猉鍖呭惈n-1涓厓绱犮傝嚦姝わ紝涓涓畬鏁寸殑閫掑綊瀹氫箟鎵闇瑕佺殑鍩烘湰閮ㄥ垎鍜岄掑綊閮ㄥ垎閮藉凡瀹屾垚銆?br>
涓嬮潰緇欏嚭鎴戣嚜宸卞啓鐨勪唬鐮侊細
涓夈佸帇杞達細STL next_permutation
涓嬮潰鏄綉涓婄殑涓孌靛垎鏋?br>
C++/STL涓畾涔夌殑next_permutation鍜宲rev_permutation鍑芥暟鍒欐槸闈炲父鐏墊椿涓旈珮鏁堢殑涓縐嶆柟娉曪紝瀹冭騫挎硾鐨勫簲鐢ㄤ簬涓烘寚瀹氬簭鍒楃敓鎴愪笉鍚岀殑鎺掑垪銆傛湰鏂囧皢璇︾粏鐨勪粙緇峱rev_permutation鍑芥暟鐨勫唴閮ㄧ畻娉曘?/p>
銆銆鎸夌収STL鏂囨。鐨勬弿榪幫紝next_permutation鍑芥暟灝嗘寜瀛楁瘝琛ㄩ『搴忕敓鎴愮粰瀹氬簭鍒楃殑涓嬩竴涓緝澶х殑鎺掑垪錛岀洿鍒版暣涓簭鍒椾負闄嶅簭涓烘銆俻rev_permutation鍑芥暟涓庝箣鐩稿弽錛屾槸鐢熸垚緇欏畾搴忓垪鐨勪笂涓涓緝灝忕殑鎺掑垪銆備簩鑰呭師鐞嗙浉鍚岋紝浠呴亶渚嬮『搴忕浉鍙嶏紝榪欓噷浠呬互next_permutation涓轟緥浠嬬粛綆楁硶銆?/p>
銆銆鍏堝搴忓垪澶у皬鐨勬瘮杈冨仛鍑哄畾涔夛細涓や釜闀垮害鐩稿悓鐨勫簭鍒楋紝浠庝袱鑰呯殑絎竴涓厓绱犲紑濮嬪悜鍚庡鎵撅紝鐩村埌鍑虹幇涓涓笉鍚屽厓绱狅紙涔熷彲鑳藉氨鏄瀹冧滑鐨勭涓涓厓绱狅級錛岃鍏冪礌杈冨ぇ鐨勫簭鍒椾負澶э紝鍙嶄箣搴忓垪涓哄皬錛涜嫢涓鐩村埌鏈鍚庝竴涓厓绱犻兘鐩稿悓錛岄偅涔堜袱涓簭鍒楃浉絳夈?/p>
銆銆璁懼綋鍓嶅簭鍒椾負pn錛屼笅涓涓緝澶х殑搴忓垪涓簆n+1錛岃繖閲岃暣钘忕殑鍚箟鏄啀涔熸壘涓嶅埌鍙﹀鐨勫簭鍒梡m錛屼嬌寰梡n < pm < pn+1銆?/p>
銆銆闂
銆銆緇欏畾浠繪剰闈炵┖搴忓垪錛岀敓鎴愪笅涓涓緝澶ф垨杈冨皬鐨勬帓鍒椼?/p>
銆銆榪囩▼
銆銆鏍規嵁涓婅堪姒傚康鏄撶煡錛屽浜庝竴涓換鎰忓簭鍒楋紝鏈灝忕殑鎺掑垪鏄搴忥紝鏈澶х殑涓哄噺搴忋傞偅涔堢粰瀹氫竴涓猵n瑕佸浣曟墠鑳界敓鎴恜n+1鍛紵鍏堟潵鐪嬩笅闈㈢殑渚嬪瓙錛?/p>
銆銆璁? 6 4 2涓簆n錛屼笅涓涓簭鍒梡n+1搴旇鏄? 2 3 6銆傝瀵熺涓涓簭鍒楀彲浠ュ彂鐜皃n涓殑6 4 2宸茬粡涓哄噺搴忥紝鍦ㄨ繖涓瓙闆嗕腑鍐嶄篃鏃犳硶鎺掑嚭鏇村ぇ鐨勫簭鍒椾簡錛屽洜姝ゅ繀欏葷Щ鍔?鐨勪綅緗笖瑕佹壘涓涓暟鏉ュ彇浠?鐨勪綅緗傚湪6 4 2涓?鍜?閮芥瘮3澶э紝浣?姣?澶х殑澶浜嗭紝鍙兘閫?銆傚皢4鍜?鐨勪綅緗璋冨悗褰㈡垚鎺掑垪4 6 3 2銆傛敞鎰忥紝鐢變簬4鍜?澶у皬鐨勭浉閭誨叧緋伙紝瀵硅皟鍚庝駭鐢熺殑瀛愰泦6 3 2浠嶄繚鎸侀嗗簭錛屽嵆璇ュ瓙闆嗘渶澶х殑涓縐嶆帓鍒椼傝?鏄涓嬈$Щ鍔ㄥ埌澶翠竴浣嶇殑錛岄渶瑕佸悗闈㈢殑瀛愰泦涓烘渶灝忕殑鎺掑垪錛屽洜姝ょ洿鎺ュ皢6 3 2鍊掕漿涓? 3 6渚垮緱鍒頒簡姝g‘鐨勪竴涓簭鍒梡n+1銆?/p>
銆銆涓嬮潰褰掔撼鍒嗘瀽璇ヨ繃紼嬨傚亣璁句竴涓湁m涓厓绱犵殑搴忓垪pn錛屽叾涓嬩竴緇勮緝澶ф帓鍒椾負pn+1錛?/p>
銆銆鑻n鐨勬渶鍚庣殑2涓厓绱犳瀯鎴愪竴涓渶灝忕殑澧炲簭瀛愰泦錛岄偅涔堢洿鎺ュ弽杞繖2涓厓绱犱嬌璇ュ瓙闆嗘垚涓哄噺搴忓嵆鍙緱鍒皃n+1銆傜悊鐢辨槸pn鍜宲n+1鐨勫墠闈-2涓厓绱犻兘鐩哥瓑錛堟病鏈夊鍓嶉潰鐨勫厓绱犺繘琛屾搷浣滐級錛屼粎鑳介潬鏈鍚?涓厓绱犳潵鍒嗗嚭澶у皬銆傝岃繖2涓厓绱犲彧鑳藉嚭鐜?縐嶆帓鍒楋紝鍏朵腑杈冨ぇ鐨勪竴縐嶆槸鍑忓簭銆?/p>
銆銆鑻n鐨勬渶鍚庢渶澶氭湁s涓厓绱犳瀯鎴愪竴涓噺搴忓瓙闆嗭紝浠 = m - s錛屽垯鏈塸n(i) < pn(i+1)錛屽洜姝よ嫢灝唒n(i)鍜宲n(i+1)璋冩崲蹇呰兘寰楀埌涓涓緝澶х殑鎺掑垪錛堜笉涓瀹氭槸涓嬩竴涓級錛屽洜姝ゅ繀欏諱繚鎸乸n(i)涔嬪墠鐨勫厓绱犱笉鍔紝騫跺湪瀛愰泦{pn(i+1), pn(i+2), ..., pn(m)}涓壘鍒頒竴涓粎姣攑n(i)澶х殑鍏冪礌pn(j)錛屽皢浜岃呰皟鎹綅緗傛鏃跺彧瑕佸緱鍒版柊瀛愰泦{pn(i+1), pn(i+2), ..., pn(i), ...,pn(m)}鐨勬渶灝忔帓鍒楀嵆鍙傛敞鎰忓埌鏂板瓙闆嗕粛淇濇寔鍑忓簭錛岄偅涔堢洿鎺ュ皢鍏跺弽杞嵆鍙緱鍒版渶灝忕殑澧炲簭瀛愰泦銆?/p>
銆銆鎸変互涓婃楠や究鍙粠pn寰楀埌pn+1浜嗐?/p>
銆銆澶嶆潅搴?/p>
銆銆鏈濂界殑鎯呭喌涓簆n鐨勬渶鍚庣殑2涓厓绱犳瀯鎴愪竴涓渶灝忕殑澧炲簭瀛愰泦錛屼氦鎹㈡鏁頒負1錛屽鏉傚害涓篛(1)錛屾渶宸殑鎯呭喌涓?涓厓绱犳渶灝忥紝鑰屽悗闈㈢殑鎵鏈夊厓绱犳瀯鎴愬噺搴忓瓙闆嗭紝榪欐牱闇瑕佸厛灝嗙1涓厓绱犳崲鍒版渶鍚庯紝鐒跺悗鍙嶈漿鍚庨潰鐨勬墍鏈夊厓绱犮備氦鎹㈡鏁頒負1+(n-1)/2錛屽鏉傚害涓篛(n)銆傝繖鏍峰鉤鍧囧鏉傚害鍗充負O(n/2)銆?/p>
//STL鐨勭敓鎴愭柟娉?br>bool my_next_permutation(int * const begin, int * const end)
{
int *p1 , *p2;
for(p1 = end - 1; p1!= begin; p1--)//鎵懼埌搴忓垪涓粠鍚庡線鍓嶇涓涓厓绱?灝忎簬鍏冪礌2鐨勪竴瀵?br> {
if(*(p1-1)< *(p1))
break;
}
if(p1==begin)//榪欑鎯呭喌涓嬪簭鍒楀凡緇忓畬鍏ㄩ嗗簭
return false;
p1--;//浣縫1鎸囧悜灝忕殑閭d釜鏁?br> for(p2 = p1 + 1; p2 != end; p2++)//瀵繪壘p1鍚庨潰姣攑1灝忎絾鏄渶澶х殑閭d釜鏁?br> //錛岃繖閲屽埄鐢ㄤ簡鍚庨潰搴忓垪闄嶅簭鐨勬ц川
{
if(*p2 < *p1)
break;
}
p2--;//p2鎸囧悜鍚庨潰姣攑1澶т絾鏄渶灝忕殑閭d釜
iter_swap(p1,p2);//浜ゆ崲p1錛宲2鎸囧悜鐨勫厓绱?br> reverse(p1+1,end);//娉ㄦ剰鏄埌end 鍙嶅悜鑰岄潪p2
return true;
}
璇瘋繖鏍瘋皟鐢?/p>
view plaincopy to clipboardprint?
do
{
for(int i = 0; i < MAX; i++)
{
cout << d[i] << " ";
}
cout << endl;
}while(my_next_permutation(d,d+MAX));
do
{
for(int i = 0; i < MAX; i++)
{
cout << d[i] << " ";
}
cout << endl;
}while(my_next_permutation(d,d+MAX));