DFSエントリアドバンスト - 順列と組み合わせ

図1に示すように、配置および順列の間の差に関連しました

それは配置と順列と組み合わせの違いと接触することになると、その定義とその概念についての話をしましょう:

一般にn個の異なる要素から除去配置は、n個の要素からm個の要素(順列)の順列アウトと呼ばれる特定の順序に従って配列(m≤n)の要素を、Mです。特に、M = N、この構成は、完全置換(すべての順列と呼ばれます)。

組み合わせは、基本的な考え方を学ぶように配置されています。いわゆる順列は、除去ソートの所定数の要素を指定された要素の数を指します。単にかかわらずソート、削除され、要素の指定された数の所定数の要素の組み合わせを指します。

したがって、一般的に、2つは同一の点が位置されているN個の異なる要素からm個の要素(ここで、m <= n)が撮影したが、異なる場所でのこと要素をM本考察のために採取ししかし、順列を考慮していません。

同じポイントは、非常に簡単に理解することですが、別のポイントのために、そして、私たちは自分自身に魂を拷問する必要がある - ここで何を指し順序と呼ばれますか?

次の2つのシナリオを検討してみてください。

シナリオ1:
体育の先生:「我々は、高さの順番で並んだ。」
子供の靴:「先生、それの後ろからは??あなたの前に短い高い駅の入った」
廃棄物は何も急いステーション」:!スポーツ教師それが欲しい!」
子供用の靴は怖がって震えている、Pidianpidianはチームを並んで。

シナリオ2:
講師:「我々は良いチームで、高さの順序を行。」
子供の靴を:「インストラクター、我々は左から右に行が短いそれの右??に駅の高い地位のそれを残した」
インストラクター:!「ナンセンス急い駅十分! "
子供の靴は怖がって震えている、Pidianpidianはチームを並んで。

このように、両方のシナリオでは、体育教師とインストラクターは言うものの、プレスはなく、なぜなら、セマンティックが異なりますここで、種々の文脈の「並んで高さのため、」です。明確に定義された下がない場合には、我々は唯一の明シャオ特定の意味を持たせず、推測することは、自分の経験によります。体育教師の認知では、彼は「高さの順によると、」考え「バックに、フロント、フロントのショートハイ」を意味し、インストラクターの知識で、彼はを参照「高さの順に従って」、と思いましたはい「から右、低左ハイと右に左に。」

だから、その意味の一人一人の理解に応じて、注文については変更される場合があります。一部の人々は左から右へと思い、何人かの人々は、右から左だと思います;いくつかの例では、一部の人々は大の小さなを参照すると、一部の人々はそれが下降していると思いますが、ためにすることを考えます人々はハイからローになると考えられますが、一部の人々はローからハイにあると思います...

そのため、最終的な分析では、順序のために、それの私の個人的な理解がちょうどルールや規範何の我々が指定さ人間がセットには、それが特定の意味を持っていません

したがって、1,2,3の全体構成の配置の6種類のために
[2,3]
、[3,2]
[2,1,3]
[2,3,1]
[3,1,2 ]
[3,2,1]

あなたは[1,2,3]を言うためにある、とすることはできません[3,2,1]が順に配置されていないが、[1,2,3]は昇順に並んでおり、 [3,2,1]が最大から最小への順に配置されています。実際には、加えて、だけでなく、[1,2,3]および配置の[3,2,1]二種類の残りの[3,2]の順序であり、そして、[2,1 、3]、[2,3,1]、[3,1,2]彼らはまた、順に配置されているが、順序は、さまざまな方法です。

このように、高校のために、我々は、式の構成及び順列に精通している
A(M、N)= N
×(N-1)×(N-2)×···×(N-M + 1) および
C(M、N )= N-×(N - 1)×(nは- 。。!2)×...×(N + 1-M)/ M
、M = 3、n = 3の場合、あなたはC(3,3)= 1を言うことができません一つの場合は(3,3)である= 6、状況の中の特定の種類の状況は、C(3,3)用のため、唯一の考慮3から数のプロセス番号3を取ります例最終的な数は、特定の種があるかもしれないだけでなく、プロセスと、結果を気にA(3,3)の場合は、検討するだけでなく、3つの数字数3からこの処理の結果を取るだけでなく、検討数3から取り外し手順3をこの番号を

しかし、Cものの(mは、n個)のみを検討数からn個の処理数mを取るケースの最終的な数が特定の種であってもよいが、この結果が示すと可視化するために、我々は人工的に溶液を調製する必要性を、それを表現します

スキームIは、多くの場合、個人ビューに使用される、私がします数mは昇順の順序に応じて引き出さ比喩表現の結果として。

この規定によれば、次により良い理解のために我々の順列、例えば、1,2,3-完全配列A(3,3)= [1,2,3]、[1,3,2]、[2 、1,3]、[2,3,1]、[3,1,2]、[3,2,1]、順列及び組合せに対応する6の合計は、C(3,3)= 1とすることができます1,2,3]、1種; 1,2,3-配列(2,3)= [1,2]、[1,3]、[2,1]、[2,3]、[3 、1]、[3,2]、6の合計は、配列は、対応するC(2,3)= [1,2]、[1,3]、[2,3]、三種類の合計の組み合わせであってもよいです。

図2に示すように、式理解順列に対して配置されています

明確な配置と意味および順列及び組合せの概念の後、我々はまだ何それらの式を理解する必要
A(M、N)= N ×(N-1)×(N-2)×···×(N-M +を1)
および
C(M、N)= N ×(N-1)×(N-2)×···×(N-M + 1)/ M!

第(M、N)、すなわち、Mの選択された一つからの順列n個のオブジェクトの数、N配列を着座することにより、個々の選出mと最良シートを理解することができます。合計選択は(おそらく)の数であるように、n個の可能な最初の人物があり、二人目は、(N-1)の選択、...、m番目の名前は、(N-M + 1)選択肢を有する:
N *( N-1)* ... *( NM + 1)= N!/(nm)を!

(ここで、* N-(1-N-)...。!!(NM + 1)= N /(nm)の導出手順について:
。N- *(1-N-)...。(NM + 1)
= N *(N- -1)...(NM + 1)*(NM)*(1-NM)。1 * 2 * ... * /(NM)*(1-NM)。1 * 2 * ... * = N-!/(NM) !)

座席は、個人的なMを得るM個の最良席を、選択、理解されるべきN個の個別にA(M、N)に基づいて、C(M、N)に続いて、特定の順序、第二シートこの座席に座っM個々の第二、...、m行目のこの第m行に座って、最初のシートのこの第m行の第一の個別着座ように定義することができます。従って、所定の順序の後、M-シート、すなわちMの並び順についての選択の総数で割りました!

所以
C(M、N)= N×(N-1)×(N-2)×···×(N-M + 1)/ M!
= N!/((NM)!*メートル!)

3、範囲内の正の整数で[X N、]正の整数で

上記の式の導出は、突然実現する人に見えるが、我々は、すなわち、A(M、N)= N×(N-1)×(N-2)×···×(N-M + 1)に、問題を無視することができます期間終了(N-M + 1)、およびM-名が(N-M + 1)の選択、どのように我々は理解して(N - M + 1)です派生?

この時間は、我々が方程式の法と解決策を見つけるために、小学校の一般的な知識を把握ものを検討する必要があります。

私たちは、のために、知っている[2,5]の範囲の正の整数か、我々は日常の生活の話を 2-5、2の合計、3、4、5 4つの正の整数の合計を。この問題のために、それは問題は、それが今日の21世紀には非常に困難であり、答えられない場合であっても、すでに私たちの生活の常識であるので、あなたは数ある、またはカウント、あるいは推測するかどうか、それは、問題ではありません生き残ります。

範囲内の正の整数の場合、[2,50]または2-50、2、3、4、5 ... 48,49,50、49個の正の整数の合計、これはあなたの番号であれば、あなたもアウトカウントすることができますが、 、おそらく少しも激しいです。その結果、このような[2,50000000]として範囲間隔、[2,5000000000000]、「番号」方法、明らかにそう微弱を拡大します。

我々はそれをカウントされませんので、我々はこの問題に直面し、解決する必要があり、確かに彼らは、我々はそれを解決するために使用できる数式を持っている必要があります。

我々は、可能な状況にいくつかの配慮を与えることを試みることができる:
[1,2]は、2の正の整数であり、2があるため、
3つの正の整数の[1,3]、1,2,3、合計
のために[ 4]は、4つの正の整数1,2,3,4の合計があり、
さらに加算法則は:
[1、N]のために、1,2、...、N合計N-1 + 1 = nは正の整数であります、

同様に、
[2、n]は、2,3の合計... N N-2 + 1 = N-ための 1つの正の整数、
[3、n]は、3,4と... N全N-3 + 1 = N-2の正の整数で、
そしてその後、最終的な法則まとめる
定理1:任意の正の整数xに対して、N下部及び間隔の上限としては[X、n]は、X、X + 1を有し、... N N-X + 1番目でした正の整数、請求x∈[1、N]

そして、同様の証拠は、リリース法由来することができる:
定理2:整数xに対して、nは、下限と上限区間[X、n]は、···X、X + 1を有するとしてn-たN-X + 1つの整数を前記x∈[-N、N]

理論定理1及び2、問い合わせ再び式(N-M + 1)由来で、それはオープンマインド陽気です。

式配置のために、あるA(M、N)= N×(N-1)×(N-2)×···×(N-M + 1)構成は数N Mから選択されているので、数、数mであるように番号1(N-1)可能なため、第3の数(N-2)可能がある(N-0)種は、第二の数を有することができる持っています...明らかに、xの最小値は0、最大値は定理2を用いて求め可能(NX)が設けられているkの数:設定されている場合、最大値Pとし、[0、P] +トータルP-0 1 = P + 1つの整数、趣旨P + 1 = M、その後、P = M-1、そうMの数、合計(N(M-1))のため =(N-M + 1) 可能。

あなたは上記のSidongfeidong証拠を見ると(、この方法はまた、置換変数を試みることができる:
計算式配置のために、あるA(M、N)= N ×(N-1)×( 2-N)×···×(N-M + 1) および可能な最初の数(N-0)が存在するように配置は、番号nから数mのm個を選択しているので2の数(N-1)が可能であり、可能な第3の数(N-2)があり、... kの数のため、可能(NX)と、結論する前に、それは、x = K-理解されています図1に示すように、第1の数kに対して、(N-(K-1))が存在するよう =(N-k + 1) の可能なので、最初の番号mについて、存在する(N-M + 1)が可能。)

定理は、C(K、N)のために、順列及び組合せを理解の上、すなわち、kは数からn個に選択されるのを前提に基づいて、選択された範囲の数がk個であることを、我々はこれを取ることができるもの数Nが続く1,2、...、nは、最大数k選択番号kがnであるから、K [X、N]はxの最小セット、変更間隔の数、すなわち、 K + 1、 - X = Nに来て、その後、X + 1 = K - 2 n個の定理を用いて得ることができる
Xとして設定された最小値、最大値のセットと同様に、kは変更間隔の数[1 、x]は、定理2×用いて得ることができる- 1 + 1 = Kを、次にX = K来

後戻り順列によって実現4、

使用は主にどのようにバックトラックの組み合わせと配置の完全な配列のバックトラッキングへの移行を達成する方法を理解する必要性により、順列と組み合わせを達成するためにバックトラック。

ツリーA(3,3)のための全体配置で見てみましょうは、組み合わせとC(3,3)の中に配置されました
ここに画像を挿入説明

A(2,3)のための装置で次見て組み合わせとC(2,3)樹状図に配置された
ここに画像を挿入説明
いくつかの比較の分析、我々は見つけることができる:
配列A(K、N)について、nは図のツリーのツリーに。主枝の数、kは、図のツリーのツリーの高さです。そして、各分岐道路のために、現在および過去の高さ1,2の高さhの数が表示され、時間に表示される数字は...異なっています。

組み合わせ配列C(K、N)のために、N-K + 1は、ツリービュー内のツリーのメインブランチの数であり、kは、図のツリーのツリーの高さです。高さが現れ、現在の高さh 1と各分岐道路、番号だけでなく、ために前にと、時間に表示される数字は...彼らは大きくなければならないとは異なる、より良いです。

この考えに基づき、我々は次のアルゴリズムを設計することができます。

#include<iostream>
using namespace std;
int visit[10];//用于标记数组a 
int a[10]; //用于存储输入数据
int b[10];//用于存储排列数据 
void dfs(int p,int k,int n){
	if(k == 0){
		for(int i = 1;i < p;i++){
		cout << a[b[i]]<< " ";	
		}
		cout << endl;
		return;
	}
	for(int i = 0;i < n - k + 1; i++){	    
		if(visit[i] == 0){
			visit[i] = 1;
			if(i > b[p - 1]){
			b[p] = i;
			dfs(p + 1,k - 1,n); 
		    }
			visit[i] = 0; 
		}	
	}
}
int main(){
	int n;
	int k;
	cin >> n >> k;  
	for(int i = 0;i < n; i++){
		cin >> a[i];
	}
	b[0] = -1;
	dfs(1,k,n);
} 

本明細書で使用する場合、専用Bの添字、pおよび配列添字の現在位置のリアルタイムの場所に格納される整数変数の配列を計算するためのアレイは、目的は、現在のアクセスを達成することが決定されるように、メモリ・ストレージのアレイを利用することですデータは、それによってアルゴリズムを改善する、大きな関数に格納されたデータと比較されます。

n = 3の場合、K = 3、[3] = {1,2,3}、結果が得られます。

ここに画像を挿入説明
n = 3の場合、K = 2、[3] = {1,2,3}、結果が得られます。

ここに画像を挿入説明

公開された14元の記事 ウォン称賛11 ビュー3736

おすすめ

転載: blog.csdn.net/weixin_43715601/article/details/103966343