public void GenerateEuclideanOurNeoKruskalMST(int bucket) { if (VertexList.Count == 0) { return; } DateTime start = DateTime.Now; NeoDisjointSet <Vertex> disjointSet = new NeoDisjointSet <Vertex>(VertexList); EdgeSolution.Clear(); C5.IPriorityQueue <Edge>[] heap2 = new C5.IntervalHeap <Edge> [bucket]; C5.IPriorityQueue <Edge> heap = new C5.IntervalHeap <Edge>(new EdgeComparer()); for (int i = 0; i < heap2.Length; i++) { heap2[i] = new C5.IntervalHeap <Edge>(new EdgeComparer()); } //this.VisitedVertex = VertexList.Count; for (int i = 0; i < VertexList.Count - 1; i++) { for (int j = i + 1; j < VertexList.Count; j++) { Edge e = new Edge(VertexList[i], VertexList[j]); heap.Add(e); } } double max = heap.FindMax().Length; double min = heap.FindMin().Length; while (heap.Count > 0) { Edge s = heap.DeleteMin(); heap2[(int)Math.Floor((((s.Length - min) / (max - min)) * (bucket - 1)))].Add(s); } for (int i = 0; i < bucket && disjointSet.Count > 0; i++) { while (heap2[i].Count > 0 && disjointSet.Count > 0) { Edge s = heap2[i].DeleteMin(); if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond)) { disjointSet.Union(s.VertexFirst, s.VertexSecond); EdgeSolution.Add(s); } } } Debug.WriteLine((DateTime.Now - start).TotalMilliseconds + " ms"); //this.VisitedVertex = VertexList.Count; }
public void GenerateOurNeoKruskalMST(int bucket, double max, double min) { if (VertexList.Count == 0) { return; } if (max == min) { GenerateKruskalMST(); return; } NeoDisjointSet <Vertex> disjointSet = new NeoDisjointSet <Vertex>(VertexList); ClearSolution(); C5.IPriorityQueue <Edge>[] bucketHeap = new C5.IntervalHeap <Edge> [bucket]; for (int i = 0; i < bucketHeap.Length; i++) { bucketHeap[i] = new C5.IntervalHeap <Edge>(new EdgeComparer()); } int factor = bucket - 1; double diff = max - min; foreach (Edge e in EdgeList) { bucketHeap[(int)Math.Floor((((e.Length - min) / (diff)) * (factor)))].Add(e); } for (int i = 0; i < bucket && disjointSet.Count > 0; i++) { while (bucketHeap[i].Count > 0 && disjointSet.Count > 0) { Edge s = bucketHeap[i].DeleteMin(); if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond)) { disjointSet.Union(s.VertexFirst, s.VertexSecond); EdgeSolution.Add(s); } } } }
public void GenerateOurNeoKruskalMST(int bucket, double max, double min) { if (VertexList.Count == 0) return; if (max == min) { GenerateKruskalMST(); return; } NeoDisjointSet<Vertex> disjointSet = new NeoDisjointSet<Vertex>(VertexList); ClearSolution(); C5.IPriorityQueue<Edge>[] bucketHeap = new C5.IntervalHeap<Edge>[bucket]; for (int i = 0; i < bucketHeap.Length; i++) { bucketHeap[i] = new C5.IntervalHeap<Edge>(new EdgeComparer()); } int factor = bucket - 1; double diff = max - min; foreach (Edge e in EdgeList) { bucketHeap[(int)Math.Floor((((e.Length - min) / (diff)) * (factor)))].Add(e); } for (int i = 0; i < bucket && disjointSet.Count > 0; i++) { while (bucketHeap[i].Count > 0 && disjointSet.Count > 0) { Edge s = bucketHeap[i].DeleteMin(); if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond)) { disjointSet.Union(s.VertexFirst, s.VertexSecond); EdgeSolution.Add(s); } } } }
public void GenerateEuclideanOurNeoKruskalMST(int bucket) { if (VertexList.Count == 0) return; DateTime start = DateTime.Now; NeoDisjointSet<Vertex> disjointSet = new NeoDisjointSet<Vertex>(VertexList); EdgeSolution.Clear(); C5.IPriorityQueue<Edge>[] heap2 = new C5.IntervalHeap<Edge>[bucket]; C5.IPriorityQueue<Edge> heap = new C5.IntervalHeap<Edge>(new EdgeComparer()); for (int i = 0; i < heap2.Length; i++) { heap2[i] = new C5.IntervalHeap<Edge>(new EdgeComparer()); } //this.VisitedVertex = VertexList.Count; for (int i = 0; i < VertexList.Count - 1; i++) for (int j = i + 1; j < VertexList.Count; j++) { Edge e = new Edge(VertexList[i], VertexList[j]); heap.Add(e); } double max = heap.FindMax().Length; double min = heap.FindMin().Length; while (heap.Count > 0) { Edge s = heap.DeleteMin(); heap2[(int)Math.Floor((((s.Length - min) / (max - min)) * (bucket - 1)))].Add(s); } for (int i = 0; i < bucket && disjointSet.Count > 0; i++) { while (heap2[i].Count > 0 && disjointSet.Count > 0) { Edge s = heap2[i].DeleteMin(); if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond)) { disjointSet.Union(s.VertexFirst, s.VertexSecond); EdgeSolution.Add(s); } } } Debug.WriteLine((DateTime.Now - start).TotalMilliseconds + " ms"); //this.VisitedVertex = VertexList.Count; }