每天刷個演算法題20160522:支援各種型別的並查集
版權所有。所有權利保留。
歡迎轉載,轉載時請註明出處:
http://blog.csdn.net/xiaofei_it/article/details/51524671
為了防止思維僵化,每天刷個演算法題。已經刷了幾天了,現在發點程式碼。
我已經建了一個開源專案,每天的題目都在裡面:
https://github.com/Xiaofei-it/Algorithms
絕大部分演算法都是我自己寫的,沒有參考網上通用程式碼。讀者可能會覺得有的程式碼晦澀難懂,因為那是我自己的理解。
最近幾天都是在寫一些原來的東西,大多數是非遞迴。以後準備刷點DP、貪心之類的題。
下面是支援任意型別的並查集:
/**
*
* Copyright 2016 Xiaofei
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package xiaofei.algorithm;
import java.util.HashMap;
/**
* Created by Xiaofei on 16/5/22.
*/
public class DisjointSet<T> {
private HashMap<T, Node<T>> map = new HashMap<>();
public DisjointSet() {
}
public void makeSet(T data) {
if (map.containsKey(data)) {
return;
}
map.put(data, new Node<T>(data));
}
private Node<T> findInternal(Node<T> node) {
if (node.parent != node) {
node.parent = findInternal(node.parent);
}
return node.parent;
}
public T find(T data) {
Node<T> node = map.get(data);
if (node == null) {
return null;
}
return findInternal(node).data;
}
public void union(T data1, T data2) {
Node<T> node1 = map.get(data1), node2 = map.get(data2);
if (node1 == null || node2 == null) {
return;
}
node1 = findInternal(node1);
node2 = findInternal(node2);
if (node1.rank < node2.rank) {
node1.parent = node2;
} else if (node1.rank > node2.rank) {
node2.parent = node1;
} else {
node1.parent = node2;
++node2.rank;
}
}
private static class Node<T> {
T data;
Node<T> parent;
//rank is not depth!!!
int rank;
Node(T data) {
this.data = data;
this.parent = this;
this.rank = 0;
}
}
}
相關文章
- 各種並查集並查集
- 並查集(一)並查集的幾種實現並查集
- UIModalPresentationStyle 各種型別的區別UI型別
- 並查集(二)並查集的演算法應用案例上並查集演算法
- 並查集演算法並查集演算法
- 各種字符集的區別
- 【轉】種類並查集並查集
- 各種失敗型別型別
- 設計一個介面支援各種查詢條件
- 面試常考演算法題之並查集問題面試演算法並查集
- 【並查集】一種與時間賽跑的巧妙演算法並查集演算法
- 各種型別檔案頭型別
- 【演算法】並查集的運用演算法並查集
- 胃炎的各種型別 - 肝氣犯胃型...型別
- 各種體虛型別的改善方式型別
- 簡單易懂的並查集演算法以及並查集實戰演練並查集演算法
- 並查集題目合集並查集
- 每天刷個演算法題20160519:回溯法解八皇后演算法
- 演算法型別大總結(並附經典題型)演算法型別
- POJ2492(種類並查集)並查集
- 序列並查集的線性演算法並查集演算法
- javascript 判斷各種資料的型別JavaScript型別
- 各種索引型別發生的條件索引型別
- 【並查集】【帶偏移的並查集】食物鏈並查集
- 每天刷個演算法題20160520:二叉排序樹演算法排序
- 關於並查集問題並查集
- [譯] Swift 演算法學院 - 並查集Swift演算法並查集
- 並查集到帶權並查集並查集
- 並查集的概念與演算法實現並查集演算法
- CBO各種型別成本計算公式型別公式
- [演算法]各種二分查詢演算法
- 各種型別的API介面,應有盡有型別API
- 模擬oracle裡的各種型別的壞塊Oracle型別
- 專題五 並查集【Kuangbin】並查集
- [演算法學習筆記] 並查集演算法筆記並查集
- Lyn Mac特別版 支援各種主流影像格式Mac
- 並查集的使用並查集
- golang — mgo解析各種資料型別分析Golang資料型別