アルゴリズムのトピック
-
コレクション
-
組合
タイトル:コンピュータ10は、次のように番号:{} 1,2,3,4,5,6,7,8,9,10、接続を完了するためにコンピュータの中知られた後、
1和2,2和4,3和5,4和7,5和8,6和9,6和10 ;
図1および2、2、4、そのような接続は、また、1とみなされ、4が接続され、
2と7との間に求めて、5と9との間に接続されていますか?
チェックするC-チェック、
I-INPUT入力
思想:
-
-
これらコンピュータ10セットとして10、{1}、{2}、{3}、{4} ... {9}、{10}
-
誰と誰が接続され、その後、労働組合だった誰と誰です。
-
XおよびYは、クエリを設定した場合でX、Yを参照するかどうかに接続されています。
考えてみましょう:
- セットをどのように表現するか、検索や組合を助ける木のアイデアを検討
- どのように木はデータ型を使用していますか?リストや配列を構築?配列の長さは、所与の被験体は、配列の長さを拡張するために必要とされていない状態を見つける必要性を考慮すると、それは、参照配列とツリーによって表されます。非常に適し;
- アレー、カスタム・ノード・オブジェクト、データを含むオブジェクト(PC番号)、親(親ノードのインデックスは、-1ノードがルートノードであることを示します)
- その要求の主題を完了するために、アレイ内のノードオブジェクトの値を変更する、計算するステップと、特定のコード次のように
public class ComputerConnect {
private Node[] computers;
public ComputerConnect(int[] pcs) {
this.computers = new Node[pcs.length];
for (int i = 0; i < pcs.length; i++) {
computers[i]=new Node(pcs[i],-1);
}
}
class Node{
int data;
int parent;
public Node() {
}
public Node(int data, int parent) {
this.data = data;
this.parent = parent;
}
}
public int find(int pcNum){
int i;
// 寻找该computers数组内的data是否有该pc,若有则i为其index;
for (i = 0; i < computers.length && computers[i].data== pcNum; i++) ;
//若满足没有在数组中找到该pc的编号,则返回-1;
if (i>=computers.length) return -1;
//找到其根结点;
for (;computers[i].parent>=0;i=computers[i].parent);
//返回其根结点的索引
return i;
}
public void union(int pcNum1, int pcNum2){
int root1 = find(pcNum1);
int root2 = find(pcNum1);
if (root1!=root2) computers[root2].parent = root1;
}
}
最適化
戻りコード自体、上記の改善点を忘れてしまいました。
実行
労働組合(2,1)
労働組合(3,1)
労働組合(4,1)
労働組合の後(5,1)
の木は、ますます高くなって検索効率が低下します。
改善されたポイント:
木ができるように、労働組合は、遅すぎる発見につながる、高すぎるツリーをもたらすように続けることや木に、新しい問題の到来を告げるには、どのように木の大きさを区別するために?
子ノードが6つの-6サブノードの合計を表す示すよう-1親の値を変更します。
その後修正された方法は、労働組合であってもよく、
ランクマージすることで
この方法は、高さや大きさに応じて、ランクをマージすることによって呼び出され、合流
設計されたこの問題、デジタルコンピュータの番号タイプは、インデックスとして使用されると同時に、データは、インデックスタイプの点でノードドメイン、または復号化アルゴリズムの設計を必要としない簡略化プロセスを見つけることができ
for (i = 0; i < computers.length && computers[i].data== pcNum; i++) ;
循環量のこのセクション;
パス圧縮
コアアイデア:ノードを探している場合、ノードは、ツリー内の第二のレベルの位置に昇格、コード変更を見つけ、アイコン。
public int find(int pcNum){
int i;
for (i = 0; i < computers.length && computers[i].data== pcNum; i++) ;
if (i>=computers.length) return -1;
for (;computers[i].parent>=0;i=computers[i].parent);
computers[temp].perent = i;
return i;
}