Skip to content
This repository was archived by the owner on Dec 28, 2024. It is now read-only.

Commit 754e249

Browse files
authored
Merge pull request #672 from K-Roma/Practic-31-32
Практические работы 31-32
2 parents b1bdeca + 8e20460 commit 754e249

File tree

8 files changed

+453
-0
lines changed

8 files changed

+453
-0
lines changed

students/23K0354/23K0354-p31/pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<artifactId>23K0354</artifactId>
7+
<groupId>ru.mirea.practice</groupId>
8+
<version>2024.1</version>
9+
<relativePath>../pom.xml</relativePath>
10+
</parent>
11+
<artifactId>23K0354-p31</artifactId>
12+
<description> 2-3 деревья </description>
13+
</project>
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package ru.mirea.practices0000001.task1;
2+
3+
import java.io.BufferedReader;
4+
import java.io.File;
5+
import java.io.FileReader;
6+
import java.io.IOException;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
public final class FileHandler {
11+
12+
private FileHandler() {
13+
}
14+
15+
public static List<ProcessorRecord> readFile(String filePath) {
16+
List<ProcessorRecord> records = new ArrayList<>();
17+
BufferedReader reader = null;
18+
19+
try {
20+
reader = new BufferedReader(new FileReader(new File(filePath)));
21+
String line;
22+
while ((line = reader.readLine()) != null) {
23+
String[] parts = line.split(",");
24+
if (parts.length == 7) {
25+
int key = Integer.parseInt(parts[0].trim());
26+
String name = parts[1].trim();
27+
double clockFrequency = Double.parseDouble(parts[2].trim());
28+
int cacheSize = Integer.parseInt(parts[3].trim());
29+
double busFrequency = Double.parseDouble(parts[4].trim());
30+
int specint = Integer.parseInt(parts[5].trim());
31+
int specfp = Integer.parseInt(parts[6].trim());
32+
33+
ProcessorRecord record = new ProcessorRecord(
34+
key, name, clockFrequency, cacheSize, busFrequency, specint, specfp);
35+
records.add(record);
36+
}
37+
}
38+
} catch (IOException e) {
39+
System.out.println("Error reading file: " + e.getMessage());
40+
} finally {
41+
try {
42+
if (reader != null) {
43+
reader.close();
44+
}
45+
} catch (IOException e) {
46+
System.out.println("Error closing reader: " + e.getMessage());
47+
}
48+
}
49+
50+
return records;
51+
}
52+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package ru.mirea.practices0000001.task1;
2+
3+
import java.util.Locale;
4+
import java.util.Scanner;
5+
6+
public final class Main {
7+
8+
private static Scanner scanner = new Scanner(System.in);
9+
private static TwoThreeTree tree = new TwoThreeTree();
10+
11+
private Main() {
12+
}
13+
14+
public static void run() {
15+
while (true) {
16+
System.out.println("Enter command (L, D, A, S, E):");
17+
String command = scanner.nextLine().trim().toUpperCase(Locale.ROOT);
18+
19+
switch (command) {
20+
case "L":
21+
tree.printByLevels();
22+
break;
23+
24+
case "D":
25+
System.out.println("Enter key to delete:");
26+
int deleteKey = Integer.parseInt(scanner.nextLine().trim());
27+
boolean deleted = tree.delete(deleteKey);
28+
if (deleted) {
29+
System.out.println("Deleted successfully.");
30+
} else {
31+
System.out.println("Key not found.");
32+
}
33+
break;
34+
35+
case "A":
36+
System.out.println("Enter key to add:");
37+
int addKey = Integer.parseInt(scanner.nextLine().trim());
38+
System.out.println("Enter processor name:");
39+
String name = scanner.nextLine().trim();
40+
System.out.println("Enter clock frequency (GHz):");
41+
double clockFrequency = Double.parseDouble(scanner.nextLine().trim());
42+
System.out.println("Enter cache size (KB):");
43+
int cacheSize = Integer.parseInt(scanner.nextLine().trim());
44+
System.out.println("Enter bus frequency (GHz):");
45+
double busFrequency = Double.parseDouble(scanner.nextLine().trim());
46+
System.out.println("Enter SPECint result:");
47+
int specint = Integer.parseInt(scanner.nextLine().trim());
48+
System.out.println("Enter SPECfp result:");
49+
int specfp = Integer.parseInt(scanner.nextLine().trim());
50+
51+
ProcessorRecord record = new ProcessorRecord(addKey, name, clockFrequency, cacheSize, busFrequency, specint, specfp);
52+
tree.insert(record);
53+
System.out.println("Record added.");
54+
break;
55+
56+
case "S":
57+
System.out.println("Saving to file...");
58+
break;
59+
60+
case "E":
61+
System.out.println("Exiting...");
62+
scanner.close();
63+
return;
64+
65+
default:
66+
System.out.println("Unknown command.");
67+
break;
68+
}
69+
}
70+
}
71+
72+
public static void main(String[] args) {
73+
run();
74+
}
75+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package ru.mirea.practices0000001.task1;
2+
3+
public class ProcessorRecord {
4+
private int key;
5+
private String name;
6+
private double clockFrequency;
7+
private int cacheSize;
8+
private double busFrequency;
9+
private int specint;
10+
private int specfp;
11+
12+
public ProcessorRecord(int key, String name, double clockFrequency, int cacheSize, double busFrequency, int specint, int specfp) {
13+
this.key = key;
14+
this.name = name;
15+
this.clockFrequency = clockFrequency;
16+
this.cacheSize = cacheSize;
17+
this.busFrequency = busFrequency;
18+
this.specint = specint;
19+
this.specfp = specfp;
20+
}
21+
22+
public int getKey() {
23+
return key;
24+
}
25+
26+
public String getName() {
27+
return name;
28+
}
29+
30+
public double getClockFrequency() {
31+
return clockFrequency;
32+
}
33+
34+
public int getCacheSize() {
35+
return cacheSize;
36+
}
37+
38+
public double getBusFrequency() {
39+
return busFrequency;
40+
}
41+
42+
public int getSpecint() {
43+
return specint;
44+
}
45+
46+
public int getSpecfp() {
47+
return specfp;
48+
}
49+
50+
@Override
51+
public String toString() {
52+
return "ProcessorRecord{"
53+
+ "key=" + key
54+
+ ", name='" + name + '\''
55+
+ ", clockFrequency=" + clockFrequency
56+
+ ", cacheSize=" + cacheSize
57+
+ ", busFrequency=" + busFrequency
58+
+ ", specint=" + specint
59+
+ ", specfp=" + specfp
60+
+ '}';
61+
}
62+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package ru.mirea.practices0000001.task1;
2+
3+
import java.util.ArrayList;
4+
import java.util.Comparator;
5+
import java.util.LinkedList;
6+
import java.util.List;
7+
import java.util.Queue;
8+
9+
public class TwoThreeTree {
10+
private static class Node {
11+
private final boolean isLeaf;
12+
private final List<ProcessorRecord> records = new ArrayList<>();
13+
private final List<Node> children = new ArrayList<>();
14+
15+
Node(boolean isLeaf) {
16+
this.isLeaf = isLeaf;
17+
}
18+
}
19+
20+
private Node root = new Node(true);
21+
22+
public void insert(ProcessorRecord record) {
23+
root = insertRec(root, record);
24+
}
25+
26+
private Node insertRec(Node node, ProcessorRecord record) {
27+
if (node.isLeaf) {
28+
node.records.add(record);
29+
node.records.sort(Comparator.comparingInt(ProcessorRecord::getKey));
30+
if (node.records.size() > 2) {
31+
return split(node);
32+
}
33+
return node;
34+
} else {
35+
if (record.getKey() < node.records.get(0).getKey()) {
36+
Node newChild = insertRec(node.children.get(0), record);
37+
if (newChild != node.children.get(0)) {
38+
node.children.add(0, newChild);
39+
}
40+
} else if (node.records.size() == 1 || record.getKey() < node.records.get(1).getKey()) {
41+
Node newChild = insertRec(node.children.get(1), record);
42+
if (newChild != node.children.get(1)) {
43+
node.children.add(1, newChild);
44+
}
45+
} else {
46+
Node newChild = insertRec(node.children.get(2), record);
47+
if (newChild != node.children.get(2)) {
48+
node.children.add(2, newChild);
49+
}
50+
}
51+
if (node.children.size() > 3) {
52+
return split(node);
53+
}
54+
return node;
55+
}
56+
}
57+
58+
private Node split(Node node) {
59+
Node left = new Node(node.isLeaf);
60+
Node right = new Node(node.isLeaf);
61+
left.records.add(node.records.get(0));
62+
right.records.add(node.records.get(2));
63+
if (!node.isLeaf) {
64+
left.children.add(node.children.get(0));
65+
left.children.add(node.children.get(1));
66+
right.children.add(node.children.get(2));
67+
right.children.add(node.children.get(3));
68+
}
69+
Node parent = new Node(false);
70+
parent.records.add(node.records.get(1));
71+
parent.children.add(left);
72+
parent.children.add(right);
73+
return parent;
74+
}
75+
76+
public boolean delete(int key) {
77+
return deleteRec(root, key);
78+
}
79+
80+
private boolean deleteRec(Node node, int key) {
81+
if (node.isLeaf) {
82+
return node.records.removeIf(r -> r.getKey() == key);
83+
} else {
84+
for (int i = 0; i < node.records.size(); i++) {
85+
if (key < node.records.get(i).getKey()) {
86+
return deleteRec(node.children.get(i), key);
87+
}
88+
}
89+
return deleteRec(node.children.get(node.children.size() - 1), key);
90+
}
91+
}
92+
93+
public void printByLevels() {
94+
Queue<Node> queue = new LinkedList<>();
95+
queue.add(root);
96+
while (!queue.isEmpty()) {
97+
Node current = queue.poll();
98+
if (current.isLeaf) {
99+
for (ProcessorRecord record : current.records) {
100+
System.out.print(record.getKey() + " ");
101+
}
102+
} else {
103+
for (ProcessorRecord record : current.records) {
104+
System.out.print(record.getKey() + "- ");
105+
}
106+
queue.addAll(current.children);
107+
}
108+
System.out.println();
109+
}
110+
}
111+
112+
public List<ProcessorRecord> getAllRecords() {
113+
List<ProcessorRecord> result = new ArrayList<>();
114+
getAllRecordsRec(root, result);
115+
return result;
116+
}
117+
118+
private void getAllRecordsRec(Node node, List<ProcessorRecord> result) {
119+
if (node.isLeaf) {
120+
result.addAll(node.records);
121+
} else {
122+
for (int i = 0; i < node.records.size(); i++) {
123+
getAllRecordsRec(node.children.get(i), result);
124+
}
125+
getAllRecordsRec(node.children.get(node.children.size() - 1), result);
126+
}
127+
}
128+
}

students/23K0354/23K0354-p32/pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<artifactId>23K0354</artifactId>
7+
<groupId>ru.mirea.practice</groupId>
8+
<version>2024.1</version>
9+
<relativePath>../pom.xml</relativePath>
10+
</parent>
11+
<artifactId>23K0354-p32</artifactId>
12+
<description> Алгоритмы генерации комбинаторных объектов </description>
13+
</project>

0 commit comments

Comments
 (0)