diff --git a/students/23K0120/23K0120-p31/pom.xml b/students/23K0120/23K0120-p31/pom.xml new file mode 100644 index 000000000..d8f94be48 --- /dev/null +++ b/students/23K0120/23K0120-p31/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0120 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0120-p31 + 2-3 Tree + diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/Main.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/Main.java new file mode 100644 index 000000000..27f23e55a --- /dev/null +++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0120; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Тридцать первая практическая работа!"); + } +} diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Main.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Main.java new file mode 100644 index 000000000..d7f093713 --- /dev/null +++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Main.java @@ -0,0 +1,26 @@ +package ru.mirea.practice.s23k0120.task1; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.Scanner; + +public abstract class Main { + public static void main(String[] args) throws FileNotFoundException { + TwoThreeTree processorTree = new TwoThreeTree(); + try (Scanner scanner = new Scanner(new File("students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/PROCS.txt"))) { + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + String[] splitLine = line.split(", "); + Processor processor = new Processor(Integer.parseInt(splitLine[0]), + splitLine[1], + Double.parseDouble(splitLine[2]), + Integer.parseInt(splitLine[3]), + Double.parseDouble(splitLine[4]), + Integer.parseInt(splitLine[5]), + Integer.parseInt(splitLine[6])); + processorTree.insert(processor); + } + } + System.out.println(processorTree); + } +} diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/PROCS.txt b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/PROCS.txt new file mode 100644 index 000000000..436134baa --- /dev/null +++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/PROCS.txt @@ -0,0 +1,4 @@ +2, Intel Pentium 4, 2.0, 256, 0.400, 664, 734 +5, Intel Itanium, 0.800, 96, 0.266, 365, 701 +6, AMD Athlon XP, 1.6, 256, 0.266, 701, 634 +1, IBM Power 4, 1.3, 16384, 0.400, 814, 1169 diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Processor.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Processor.java new file mode 100644 index 000000000..a33a4b6cf --- /dev/null +++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Processor.java @@ -0,0 +1,59 @@ +package ru.mirea.practice.s23k0120.task1; + +public class Processor implements Comparable { + private final int key; + private final String name; + private final double tickFrequency; + private final int cacheSize; + private final double systemBusFrequency; + private final int specInt; + private final int specFp; + + public Processor(int key, String name, double tickFrequency, int cacheSize, double systemBusFrequency, int specInt, int specFp) { + this.key = key; + this.name = name; + this.tickFrequency = tickFrequency; + this.cacheSize = cacheSize; + this.systemBusFrequency = systemBusFrequency; + this.specInt = specInt; + this.specFp = specFp; + } + + public int getKey() { + return key; + } + + public String getName() { + return name; + } + + public double getTickFrequency() { + return tickFrequency; + } + + public int getCacheSize() { + return cacheSize; + } + + public double getSystemBusFrequency() { + return systemBusFrequency; + } + + public int getSpecInt() { + return specInt; + } + + public int getSpecFp() { + return specFp; + } + + @Override + public int compareTo(Processor o) { + return Integer.compare(this.key, o.key); + } + + @Override + public String toString() { + return String.valueOf(key); + } +} diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTree.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTree.java new file mode 100644 index 000000000..aaa0e973d --- /dev/null +++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTree.java @@ -0,0 +1,52 @@ +package ru.mirea.practice.s23k0120.task1; + +public class TwoThreeTree> { + // Minimum degree + private final int t; + // Pointer to root node + private TwoThreeTreeNode root; + + public TwoThreeTree() { + this.t = 2; + root = null; + } + + public TwoThreeTreeNode search(E data) { + return (root == null) ? null : root.search(data); + } + + // Function to insert a key into the B-tree + public void insert(E data) { + if (root == null) { + root = new TwoThreeTreeNode(true); + root.dataArr.set(0, data); + root.numOfKeys = 1; + } else { + if (root.numOfKeys == 2 * t - 1) { + TwoThreeTreeNode newRoot = new TwoThreeTreeNode(false); + newRoot.children.set(0, root); + newRoot.splitChild(0, root); + + int i = 0; + + if (data.compareTo(newRoot.dataArr.get(0)) > 0) { + i++; + } + + newRoot.children.get(i).insertNonFull(data); + root = newRoot; + } else { + root.insertNonFull(data); + } + } + } + + // Function to print the entire B-tree + public void printBTree() { + if (root != null) { + root.printInOrder(); + } + + System.out.println(); + } +} diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTreeNode.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTreeNode.java new file mode 100644 index 000000000..bd3b83fe5 --- /dev/null +++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTreeNode.java @@ -0,0 +1,115 @@ +package ru.mirea.practice.s23k0120.task1; + +import java.util.ArrayList; +import java.util.List; + +public class TwoThreeTreeNode> { + List dataArr; + int t; + List> children; + int numOfKeys; + boolean isLeaf; + + public TwoThreeTreeNode(boolean isLeaf) { + this.t = 2; + this.isLeaf = isLeaf; + + dataArr = new ArrayList<>(); + for (int i = 0; i < 2 * t - 1; i++) { + dataArr.add(null); + } + + children = new ArrayList<>(); + for (int i = 0; i < 2 * t; i++) { + children.add(null); + } + numOfKeys = 0; + } + + public TwoThreeTreeNode search(E data) { + int i = 0; + + while (i < numOfKeys && data.compareTo(dataArr.get(i)) > 0) { + i++; + } + + if (data.compareTo(dataArr.get(i)) == 0) { + return this; + } + + if (isLeaf) { + return null; + } + + return children.get(i).search(data); + } + + public void insertNonFull(E data) { + int i = numOfKeys - 1; + + if (isLeaf) { + while (i >= 0 && data.compareTo(dataArr.get(i)) < 0) { + dataArr.set(i + 1, dataArr.get(i)); + i--; + } + dataArr.set(i + 1, data); + numOfKeys++; + } else { + while (i >= 0 && data.compareTo(dataArr.get(i)) < 0) { + i--; + } + i++; + + if (children.get(i).numOfKeys == 2 * t - 1) { + splitChild(i, children.get(i)); + if (data.compareTo(dataArr.get(i)) > 0) { + i++; + } + } + children.get(i).insertNonFull(data); + } + } + + public void splitChild(int ind, TwoThreeTreeNode y) { + TwoThreeTreeNode z = new TwoThreeTreeNode(y.isLeaf); + z.numOfKeys = t - 1; + + for (int i = 0; i < t - 1; i++) { + z.dataArr.set(i, y.dataArr.get(i + t)); + } + + if (!y.isLeaf) { + for (int i = 0; i < t; i++) { + z.children.set(i, y.children.get(i + t)); + } + } + + y.numOfKeys = t - 1; + + for (int i = numOfKeys; i >= ind + 1; i--) { + children.set(i + 1, children.get(i)); + } + + children.set(ind + 1, z); + + for (int i = numOfKeys - 1; i >= ind; i--) { + dataArr.set(i + 1, dataArr.get(i)); + } + + dataArr.set(ind, y.dataArr.get(t - 1)); + numOfKeys++; + } + + public void printInOrder() { + int i; + for (i = 0; i < numOfKeys; i++) { + if (!isLeaf) { + children.get(i).printInOrder(); + } + System.out.print(dataArr.get(i) + " "); + } + if (!isLeaf) { + children.get(i).printInOrder(); + } + } +} diff --git a/students/23K0120/pom.xml b/students/23K0120/pom.xml index b006b0764..a1fb23657 100644 --- a/students/23K0120/pom.xml +++ b/students/23K0120/pom.xml @@ -45,6 +45,7 @@ 23K0120-p29 23K0120-p30 23K0120-p30-2 + 23K0120-p31 23K0120-p32