Naloga 4 - greedy works
This commit is contained in:
		
							parent
							
								
									2f8a820619
								
							
						
					
					
						commit
						8e8e0d3598
					
				@ -1,27 +1,37 @@
 | 
			
		||||
public class Graf {
 | 
			
		||||
    private final Node[] nodes;
 | 
			
		||||
    private final MaxHeap<Node>.HeapNode[] nodes;
 | 
			
		||||
    private final MaxHeap<Node> 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<Node> heap = new MaxHeap<>(this.heap);
 | 
			
		||||
        for (var heapNode : nodes) {
 | 
			
		||||
            var node = heapNode.value;
 | 
			
		||||
            node.degree = node.neighbors.size();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ArrList<Integer> used = new ArrList<>();
 | 
			
		||||
 | 
			
		||||
        while (!heap.isEmpty()) {
 | 
			
		||||
@ -30,12 +40,13 @@ public class Graf {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            LinkedList<Node>.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<Node> {
 | 
			
		||||
    int id;
 | 
			
		||||
    int degree = 0;
 | 
			
		||||
    LinkedList<Node> neighbors = new LinkedList<>();
 | 
			
		||||
    //    LinkedList<MaxHeap<Node>.HeapNode> neighbors = new LinkedList<>();
 | 
			
		||||
    ArrList<MaxHeap<Node>.HeapNode> neighbors = new ArrList<>();
 | 
			
		||||
 | 
			
		||||
    Node(int id) {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
@ -78,7 +90,27 @@ class Node implements Comparable<Node> {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class MaxHeap<T extends Comparable<T>> {
 | 
			
		||||
    final private ArrList<T> arr;
 | 
			
		||||
    class HeapNode implements Comparable<HeapNode> {
 | 
			
		||||
        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<HeapNode> arr;
 | 
			
		||||
 | 
			
		||||
    public MaxHeap() {
 | 
			
		||||
        arr = new ArrList<>();
 | 
			
		||||
@ -101,12 +133,15 @@ class MaxHeap<T extends Comparable<T>> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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<T extends Comparable<T>> {
 | 
			
		||||
 | 
			
		||||
        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<T extends Comparable<T>> {
 | 
			
		||||
 | 
			
		||||
    public void rebuild() {
 | 
			
		||||
        for (int i = parent(arr.size() - 1); i >= 0; i--) {
 | 
			
		||||
            heapify(i);
 | 
			
		||||
            siftDown(i);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -149,38 +197,16 @@ class MaxHeap<T extends Comparable<T>> {
 | 
			
		||||
            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<T extends Comparable<T>> {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class LinkedList<T> {
 | 
			
		||||
    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<T> {
 | 
			
		||||
    private T[] array;
 | 
			
		||||
    private int size;
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user