diff --git a/students/23K0364/23K0364-p31/pom.xml b/students/23K0364/23K0364-p31/pom.xml new file mode 100644 index 000000000..83496a046 --- /dev/null +++ b/students/23K0364/23K0364-p31/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0364 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0364-p31 + 31 задание + diff --git a/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/FileManager.java b/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/FileManager.java new file mode 100644 index 000000000..194a3d8fe --- /dev/null +++ b/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/FileManager.java @@ -0,0 +1,43 @@ +package ru.mirea.practice.s0000001; + +import java.io.IOException; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.util.List; +import java.io.File; + +final class FileManager { + private FileManager() { + throw new UnsupportedOperationException("Utility class"); + } + + public static void loadFromFile(String filename, TwoThreeTree tree) throws IOException { + File file = new File(filename); + if (!file.exists()) { + throw new IOException("Файл не найден: " + filename); + } + + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + String line; + while ((line = reader.readLine()) != null) { + String[] data = line.split(", "); + Processor processor = new Processor(Integer.parseInt(data[0]), data[1], Double.parseDouble(data[2]), + Integer.parseInt(data[3]), Double.parseDouble(data[4]), + Integer.parseInt(data[5]), Integer.parseInt(data[6])); + tree.insert(processor); + } + } + } + + public static void saveToFile(String filename, TwoThreeTree tree) throws IOException { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { + List processors = tree.toList(); + for (Processor processor : processors) { + writer.write(processor.toString()); + writer.newLine(); + } + } + } +} diff --git a/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/Main.java b/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/Main.java new file mode 100644 index 000000000..386e407b2 --- /dev/null +++ b/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/Main.java @@ -0,0 +1,60 @@ +package ru.mirea.practice.s0000001; + +import java.io.IOException; +import java.util.Scanner; + +public abstract class Main { + private static TwoThreeTree tree = new TwoThreeTree(); + + public static void main(String[] args) { + try (Scanner scanner = new Scanner(System.in)) { + try { + FileManager.loadFromFile("/Users/viktoriapermakova/Desktop/PROCS.TXT", tree); + System.out.println("Данные загружены."); + } catch (IOException e) { + System.err.println("Ошибка загрузки данных: " + e.getMessage()); + } + + while (true) { + System.out.print("Введите команду (L, D n, A n, S, E): "); + String command = scanner.nextLine(); + + if ("L".equalsIgnoreCase(command)) { + tree.printTree(); + } else if (command.startsWith("D")) { + try { + int key = Integer.parseInt(command.split(" ")[1]); + tree.delete(key); + System.out.println("Запись с ключом " + key + " удалена."); + } catch (Exception e) { + System.err.println("Ошибка удаления: " + e.getMessage()); + } + } else if (command.startsWith("A")) { + try { + int key = Integer.parseInt(command.split(" ")[1]); + System.out.print("Введите данные процессора (название, тактовая частота, кеш, частота шины, SPECint, SPECfp): "); + String[] data = scanner.nextLine().split(", "); + Processor processor = new Processor(key, data[0], Double.parseDouble(data[1]), Integer.parseInt(data[2]), + Double.parseDouble(data[3]), Integer.parseInt(data[4]), Integer.parseInt(data[5])); + tree.insert(processor); + System.out.println("Запись добавлена: " + processor); + } catch (Exception e) { + System.err.println("Ошибка добавления: " + e.getMessage()); + } + } else if ("S".equalsIgnoreCase(command)) { + try { + FileManager.saveToFile("/Users/viktoriapermakova/Desktop/PROCS.TXT", tree); + System.out.println("Данные сохранены в файл."); + } catch (IOException e) { + System.err.println("Ошибка сохранения данных: " + e.getMessage()); + } + } else if ("E".equalsIgnoreCase(command)) { + break; + } else { + System.out.println("Неизвестная команда."); + } + } + } + } +} + diff --git a/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/Processor.java b/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/Processor.java new file mode 100644 index 000000000..ddba9e3c9 --- /dev/null +++ b/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/Processor.java @@ -0,0 +1,26 @@ +package ru.mirea.practice.s0000001; + +class Processor { + int key; + String name; + double clockSpeed; + int cacheSize; + double busFrequency; + int specInt; + int specFp; + + public Processor(int key, String name, double clockSpeed, int cacheSize, double busFrequency, int specInt, int specFp) { + this.key = key; + this.name = name; + this.clockSpeed = clockSpeed; + this.cacheSize = cacheSize; + this.busFrequency = busFrequency; + this.specInt = specInt; + this.specFp = specFp; + } + + @Override + public String toString() { + return key + ", " + name + ", " + clockSpeed + ", " + cacheSize + ", " + busFrequency + ", " + specInt + ", " + specFp; + } +} diff --git a/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/TwoThreeTree.java b/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/TwoThreeTree.java new file mode 100644 index 000000000..759402b24 --- /dev/null +++ b/students/23K0364/23K0364-p31/src/main/java/ru/mirea/practice/s0000001/TwoThreeTree.java @@ -0,0 +1,174 @@ +package ru.mirea.practice.s0000001; + +import java.util.List; +import java.util.ArrayList; + +class TwoThreeTree { + class Node { + List keys = new ArrayList<>(); + List children = new ArrayList<>(); + Processor processor; + boolean isLeaf; + + Node(Processor processor) { + this.processor = processor; + this.keys.add(processor.key); + this.isLeaf = true; + } + + Node(int key) { + this.keys.add(key); + } + + @Override + public String toString() { + if (isLeaf) { + return String.valueOf(keys.get(0)); + } else if (keys.size() == 1) { + return keys.get(0) + " -"; + } else { + return keys.get(0) + " " + keys.get(1); + } + } + } + + Node root; + + public void insert(Processor processor) { + if (root == null) { + root = new Node(processor); + } else { + Node newRoot = insertRecursive(root, processor); + if (newRoot != null) { + Node oldRoot = root; + root = new Node(newRoot.keys.get(0)); + root.children.add(oldRoot); + root.children.add(newRoot); + root.isLeaf = false; + } + } + } + + private Node insertRecursive(Node node, Processor processor) { + if (node.isLeaf) { + node.keys.add(processor.key); + node.keys.sort(Integer::compareTo); + + if (node.keys.size() > 2) { + return splitNode(node); + } + return null; + } else { + int key = processor.key; + + Node child; + if (key < node.keys.get(0)) { + child = node.children.get(0); + } else if (node.keys.size() == 1 || key < node.keys.get(1)) { + child = node.children.get(1); + } else { + child = node.children.get(2); + } + + Node newChild = insertRecursive(child, processor); + if (newChild != null) { + node.keys.add(newChild.keys.get(0)); + node.keys.sort(Integer::compareTo); + node.children.add(node.children.indexOf(child) + 1, newChild); + + if (node.keys.size() > 2) { + return splitNode(node); + } + } + return null; + } + } + + private Node splitNode(Node node) { + Node newNode = new Node(node.keys.get(2)); + newNode.isLeaf = node.isLeaf; + + if (!node.isLeaf) { + newNode.children.add(node.children.remove(2)); + newNode.children.add(node.children.remove(2)); + } + + node.keys.remove(2); + return newNode; + } + + public void printTree() { + if (root == null) { + System.out.println("Дерево пустое."); + return; + } + printTreeRecursively(root); + } + + private void printTreeRecursively(Node node) { + if (node == null) { + return; + } + System.out.println(node); + for (Node child : node.children) { + printTreeRecursively(child); + } + } + + public void delete(int key) { + root = deleteRecursive(root, key); + } + + private Node deleteRecursive(Node node, int key) { + if (node == null) { + System.out.println("Запись с ключом " + key + " не найдена."); + return null; + } + + if (node.isLeaf) { + if (node.keys.contains(key)) { + node.keys.remove(Integer.valueOf(key)); + if (node.keys.isEmpty()) { + return null; + } + } else { + System.out.println("Запись с ключом " + key + " не найдена."); + } + return node; + } + + if (key < node.keys.get(0)) { + Node child = deleteRecursive(node.children.get(0), key); + node.children.set(0, child); + } else if (node.keys.size() == 1 || key < node.keys.get(1)) { + Node child = deleteRecursive(node.children.get(1), key); + node.children.set(1, child); + } else { + Node child = deleteRecursive(node.children.get(2), key); + node.children.set(2, child); + } + return node; + } + + public List toList() { + List result = new ArrayList<>(); + collectProcessors(root, result); + return result; + } + + private void collectProcessors(Node node, List result) { + if (node == null) { + return; + } + + if (node.isLeaf) { + if (node.processor != null) { + result.add(node.processor); + } + } + + for (Node child : node.children) { + collectProcessors(child, result); + } + } +} diff --git a/students/23K0364/23K0364-p32/pom.xml b/students/23K0364/23K0364-p32/pom.xml new file mode 100644 index 000000000..0f776b35f --- /dev/null +++ b/students/23K0364/23K0364-p32/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0364 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0364-p32 + 32 задание + diff --git a/students/23K0364/23K0364-p32/src/main/java/ru/mirea/practice/s0000001/JohnsonTrotter.java b/students/23K0364/23K0364-p32/src/main/java/ru/mirea/practice/s0000001/JohnsonTrotter.java new file mode 100644 index 000000000..13bf4da64 --- /dev/null +++ b/students/23K0364/23K0364-p32/src/main/java/ru/mirea/practice/s0000001/JohnsonTrotter.java @@ -0,0 +1,71 @@ +package ru.mirea.practice.s0000001; + +import java.util.ArrayList; +import java.util.List; + +public abstract class JohnsonTrotter { + private static final int LEFT = -1; + + public static void generatePermutations(int n) { + List permutation = new ArrayList<>(); + List directions = new ArrayList<>(); + for (int i = 1; i <= n; i++) { + permutation.add(i); + directions.add(LEFT); + } + + printPermutation(permutation); + + while (true) { + int largestMobileIndex = -1; + int largestMobileValue = -1; + + for (int i = 0; i < n; i++) { + int currentDirection = directions.get(i); + int neighborIndex = i + currentDirection; + + if (neighborIndex >= 0 && neighborIndex < n && permutation.get(i) > permutation.get(neighborIndex)) { + if (permutation.get(i) > largestMobileValue) { + largestMobileValue = permutation.get(i); + largestMobileIndex = i; + } + } + } + + if (largestMobileIndex == -1) { + break; + } + + int newIndex = largestMobileIndex + directions.get(largestMobileIndex); + swap(permutation, largestMobileIndex, newIndex); + swap(directions, largestMobileIndex, newIndex); + + for (int i = 0; i < n; i++) { + if (permutation.get(i) > largestMobileValue) { + directions.set(i, directions.get(i) * -1); + } + } + + printPermutation(permutation); + } + } + + private static void swap(List list, int i, int j) { + int temp = list.get(i); + list.set(i, list.get(j)); + list.set(j, temp); + } + + private static void printPermutation(List permutation) { + for (int num : permutation) { + System.out.print(num + " "); + } + System.out.println(); + } + + public static void main(String[] args) { + int n = 3; + generatePermutations(n); + } +} + diff --git a/students/23K0364/pom.xml b/students/23K0364/pom.xml index f1641c31f..1c3926b36 100644 --- a/students/23K0364/pom.xml +++ b/students/23K0364/pom.xml @@ -45,5 +45,7 @@ 23K0364-p29 23K0364-p30.1 23K0364-p30.2 + 23K0364-p31 + 23K0364-p32