Naloga 4 WIP
This commit is contained in:
		
							parent
							
								
									97c67bea67
								
							
						
					
					
						commit
						2f8a820619
					
				
							
								
								
									
										29
									
								
								naloga4/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								naloga4/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
### IntelliJ IDEA ###
 | 
			
		||||
out/
 | 
			
		||||
!**/src/main/**/out/
 | 
			
		||||
!**/src/test/**/out/
 | 
			
		||||
 | 
			
		||||
### Eclipse ###
 | 
			
		||||
.apt_generated
 | 
			
		||||
.classpath
 | 
			
		||||
.factorypath
 | 
			
		||||
.project
 | 
			
		||||
.settings
 | 
			
		||||
.springBeans
 | 
			
		||||
.sts4-cache
 | 
			
		||||
bin/
 | 
			
		||||
!**/src/main/**/bin/
 | 
			
		||||
!**/src/test/**/bin/
 | 
			
		||||
 | 
			
		||||
### NetBeans ###
 | 
			
		||||
/nbproject/private/
 | 
			
		||||
/nbbuild/
 | 
			
		||||
/dist/
 | 
			
		||||
/nbdist/
 | 
			
		||||
/.nb-gradle/
 | 
			
		||||
 | 
			
		||||
### VS Code ###
 | 
			
		||||
.vscode/
 | 
			
		||||
 | 
			
		||||
### Mac OS ###
 | 
			
		||||
.DS_Store
 | 
			
		||||
							
								
								
									
										10
									
								
								naloga4/.idea/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								naloga4/.idea/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
# Default ignored files
 | 
			
		||||
/shelf/
 | 
			
		||||
/workspace.xml
 | 
			
		||||
# Editor-based HTTP Client requests
 | 
			
		||||
/httpRequests/
 | 
			
		||||
# Environment-dependent path to Maven home directory
 | 
			
		||||
/mavenHomeManager.xml
 | 
			
		||||
# Datasource local storage ignored files
 | 
			
		||||
/dataSources/
 | 
			
		||||
/dataSources.local.xml
 | 
			
		||||
							
								
								
									
										7
									
								
								naloga4/.idea/dictionaries/project.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								naloga4/.idea/dictionaries/project.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
<component name="ProjectDictionaryState">
 | 
			
		||||
  <dictionary name="project">
 | 
			
		||||
    <words>
 | 
			
		||||
      <w>graf</w>
 | 
			
		||||
    </words>
 | 
			
		||||
  </dictionary>
 | 
			
		||||
</component>
 | 
			
		||||
							
								
								
									
										19
									
								
								naloga4/.idea/inspectionProfiles/Project_Default.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								naloga4/.idea/inspectionProfiles/Project_Default.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
<component name="InspectionProjectProfileManager">
 | 
			
		||||
  <profile version="1.0">
 | 
			
		||||
    <option name="myName" value="Project Default" />
 | 
			
		||||
    <inspection_tool class="PyPep8Inspection" enabled="true" level="INFORMATION" enabled_by_default="true">
 | 
			
		||||
      <option name="ignoredErrors">
 | 
			
		||||
        <list>
 | 
			
		||||
          <option value="W292" />
 | 
			
		||||
        </list>
 | 
			
		||||
      </option>
 | 
			
		||||
    </inspection_tool>
 | 
			
		||||
    <inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
 | 
			
		||||
      <option name="ignoredIdentifiers">
 | 
			
		||||
        <list>
 | 
			
		||||
          <option value="tests.smoke.test_absences_sliding.TestAbsencesSliding.*" />
 | 
			
		||||
        </list>
 | 
			
		||||
      </option>
 | 
			
		||||
    </inspection_tool>
 | 
			
		||||
  </profile>
 | 
			
		||||
</component>
 | 
			
		||||
							
								
								
									
										6
									
								
								naloga4/.idea/misc.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								naloga4/.idea/misc.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project version="4">
 | 
			
		||||
  <component name="ProjectRootManager" version="2" languageLevel="JDK_24" default="true" project-jdk-name="homebrew-23" project-jdk-type="JavaSDK">
 | 
			
		||||
    <output url="file://$PROJECT_DIR$/out" />
 | 
			
		||||
  </component>
 | 
			
		||||
</project>
 | 
			
		||||
							
								
								
									
										8
									
								
								naloga4/.idea/modules.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								naloga4/.idea/modules.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project version="4">
 | 
			
		||||
  <component name="ProjectModuleManager">
 | 
			
		||||
    <modules>
 | 
			
		||||
      <module fileurl="file://$PROJECT_DIR$/naloga4.iml" filepath="$PROJECT_DIR$/naloga4.iml" />
 | 
			
		||||
    </modules>
 | 
			
		||||
  </component>
 | 
			
		||||
</project>
 | 
			
		||||
							
								
								
									
										6
									
								
								naloga4/.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								naloga4/.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project version="4">
 | 
			
		||||
  <component name="VcsDirectoryMappings">
 | 
			
		||||
    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
 | 
			
		||||
  </component>
 | 
			
		||||
</project>
 | 
			
		||||
							
								
								
									
										11
									
								
								naloga4/naloga4.iml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								naloga4/naloga4.iml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<module type="JAVA_MODULE" version="4">
 | 
			
		||||
  <component name="NewModuleRootManager" inherit-compiler-output="true">
 | 
			
		||||
    <exclude-output />
 | 
			
		||||
    <content url="file://$MODULE_DIR$">
 | 
			
		||||
      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
 | 
			
		||||
    </content>
 | 
			
		||||
    <orderEntry type="inheritedJdk" />
 | 
			
		||||
    <orderEntry type="sourceFolder" forTests="false" />
 | 
			
		||||
  </component>
 | 
			
		||||
</module>
 | 
			
		||||
							
								
								
									
										280
									
								
								naloga4/src/Graf.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										280
									
								
								naloga4/src/Graf.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,280 @@
 | 
			
		||||
public class Graf {
 | 
			
		||||
    private final Node[] nodes;
 | 
			
		||||
    private final MaxHeap<Node> heap = new MaxHeap<>();
 | 
			
		||||
 | 
			
		||||
    Graf(int n) {
 | 
			
		||||
        this.nodes = new Node[n];
 | 
			
		||||
        for (int i = 0; i < n; i++) {
 | 
			
		||||
            Node node = new Node(i);
 | 
			
		||||
            nodes[i] = node;
 | 
			
		||||
            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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void pozresni() {
 | 
			
		||||
        ArrList<Integer> used = new ArrList<>();
 | 
			
		||||
 | 
			
		||||
        while (!heap.isEmpty()) {
 | 
			
		||||
            Node node = heap.pop();
 | 
			
		||||
            if (node.degree == 0) {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            LinkedList<Node>.Node neighbor = node.neighbors.root;
 | 
			
		||||
            do {
 | 
			
		||||
                neighbor.value.degree--;
 | 
			
		||||
                heap.heapify(neighbor.value.id);
 | 
			
		||||
                neighbor = neighbor.next;
 | 
			
		||||
            } while (neighbor != null);
 | 
			
		||||
 | 
			
		||||
            used.add(node.id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        print(used);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void print(ArrList<Integer> arr) {
 | 
			
		||||
        int idxStart = arr.size() > 100 ? arr.size() - 100 : 0;
 | 
			
		||||
        for (int i = idxStart; i < arr.size(); i++) {
 | 
			
		||||
            System.out.print(arr.get(i));
 | 
			
		||||
            if (i < arr.size() - 1) System.out.print(" ");
 | 
			
		||||
        }
 | 
			
		||||
        System.out.println();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Node implements Comparable<Node> {
 | 
			
		||||
    int id;
 | 
			
		||||
    int degree = 0;
 | 
			
		||||
    LinkedList<Node> neighbors = new LinkedList<>();
 | 
			
		||||
 | 
			
		||||
    Node(int id) {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int compareTo(Node other) {
 | 
			
		||||
        int deg = Integer.compare(this.degree, other.degree);
 | 
			
		||||
        if (deg == 0) {
 | 
			
		||||
            return Integer.compare(other.id, this.id);
 | 
			
		||||
        }
 | 
			
		||||
        return deg;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return "Node [id=" + id + ", degree=" + degree + "]";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class MaxHeap<T extends Comparable<T>> {
 | 
			
		||||
    final private ArrList<T> arr;
 | 
			
		||||
 | 
			
		||||
    public MaxHeap() {
 | 
			
		||||
        arr = new ArrList<>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public MaxHeap(MaxHeap<T> heap) {
 | 
			
		||||
        this.arr = new ArrList<>(heap.arr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int parent(int i) {
 | 
			
		||||
        return (i - 1) / 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int leftChild(int i) {
 | 
			
		||||
        return 2 * i + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int rightChild(int i) {
 | 
			
		||||
        return 2 * i + 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void swap(int i, int j) {
 | 
			
		||||
        T tmp = arr.get(i);
 | 
			
		||||
        arr.set(i, arr.get(j));
 | 
			
		||||
        arr.set(j, tmp);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void heapify(int i) {
 | 
			
		||||
        int largest = i;
 | 
			
		||||
        int left = leftChild(i);
 | 
			
		||||
        int right = rightChild(i);
 | 
			
		||||
 | 
			
		||||
        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 != i) {
 | 
			
		||||
            swap(i, largest);
 | 
			
		||||
            heapify(largest);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void insert(T x) {
 | 
			
		||||
        arr.add(x);
 | 
			
		||||
        int currentIndex = arr.size() - 1;
 | 
			
		||||
        while (currentIndex > 0 && arr.get(currentIndex).compareTo(arr.get(parent(currentIndex))) > 0) {
 | 
			
		||||
            swap(currentIndex, parent(currentIndex));
 | 
			
		||||
            currentIndex = parent(currentIndex);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isEmpty() {
 | 
			
		||||
        return arr.isEmpty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void rebuild() {
 | 
			
		||||
        for (int i = parent(arr.size() - 1); i >= 0; i--) {
 | 
			
		||||
            heapify(i);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public T pop() {
 | 
			
		||||
        if (arr.isEmpty()) {
 | 
			
		||||
            throw new RuntimeException("Heap is empty");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        T max = arr.get(0);
 | 
			
		||||
        T 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;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return max;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        StringBuilder sb = new StringBuilder();
 | 
			
		||||
        for (int i = 0; i < arr.size(); i++) {
 | 
			
		||||
            sb.append(arr.get(i)).append(" ");
 | 
			
		||||
        }
 | 
			
		||||
        return sb.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public ArrList() {
 | 
			
		||||
        array = (T[]) new Object[64];
 | 
			
		||||
        size = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public ArrList(ArrList<T> list) {
 | 
			
		||||
        this.size = list.size;
 | 
			
		||||
        this.array = (T[]) new Object[list.array.length];
 | 
			
		||||
        System.arraycopy(list.array, 0, this.array, 0, list.size);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean isFull() {
 | 
			
		||||
        return size == array.length;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void resize() {
 | 
			
		||||
        @SuppressWarnings("unchecked")
 | 
			
		||||
        T[] tmp = (T[]) new Object[array.length * 2];
 | 
			
		||||
        System.arraycopy(array, 0, tmp, 0, size);
 | 
			
		||||
        array = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public T get(int i) {
 | 
			
		||||
        return array[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void add(T t) {
 | 
			
		||||
        if (isFull()) {
 | 
			
		||||
            resize();
 | 
			
		||||
        }
 | 
			
		||||
        array[size++] = t;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void set(int i, T t) {
 | 
			
		||||
        array[i] = t;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public T removeLast() {
 | 
			
		||||
        T tmp = array[--size];
 | 
			
		||||
        array[size] = null;
 | 
			
		||||
        return tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int size() {
 | 
			
		||||
        return size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isEmpty() {
 | 
			
		||||
        return size == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        StringBuilder sb = new StringBuilder();
 | 
			
		||||
        for (int i = 0; i < size; i++) {
 | 
			
		||||
            sb.append(array[i]).append(" ");
 | 
			
		||||
        }
 | 
			
		||||
        return sb.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								naloga4/src/Naloga4.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								naloga4/src/Naloga4.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
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();
 | 
			
		||||
        g.pozresni();
 | 
			
		||||
        long endTime = System.currentTimeMillis();
 | 
			
		||||
        System.out.println(endTime - startTime);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class GrafGenerator {
 | 
			
		||||
    public static Graf generateBarabasiAlbertGraph(int n, int m) {
 | 
			
		||||
        if (m < 1 || m >= n) {
 | 
			
		||||
            throw new IllegalArgumentException("Neveljaven 'm'");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Graf graph = new Graf(n);
 | 
			
		||||
        List<Integer> nodePool = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        // Zacnem z polnim grafom velikosti m
 | 
			
		||||
        for (int i = 0; i < m; i++) {
 | 
			
		||||
            for (int j = i + 1; j < m; j++) {
 | 
			
		||||
                graph.povezi(i, j);
 | 
			
		||||
                nodePool.add(i);
 | 
			
		||||
                nodePool.add(j);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Random rand = new Random(5);
 | 
			
		||||
 | 
			
		||||
        // Povezi preostala vozlisca
 | 
			
		||||
        for (int newNode = m; newNode < n; newNode++) {
 | 
			
		||||
            Set<Integer> targets = new HashSet<>();
 | 
			
		||||
 | 
			
		||||
            while (targets.size() < m) {
 | 
			
		||||
                int selected = nodePool.get(rand.nextInt(nodePool.size()));
 | 
			
		||||
                targets.add(selected);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (int target : targets) {
 | 
			
		||||
                graph.povezi(newNode, target);
 | 
			
		||||
                nodePool.add(newNode);
 | 
			
		||||
                nodePool.add(target);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return graph;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user