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

Лабораторная №31 #671

Merged
merged 1 commit into from
Dec 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions students/23K0120/23K0120-p31/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>23K0120</artifactId>
<groupId>ru.mirea.practice</groupId>
<version>2024.1</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>23K0120-p31</artifactId>
<description>2-3 Tree</description>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.mirea.practice.s23k0120;

public final class Main {

private Main() {

}

public static void main(String[] args) {
System.out.println("Тридцать первая практическая работа!");
}
}
Original file line number Diff line number Diff line change
@@ -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<Processor> processorTree = new TwoThreeTree<Processor>();
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);
}
}
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package ru.mirea.practice.s23k0120.task1;

public class Processor implements Comparable<Processor> {
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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package ru.mirea.practice.s23k0120.task1;

public class TwoThreeTree<E extends Comparable<E>> {
// Minimum degree
private final int t;
// Pointer to root node
private TwoThreeTreeNode<E> root;

public TwoThreeTree() {
this.t = 2;
root = null;
}

public TwoThreeTreeNode<E> 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<E>(true);
root.dataArr.set(0, data);
root.numOfKeys = 1;
} else {
if (root.numOfKeys == 2 * t - 1) {
TwoThreeTreeNode<E> newRoot = new TwoThreeTreeNode<E>(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();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package ru.mirea.practice.s23k0120.task1;

import java.util.ArrayList;
import java.util.List;

public class TwoThreeTreeNode<E extends Comparable<E>> {
List<E> dataArr;
int t;
List<TwoThreeTreeNode<E>> 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<E> 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<E> y) {
TwoThreeTreeNode<E> z = new TwoThreeTreeNode<E>(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();
}
}
}
1 change: 1 addition & 0 deletions students/23K0120/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
<module>23K0120-p29</module>
<module>23K0120-p30</module>
<module>23K0120-p30-2</module>
<module>23K0120-p31</module>
<module>23K0120-p32</module>
</modules>
</project>
Loading