diff --git a/students/23K0815/23K0815-p30/pom.xml b/students/23K0815/23K0815-p30/pom.xml new file mode 100644 index 000000000..e9269bf4f --- /dev/null +++ b/students/23K0815/23K0815-p30/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0815 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0815-p30 + Массивы + diff --git a/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/SearchTree.java b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/SearchTree.java new file mode 100644 index 000000000..13203c271 --- /dev/null +++ b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/SearchTree.java @@ -0,0 +1,89 @@ +package ru.mirea.practice.s0000001.task1; + +class SearchTree { + private TreeNode root; + + public SearchTree() { + root = null; + } + + public void insert(int key) { + root = insertNode(root, key); + } + + private TreeNode insertNode(TreeNode current, int key) { + if (current == null) { + current = new TreeNode(key); + return current; + } + if (key < current.value) { + current.leftChild = insertNode(current.leftChild, key); + } else if (key > current.value) { + current.rightChild = insertNode(current.rightChild, key); + } + return current; + } + + public void printTree() { + inOrderTraversal(root); + System.out.println(); + } + + private void inOrderTraversal(TreeNode current) { + if (current != null) { + inOrderTraversal(current.leftChild); + System.out.print(current.value + " "); + inOrderTraversal(current.rightChild); + } + } + + public void delete(int key) { + root = deleteNode(root, key); + } + + private TreeNode deleteNode(TreeNode current, int key) { + if (current == null) { + return current; + } + + if (key < current.value) { + current.leftChild = deleteNode(current.leftChild, key); + } else if (key > current.value) { + current.rightChild = deleteNode(current.rightChild, key); + } else { + if (current.leftChild == null) { + return current.rightChild; + } else if (current.rightChild == null) { + return current.leftChild; + } + + current.value = getMinValue(current.rightChild); + current.rightChild = deleteNode(current.rightChild, current.value); + } + return current; + } + + private int getMinValue(TreeNode current) { + int minValue = current.value; + while (current.leftChild != null) { + minValue = current.leftChild.value; + current = current.leftChild; + } + return minValue; + } + + public void clear() { + root = clearAll(root); + } + + private TreeNode clearAll(TreeNode current) { + if (current == null) { + return null; + } + current.leftChild = clearAll(current.leftChild); + current.rightChild = clearAll(current.rightChild); + current = null; + return current; + } +} + diff --git a/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/TreeNode.java b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/TreeNode.java new file mode 100644 index 000000000..b48a85017 --- /dev/null +++ b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task1/TreeNode.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s0000001.task1; + +class TreeNode { + int value; + TreeNode leftChild; + TreeNode rightChild; + + TreeNode(int key) { + value = key; + leftChild = rightChild = null; + } +} \ No newline at end of file diff --git a/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task2/HuffmanAlgorithm.java b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task2/HuffmanAlgorithm.java new file mode 100644 index 000000000..f69862412 --- /dev/null +++ b/students/23K0815/23K0815-p30/src/main/java/ru/mirea/practice/s0000001/task2/HuffmanAlgorithm.java @@ -0,0 +1,64 @@ +package ru.mirea.practice.s0000001.task2; + +import java.util.Map; +import java.util.PriorityQueue; +import java.util.TreeMap; + +public abstract class HuffmanAlgorithm { + + public static Map generateFrequencyMap(String input) { + Map frequencyMap = new TreeMap<>(); + for (char character : input.toCharArray()) { + frequencyMap.put(character, frequencyMap.getOrDefault(character, 0) + 1); + } + return frequencyMap; + } + + public static Map constructHuffmanTree(Map frequencyMap) { + PriorityQueue priorityQueue = new PriorityQueue<>(); + for (Map.Entry entry : frequencyMap.entrySet()) { + priorityQueue.add(new HuffmanTreeNode(entry.getKey(), entry.getValue())); + } + + while (priorityQueue.size() > 1) { + HuffmanTreeNode leftNode = priorityQueue.poll(); + HuffmanTreeNode rightNode = priorityQueue.poll(); + HuffmanTreeNode parentNode = new HuffmanTreeNode('\0', leftNode.frequency + rightNode.frequency); + parentNode.left = leftNode; + parentNode.right = rightNode; + priorityQueue.add(parentNode); + } + + Map huffmanCodes = new TreeMap<>(); + createHuffmanCodes(priorityQueue.peek(), "", huffmanCodes); + + return huffmanCodes; + } + + public static void createHuffmanCodes(HuffmanTreeNode node, String code, Map huffmanCodes) { + if (node != null) { + if (node.character != '\0') { + huffmanCodes.put(node.character, code); + } + createHuffmanCodes(node.left, code + "0", huffmanCodes); + createHuffmanCodes(node.right, code + "1", huffmanCodes); + } + } + + public static class HuffmanTreeNode implements Comparable { + char character; + int frequency; + HuffmanTreeNode left; + HuffmanTreeNode right; + + HuffmanTreeNode(char character, int frequency) { + this.character = character; + this.frequency = frequency; + } + + @Override + public int compareTo(HuffmanTreeNode other) { + return Integer.compare(this.frequency, other.frequency); + } + } +} \ No newline at end of file diff --git a/students/23K0815/23K0815-p31/pom.xml b/students/23K0815/23K0815-p31/pom.xml new file mode 100644 index 000000000..a2d376ff7 --- /dev/null +++ b/students/23K0815/23K0815-p31/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0815 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0815-p31 + Массивы + diff --git a/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerDisplay.java b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerDisplay.java new file mode 100644 index 000000000..828a93ff6 --- /dev/null +++ b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerDisplay.java @@ -0,0 +1,69 @@ +package ru.mirea.practice.s0000001.task1; + +import java.util.ArrayDeque; +import java.util.Deque; + +public abstract class BurgerDisplay { + + public static void displayBurgerTree(BurgerNode root) { + if (root == null) { + return; + } + + int height = calculateHeight(root); + Deque queue = new ArrayDeque<>(); + queue.offer(root); + int level = 0; + + while (!queue.isEmpty()) { + int levelSize = queue.size(); + int spacesBefore = (int) Math.pow(2, height - level - 1) - 1; + int spacesBetween = (int) Math.pow(2, height - level) - 1; + + System.out.print(" ".repeat(spacesBefore)); + + for (int i = 0; i < levelSize; i++) { + BurgerNode node = queue.poll(); + System.out.print(node.patty); + + if (i < levelSize - 1) { + System.out.print(" ".repeat(spacesBetween)); + } + + if (node.lettuce != null) { + queue.offer(node.lettuce); + } + if (node.tomato != null) { + queue.offer(node.tomato); + } + if (node.onion != null) { + queue.offer(node.onion); + } + } + System.out.println(); + level++; + } + } + + // Function to compute the height of the burger tree + private static int calculateHeight(BurgerNode root) { + if (root == null) { + return 0; + } + return 1 + Math.max(Math.max(calculateHeight(root.lettuce), calculateHeight(root.tomato)), calculateHeight(root.onion)); + } + + public static void main(String[] args) { + BurgerNode root = new BurgerNode(5); + root.lettuce = new BurgerNode(2); + root.tomato = new BurgerNode(3); + root.onion = new BurgerNode(6); + root.lettuce.lettuce = new BurgerNode(1); + root.lettuce.onion = new BurgerNode(2); + root.tomato.lettuce = new BurgerNode(4); + root.onion.lettuce = new BurgerNode(5); + root.onion.onion = new BurgerNode(6); + + displayBurgerTree(root); + } +} \ No newline at end of file diff --git a/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerNode.java b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerNode.java new file mode 100644 index 000000000..f9fc1a062 --- /dev/null +++ b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerNode.java @@ -0,0 +1,13 @@ +package ru.mirea.practice.s0000001.task1; + +class BurgerNode { + int patty; + BurgerNode lettuce; + BurgerNode tomato; + BurgerNode onion; + + BurgerNode(int patty) { + this.patty = patty; + } +} + diff --git a/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerTree.java b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerTree.java new file mode 100644 index 000000000..ba308b29a --- /dev/null +++ b/students/23K0815/23K0815-p31/src/main/java/ru/mirea/practice/s0000001/task1/BurgerTree.java @@ -0,0 +1,34 @@ +package ru.mirea.practice.s0000001.task1; + +public abstract class BurgerTree { + public static void displayBurgerTree(BurgerNode node) { + if (node == null) { + return; + } + + System.out.print(node.patty); + + if (node.lettuce != null && node.onion != null) { + System.out.print("-"); + } + + System.out.print(" "); + displayBurgerTree(node.lettuce); + displayBurgerTree(node.tomato); + displayBurgerTree(node.onion); + } + + public static void main(String[] args) { + BurgerNode root = new BurgerNode(5); + root.lettuce = new BurgerNode(2); + root.tomato = new BurgerNode(3); + root.onion = new BurgerNode(6); + root.lettuce.lettuce = new BurgerNode(1); + root.lettuce.onion = new BurgerNode(2); + root.tomato.lettuce = new BurgerNode(4); + root.onion.lettuce = new BurgerNode(5); + root.onion.onion = new BurgerNode(6); + + displayBurgerTree(root); + } +} diff --git a/students/23K0815/23K0815-p32/pom.xml b/students/23K0815/23K0815-p32/pom.xml new file mode 100644 index 000000000..eaa628f02 --- /dev/null +++ b/students/23K0815/23K0815-p32/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0815 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0815-p32 + Массивы + diff --git a/students/23K0815/23K0815-p32/src/main/java/ru/mirea/practice/s0000001/task1/PermutationGenerator.java b/students/23K0815/23K0815-p32/src/main/java/ru/mirea/practice/s0000001/task1/PermutationGenerator.java new file mode 100644 index 000000000..fb497222a --- /dev/null +++ b/students/23K0815/23K0815-p32/src/main/java/ru/mirea/practice/s0000001/task1/PermutationGenerator.java @@ -0,0 +1,82 @@ +package ru.mirea.practice.s0000001.task1; + +import java.util.ArrayList; +import java.util.List; + +public final class PermutationGenerator { + + private PermutationGenerator() { + // Prevent instantiation + } + + static class Item { + int number; + boolean isMovingRight; + + Item(int number) { + this.number = number; + this.isMovingRight = false; // Initially set to move left + } + } + + public static void main(String[] args) { + int count = 10; // Changed from 4 to 10 + createPermutations(count); + } + + public static void createPermutations(int count) { + List items = new ArrayList<>(); + for (int i = 1; i <= count; i++) { + items.add(new Item(i)); + } + + displayPermutation(items); + + while (true) { + int indexOfLargestMovable = findLargestMovable(items); + if (indexOfLargestMovable == -1) { + break; + } + + Item largestItem = items.get(indexOfLargestMovable); + int targetIndex = largestItem.isMovingRight ? indexOfLargestMovable + 1 : indexOfLargestMovable - 1; + swapItems(items, indexOfLargestMovable, targetIndex); + + for (Item item : items) { + if (item.number > largestItem.number) { + item.isMovingRight = !item.isMovingRight; // Change direction + } + } + + displayPermutation(items); + } + } + + private static int findLargestMovable(List items) { + int movableIndex = -1; + for (int i = 0; i < items.size(); i++) { + Item currentItem = items.get(i); + int neighborIndex = currentItem.isMovingRight ? i + 1 : i - 1; + + if (neighborIndex >= 0 && neighborIndex < items.size() && currentItem.number > items.get(neighborIndex).number) { + if (movableIndex == -1 || currentItem.number > items.get(movableIndex).number) { + movableIndex = i; + } + } + } + return movableIndex; + } + + private static void swapItems(List items, int firstIndex, int secondIndex) { + Item temp = items.get(firstIndex); + items.set(firstIndex, items.get(secondIndex)); + items.set(secondIndex, temp); + } + + private static void displayPermutation(List items) { + for (Item item : items) { + System.out.print(item.number + " "); + } + System.out.println(); + } +} \ No newline at end of file diff --git a/students/23K0815/pom.xml b/students/23K0815/pom.xml index 1d67a20e0..f5111b40a 100644 --- a/students/23K0815/pom.xml +++ b/students/23K0815/pom.xml @@ -37,5 +37,8 @@ 23K0815-p27 23K0815-p28 23K0815-p29 + 23K0815-p30 + 23K0815-p31 + 23K0815-p32