diff --git a/naloga4/src/Graf.java b/naloga4/src/Graf.java index 8221065..c9ed8db 100644 --- a/naloga4/src/Graf.java +++ b/naloga4/src/Graf.java @@ -1,27 +1,37 @@ public class Graf { - private final Node[] nodes; + private final MaxHeap.HeapNode[] nodes; private final MaxHeap heap = new MaxHeap<>(); + @SuppressWarnings("unchecked") Graf(int n) { - this.nodes = new Node[n]; + this.nodes = new MaxHeap.HeapNode[n]; for (int i = 0; i < n; i++) { Node node = new Node(i); - nodes[i] = node; - heap.insert(node); + nodes[i] = heap.insert(node); } } void povezi(int u, int v) { - nodes[u].degree++; - nodes[v].degree++; - nodes[u].neighbors.add(nodes[v]); - nodes[v].neighbors.add(nodes[u]); -// heap.heapify(u); -// heap.heapify(v); - heap.rebuild(); + nodes[u].value.degree++; + nodes[u].value.neighbors.add(nodes[v]); + heap.siftUp(nodes[u].index); + + nodes[v].value.degree++; + nodes[v].value.neighbors.add(nodes[u]); + heap.siftUp(nodes[v].index); + } + + void grobaSila() { + } void pozresni() { + MaxHeap heap = new MaxHeap<>(this.heap); + for (var heapNode : nodes) { + var node = heapNode.value; + node.degree = node.neighbors.size(); + } + ArrList used = new ArrList<>(); while (!heap.isEmpty()) { @@ -30,12 +40,13 @@ public class Graf { break; } - LinkedList.Node neighbor = node.neighbors.root; - do { - neighbor.value.degree--; - heap.heapify(neighbor.value.id); - neighbor = neighbor.next; - } while (neighbor != null); + for (int i = 0; i < node.neighbors.size(); i++) { + var neighbor = node.neighbors.get(i); + if (neighbor.value.degree > 0) { + neighbor.value.degree--; + heap.siftDown(neighbor.index); + } + } used.add(node.id); } @@ -56,7 +67,8 @@ public class Graf { class Node implements Comparable { int id; int degree = 0; - LinkedList neighbors = new LinkedList<>(); + // LinkedList.HeapNode> neighbors = new LinkedList<>(); + ArrList.HeapNode> neighbors = new ArrList<>(); Node(int id) { this.id = id; @@ -78,7 +90,27 @@ class Node implements Comparable { } class MaxHeap> { - final private ArrList arr; + class HeapNode implements Comparable { + int index; + T value; + + HeapNode(T value, int index) { + this.value = value; + this.index = index; + } + + @Override + public int compareTo(HeapNode o) { + return this.value.compareTo(o.value); + } + + @Override + public String toString() { + return this.value.toString(); + } + } + + final private ArrList arr; public MaxHeap() { arr = new ArrList<>(); @@ -101,12 +133,15 @@ class MaxHeap> { } private void swap(int i, int j) { - T tmp = arr.get(i); - arr.set(i, arr.get(j)); - arr.set(j, tmp); + HeapNode nodeI = arr.get(i); + HeapNode nodeJ = arr.get(j); + nodeI.index = j; + nodeJ.index = i; + arr.set(i, nodeJ); + arr.set(j, nodeI); } - public void heapify(int i) { + public void siftDown(int i) { int largest = i; int left = leftChild(i); int right = rightChild(i); @@ -121,17 +156,30 @@ class MaxHeap> { if (largest != i) { swap(i, largest); - heapify(largest); + siftDown(largest); } } - public void insert(T x) { - arr.add(x); + public void siftUp(int i) { + int parent = parent(i); + + if (parent < 0) return; + + if (arr.get(i).compareTo(arr.get(parent)) > 0) { + swap(i, parent); + siftUp(parent); + } + } + + public HeapNode insert(T x) { + HeapNode node = new HeapNode(x, arr.size()); + arr.add(node); int currentIndex = arr.size() - 1; while (currentIndex > 0 && arr.get(currentIndex).compareTo(arr.get(parent(currentIndex))) > 0) { swap(currentIndex, parent(currentIndex)); currentIndex = parent(currentIndex); } + return node; } public boolean isEmpty() { @@ -140,7 +188,7 @@ class MaxHeap> { public void rebuild() { for (int i = parent(arr.size() - 1); i >= 0; i--) { - heapify(i); + siftDown(i); } } @@ -149,38 +197,16 @@ class MaxHeap> { throw new RuntimeException("Heap is empty"); } - T max = arr.get(0); - T lastElement = arr.removeLast(); + HeapNode max = arr.get(0); + HeapNode lastElement = arr.removeLast(); if (!arr.isEmpty()) { arr.set(0, lastElement); - - int currentIndex = 0; - while (true) { - int left = leftChild(currentIndex); - int right = rightChild(currentIndex); - - int largest = currentIndex; - - if (left < arr.size() && arr.get(left).compareTo(arr.get(largest)) > 0) { - largest = left; - } - - if (right < arr.size() && arr.get(right).compareTo(arr.get(largest)) > 0) { - largest = right; - } - - if (largest == currentIndex) { - break; - } - - swap(currentIndex, largest); - - currentIndex = largest; - } + lastElement.index = 0; + siftDown(0); } - return max; + return max.value; } @Override @@ -193,25 +219,6 @@ class MaxHeap> { } } -class LinkedList { - class Node { - T value; - Node next; - - Node(T value) { - this.value = value; - } - } - - Node root; - - public void add(T value) { - Node node = new Node(value); - node.next = root; - root = node; - } -} - class ArrList { private T[] array; private int size; diff --git a/naloga4/src/Naloga4.java b/naloga4/src/Naloga4.java index bfdf952..7d15923 100644 --- a/naloga4/src/Naloga4.java +++ b/naloga4/src/Naloga4.java @@ -2,13 +2,18 @@ import java.util.*; public class Naloga4 { public static void main(String[] args) { - System.gc(); - Graf g = GrafGenerator.generateBarabasiAlbertGraph(40_000, 10); - System.gc(); - long startTime = System.currentTimeMillis(); + Graf g = new Graf(8); + int[][] povezave = new int[][]{ + {1, 2}, {2, 3}, {3, 4}, {4, 5}, + {5, 6}, {6, 7}, {7, 1}, {0, 1}, + {0, 2}, {0, 3}, {0, 4}, {0, 5}, + {0, 6}, {0, 7}, {0, 7}, {0, 7} + }; + for (int[] povezava : povezave) { + g.povezi(povezava[0], povezava[1]); + } + g.pozresni(); g.pozresni(); - long endTime = System.currentTimeMillis(); - System.out.println(endTime - startTime); } }