[2] Лабораторная работа №2 #300
3
BolonkinNM/.idea/.gitignore
vendored
3
BolonkinNM/.idea/.gitignore
vendored
|
|
@ -1,3 +0,0 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (ds_project_archive)" project-jdk-type="Python SDK" />
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (maze_project_submission) (2)" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/ds_project_archive.iml" filepath="$PROJECT_DIR$/.idea/ds_project_archive.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/maze_project_submission.iml" filepath="$PROJECT_DIR$/.idea/maze_project_submission.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
42
BolonkinNM/.idea/workspace.xml
Normal file
42
BolonkinNM/.idea/workspace.xml
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="a6ff989d-c5f6-4522-8b0a-933849f2d044" name="Changes" comment="" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="MarkdownSettingsMigration">
|
||||
<option name="stateVersion" value="1" />
|
||||
</component>
|
||||
<component name="ProjectColorInfo"><![CDATA[{
|
||||
"associatedIndex": 2
|
||||
}]]></component>
|
||||
<component name="ProjectId" id="3EB20Mq0B865MSq8Kkl2evaRIZW" />
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"last_opened_file_path": "C:/Users/vaz21/Downloads/Task 2 GLOBAL/maze_project_submission"
|
||||
}
|
||||
}]]></component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="a6ff989d-c5f6-4522-8b0a-933849f2d044" name="Changes" comment="" />
|
||||
<created>1779637417749</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1779637417749</updated>
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,18 +1,24 @@
|
|||
# Задание 1 — структуры данных
|
||||
# Maze Solver Project
|
||||
|
||||
Процедурная реализация:
|
||||
- linked_list.py
|
||||
- hash_table.py
|
||||
- bst.py
|
||||
ООП-проект для поиска выхода из лабиринта с паттернами:
|
||||
- Builder
|
||||
- Strategy
|
||||
- Observer
|
||||
- Command
|
||||
|
||||
Эксперименты и отчёты:
|
||||
- experiments.py
|
||||
- plot_results.py
|
||||
- results.csv
|
||||
- docs/report.md
|
||||
- docs/data/*.png
|
||||
|
||||
Запуск:
|
||||
## Запуск
|
||||
```bash
|
||||
python main.py
|
||||
```
|
||||
|
||||
## Эксперименты
|
||||
```bash
|
||||
python experiment.py
|
||||
```
|
||||
|
||||
Результаты сохраняются в папку `experiment_results/`.
|
||||
|
||||
## Требования
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
|
|
|||
|
|
@ -1,118 +0,0 @@
|
|||
from typing import Any, Dict, List, Optional
|
||||
|
||||
|
||||
Node = Dict[str, Any]
|
||||
|
||||
|
||||
def _make_node(name: str, phone: str) -> Node:
|
||||
return {"name": name, "phone": phone, "left": None, "right": None}
|
||||
|
||||
|
||||
def bst_insert(root: Optional[Node], name: str, phone: str) -> Node:
|
||||
new_node = _make_node(name, phone)
|
||||
|
||||
if root is None:
|
||||
return new_node
|
||||
|
||||
current = root
|
||||
parent = None
|
||||
|
||||
while current is not None:
|
||||
parent = current
|
||||
if name < current["name"]:
|
||||
current = current["left"]
|
||||
elif name > current["name"]:
|
||||
current = current["right"]
|
||||
else:
|
||||
current["phone"] = phone
|
||||
return root
|
||||
|
||||
if name < parent["name"]:
|
||||
parent["left"] = new_node
|
||||
else:
|
||||
parent["right"] = new_node
|
||||
|
||||
return root
|
||||
|
||||
|
||||
def bst_find(root: Optional[Node], name: str) -> Optional[str]:
|
||||
current = root
|
||||
while current is not None:
|
||||
if name < current["name"]:
|
||||
current = current["left"]
|
||||
elif name > current["name"]:
|
||||
current = current["right"]
|
||||
else:
|
||||
return current["phone"]
|
||||
return None
|
||||
|
||||
|
||||
def _find_min_node(node: Node) -> Node:
|
||||
current = node
|
||||
while current["left"] is not None:
|
||||
current = current["left"]
|
||||
return current
|
||||
|
||||
|
||||
def bst_delete(root: Optional[Node], name: str) -> Optional[Node]:
|
||||
if root is None:
|
||||
return None
|
||||
|
||||
parent = None
|
||||
current = root
|
||||
|
||||
while current is not None and current["name"] != name:
|
||||
parent = current
|
||||
if name < current["name"]:
|
||||
current = current["left"]
|
||||
else:
|
||||
current = current["right"]
|
||||
|
||||
if current is None:
|
||||
return root
|
||||
|
||||
if current["left"] is None or current["right"] is None:
|
||||
child = current["left"] if current["left"] is not None else current["right"]
|
||||
|
||||
if parent is None:
|
||||
return child
|
||||
|
||||
if parent["left"] is current:
|
||||
parent["left"] = child
|
||||
else:
|
||||
parent["right"] = child
|
||||
return root
|
||||
|
||||
succ_parent = current
|
||||
successor = current["right"]
|
||||
while successor["left"] is not None:
|
||||
succ_parent = successor
|
||||
successor = successor["left"]
|
||||
|
||||
current["name"] = successor["name"]
|
||||
current["phone"] = successor["phone"]
|
||||
|
||||
successor_child = successor["right"]
|
||||
if succ_parent["left"] is successor:
|
||||
succ_parent["left"] = successor_child
|
||||
else:
|
||||
succ_parent["right"] = successor_child
|
||||
|
||||
return root
|
||||
|
||||
|
||||
def bst_list_all(root: Optional[Node]) -> List[Dict[str, str]]:
|
||||
result: List[Dict[str, str]] = []
|
||||
stack: List[Node] = []
|
||||
current = root
|
||||
|
||||
while current is not None or stack:
|
||||
while current is not None:
|
||||
stack.append(current)
|
||||
current = current["left"]
|
||||
|
||||
current = stack.pop()
|
||||
result.append({"name": current["name"], "phone": current["phone"]})
|
||||
current = current["right"]
|
||||
|
||||
return result
|
||||
0
BolonkinNM/builders/__init__.py
Normal file
0
BolonkinNM/builders/__init__.py
Normal file
7
BolonkinNM/builders/maze_builder.py
Normal file
7
BolonkinNM/builders/maze_builder.py
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
from abc import ABC, abstractmethod
|
||||
|
||||
|
||||
class MazeBuilder(ABC):
|
||||
@abstractmethod
|
||||
def buildFromFile(self, filename):
|
||||
raise NotImplementedError
|
||||
52
BolonkinNM/builders/text_file_maze_builder.py
Normal file
52
BolonkinNM/builders/text_file_maze_builder.py
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
from core.cell import Cell
|
||||
from core.maze import Maze
|
||||
from builders.maze_builder import MazeBuilder
|
||||
|
||||
|
||||
class TextFileMazeBuilder(MazeBuilder):
|
||||
def buildFromFile(self, filename):
|
||||
with open(filename, "r", encoding="utf-8") as f:
|
||||
lines = [line.rstrip("\n") for line in f]
|
||||
|
||||
if not lines:
|
||||
raise ValueError("Maze file is empty")
|
||||
|
||||
width = max(len(line) for line in lines)
|
||||
height = len(lines)
|
||||
|
||||
cells = []
|
||||
startCell = None
|
||||
exitCell = None
|
||||
|
||||
for y, line in enumerate(lines):
|
||||
row = []
|
||||
for x in range(width):
|
||||
ch = line[x] if x < len(line) else "#"
|
||||
|
||||
if ch == "#":
|
||||
cell = Cell(x, y, isWall=True)
|
||||
elif ch == "S":
|
||||
if startCell is not None:
|
||||
raise ValueError("Multiple start cells found")
|
||||
cell = Cell(x, y, isWall=False, isStart=True)
|
||||
startCell = cell
|
||||
elif ch == "E":
|
||||
if exitCell is not None:
|
||||
raise ValueError("Multiple exit cells found")
|
||||
cell = Cell(x, y, isWall=False, isExit=True)
|
||||
exitCell = cell
|
||||
elif ch in (" ", "."):
|
||||
cell = Cell(x, y, isWall=False)
|
||||
elif ch.isdigit():
|
||||
cell = Cell(x, y, isWall=False, weight=max(1, int(ch)))
|
||||
else:
|
||||
raise ValueError(f"Unsupported symbol '{ch}' at ({x}, {y})")
|
||||
row.append(cell)
|
||||
cells.append(row)
|
||||
|
||||
if startCell is None:
|
||||
raise ValueError("Start cell 'S' not found")
|
||||
if exitCell is None:
|
||||
raise ValueError("Exit cell 'E' not found")
|
||||
|
||||
return Maze(cells, width, height, startCell, exitCell)
|
||||
0
BolonkinNM/commands/__init__.py
Normal file
0
BolonkinNM/commands/__init__.py
Normal file
11
BolonkinNM/commands/command.py
Normal file
11
BolonkinNM/commands/command.py
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
from abc import ABC, abstractmethod
|
||||
|
||||
|
||||
class Command(ABC):
|
||||
@abstractmethod
|
||||
def execute(self):
|
||||
raise NotImplementedError
|
||||
|
||||
@abstractmethod
|
||||
def undo(self):
|
||||
raise NotImplementedError
|
||||
37
BolonkinNM/commands/move_command.py
Normal file
37
BolonkinNM/commands/move_command.py
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
from commands.command import Command
|
||||
|
||||
|
||||
class MoveCommand(Command):
|
||||
DIRECTION_TO_DELTA = {
|
||||
"W": (0, -1),
|
||||
"A": (-1, 0),
|
||||
"S": (0, 1),
|
||||
"D": (1, 0),
|
||||
}
|
||||
|
||||
def __init__(self, player, maze, direction):
|
||||
self.player = player
|
||||
self.maze = maze
|
||||
self.direction = direction.upper()
|
||||
self.previousCell = None
|
||||
|
||||
def execute(self):
|
||||
if self.direction not in self.DIRECTION_TO_DELTA:
|
||||
return False
|
||||
|
||||
dx, dy = self.DIRECTION_TO_DELTA[self.direction]
|
||||
current = self.player.currentCell
|
||||
new_cell = self.maze.getCell(current.x + dx, current.y + dy)
|
||||
|
||||
if new_cell is None or not new_cell.isPassable():
|
||||
return False
|
||||
|
||||
self.previousCell = current
|
||||
self.player.setCell(new_cell)
|
||||
return True
|
||||
|
||||
def undo(self):
|
||||
if self.previousCell is None:
|
||||
return False
|
||||
self.player.setCell(self.previousCell)
|
||||
return True
|
||||
0
BolonkinNM/controller/__init__.py
Normal file
0
BolonkinNM/controller/__init__.py
Normal file
30
BolonkinNM/controller/game_controller.py
Normal file
30
BolonkinNM/controller/game_controller.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
from commands.move_command import MoveCommand
|
||||
|
||||
|
||||
class GameController:
|
||||
def __init__(self, maze, player, view):
|
||||
self.maze = maze
|
||||
self.player = player
|
||||
self.view = view
|
||||
self.history = []
|
||||
|
||||
def move(self, direction):
|
||||
command = MoveCommand(self.player, self.maze, direction)
|
||||
if command.execute():
|
||||
self.history.append(command)
|
||||
self.view.update({"type": "move", "direction": direction})
|
||||
self.view.render(self.maze, player_position=self.player.currentCell)
|
||||
return True
|
||||
print("Cannot move there")
|
||||
return False
|
||||
|
||||
def undo(self):
|
||||
if not self.history:
|
||||
print("Nothing to undo")
|
||||
return False
|
||||
command = self.history.pop()
|
||||
if command.undo():
|
||||
self.view.update({"type": "undo"})
|
||||
self.view.render(self.maze, player_position=self.player.currentCell)
|
||||
return True
|
||||
return False
|
||||
0
BolonkinNM/core/__init__.py
Normal file
0
BolonkinNM/core/__init__.py
Normal file
26
BolonkinNM/core/cell.py
Normal file
26
BolonkinNM/core/cell.py
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
from dataclasses import dataclass
|
||||
|
||||
|
||||
@dataclass
|
||||
class Cell:
|
||||
x: int
|
||||
y: int
|
||||
isWall: bool = False
|
||||
isStart: bool = False
|
||||
isExit: bool = False
|
||||
weight: int = 1
|
||||
|
||||
def isPassable(self):
|
||||
return not self.isWall
|
||||
|
||||
def __repr__(self):
|
||||
parts = [f"Cell({self.x}, {self.y}"]
|
||||
if self.isWall:
|
||||
parts.append("WALL")
|
||||
if self.isStart:
|
||||
parts.append("START")
|
||||
if self.isExit:
|
||||
parts.append("EXIT")
|
||||
if self.weight != 1:
|
||||
parts.append(f"w={self.weight}")
|
||||
return ", ".join(parts) + ")"
|
||||
49
BolonkinNM/core/maze.py
Normal file
49
BolonkinNM/core/maze.py
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
class Maze:
|
||||
def __init__(self, cells, width, height, startCell=None, exitCell=None):
|
||||
self.cells = cells
|
||||
self.width = width
|
||||
self.height = height
|
||||
self.startCell = startCell
|
||||
self.exitCell = exitCell
|
||||
|
||||
def getCell(self, x, y):
|
||||
if 0 <= x < self.width and 0 <= y < self.height:
|
||||
return self.cells[y][x]
|
||||
return None
|
||||
|
||||
def getNeighbors(self, cell):
|
||||
neighbors = []
|
||||
for dx, dy in ((0, -1), (0, 1), (-1, 0), (1, 0)):
|
||||
nx, ny = cell.x + dx, cell.y + dy
|
||||
neighbor = self.getCell(nx, ny)
|
||||
if neighbor is not None and neighbor.isPassable():
|
||||
neighbors.append(neighbor)
|
||||
return neighbors
|
||||
|
||||
def render_lines(self, player_position=None, path=None):
|
||||
path_set = {(c.x, c.y) for c in path} if path else set()
|
||||
player_pos = None if player_position is None else (player_position.x, player_position.y)
|
||||
lines = []
|
||||
for y in range(self.height):
|
||||
row = []
|
||||
for x in range(self.width):
|
||||
cell = self.cells[y][x]
|
||||
if player_pos == (x, y):
|
||||
row.append("P")
|
||||
elif cell.isStart:
|
||||
row.append("S")
|
||||
elif cell.isExit:
|
||||
row.append("E")
|
||||
elif cell.isWall:
|
||||
row.append("#")
|
||||
elif (x, y) in path_set:
|
||||
row.append("*")
|
||||
elif cell.weight > 1:
|
||||
row.append(str(cell.weight))
|
||||
else:
|
||||
row.append(" ")
|
||||
lines.append("".join(row))
|
||||
return lines
|
||||
|
||||
def render(self, player_position=None, path=None):
|
||||
return "\n".join(self.render_lines(player_position=player_position, path=path))
|
||||
6
BolonkinNM/core/player.py
Normal file
6
BolonkinNM/core/player.py
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
class Player:
|
||||
def __init__(self, currentCell):
|
||||
self.currentCell = currentCell
|
||||
|
||||
def setCell(self, cell):
|
||||
self.currentCell = cell
|
||||
11
BolonkinNM/core/search_stats.py
Normal file
11
BolonkinNM/core/search_stats.py
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
from dataclasses import dataclass, field
|
||||
|
||||
|
||||
@dataclass
|
||||
class SearchStats:
|
||||
timeMs: float
|
||||
visitedCells: int
|
||||
pathLength: int
|
||||
path: list = field(default_factory=list)
|
||||
found: bool = False
|
||||
algorithm: str = ""
|
||||
1
BolonkinNM/docs/README.txt
Normal file
1
BolonkinNM/docs/README.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
Place report files and experiment outputs here.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,109 +0,0 @@
|
|||
Структура,Режим,Операция,Замер,Время (сек)
|
||||
LinkedList,случайный,insert,1,4.2622492010
|
||||
LinkedList,случайный,find,1,0.0314994130
|
||||
LinkedList,случайный,delete,1,0.0149069000
|
||||
LinkedList,случайный,insert,2,4.0154580330
|
||||
LinkedList,случайный,find,2,0.0393284500
|
||||
LinkedList,случайный,delete,2,0.0210732100
|
||||
LinkedList,случайный,insert,3,4.0436019780
|
||||
LinkedList,случайный,find,3,0.0344933660
|
||||
LinkedList,случайный,delete,3,0.0152639850
|
||||
LinkedList,случайный,insert,4,3.7182993220
|
||||
LinkedList,случайный,find,4,0.0327698850
|
||||
LinkedList,случайный,delete,4,0.0149959540
|
||||
LinkedList,случайный,insert,5,3.7082228200
|
||||
LinkedList,случайный,find,5,0.0303762490
|
||||
LinkedList,случайный,delete,5,0.0141406560
|
||||
LinkedList,случайный,insert,среднее,3.9495662708
|
||||
LinkedList,случайный,find,среднее,0.0336934726
|
||||
LinkedList,случайный,delete,среднее,0.0160761410
|
||||
HashTable,случайный,insert,1,0.2059865770
|
||||
HashTable,случайный,find,1,0.0014966100
|
||||
HashTable,случайный,delete,1,0.0006891700
|
||||
HashTable,случайный,insert,2,0.2024331460
|
||||
HashTable,случайный,find,2,0.0015934880
|
||||
HashTable,случайный,delete,2,0.0007212620
|
||||
HashTable,случайный,insert,3,0.2126128040
|
||||
HashTable,случайный,find,3,0.0016566220
|
||||
HashTable,случайный,delete,3,0.0008358420
|
||||
HashTable,случайный,insert,4,0.2157934910
|
||||
HashTable,случайный,find,4,0.0015542810
|
||||
HashTable,случайный,delete,4,0.0007269120
|
||||
HashTable,случайный,insert,5,0.2079924580
|
||||
HashTable,случайный,find,5,0.0013696990
|
||||
HashTable,случайный,delete,5,0.0006616050
|
||||
HashTable,случайный,insert,среднее,0.2089636952
|
||||
HashTable,случайный,find,среднее,0.0015341400
|
||||
HashTable,случайный,delete,среднее,0.0007269582
|
||||
BST,случайный,insert,1,0.0166981280
|
||||
BST,случайный,find,1,0.0001569360
|
||||
BST,случайный,delete,1,0.0000917280
|
||||
BST,случайный,insert,2,0.0184119040
|
||||
BST,случайный,find,2,0.0001517110
|
||||
BST,случайный,delete,2,0.0001163770
|
||||
BST,случайный,insert,3,0.0174662270
|
||||
BST,случайный,find,3,0.0001582930
|
||||
BST,случайный,delete,3,0.0000892660
|
||||
BST,случайный,insert,4,0.0191369100
|
||||
BST,случайный,find,4,0.0002087170
|
||||
BST,случайный,delete,4,0.0001067050
|
||||
BST,случайный,insert,5,0.0184276900
|
||||
BST,случайный,find,5,0.0002767720
|
||||
BST,случайный,delete,5,0.0001067660
|
||||
BST,случайный,insert,среднее,0.0180281718
|
||||
BST,случайный,find,среднее,0.0001904858
|
||||
BST,случайный,delete,среднее,0.0001021684
|
||||
LinkedList,отсортированный,insert,1,2.9875078340
|
||||
LinkedList,отсортированный,find,1,0.0237300610
|
||||
LinkedList,отсортированный,delete,1,0.0111698260
|
||||
LinkedList,отсортированный,insert,2,3.0573987940
|
||||
LinkedList,отсортированный,find,2,0.0243270360
|
||||
LinkedList,отсортированный,delete,2,0.0115366030
|
||||
LinkedList,отсортированный,insert,3,2.9641987260
|
||||
LinkedList,отсортированный,find,3,0.0236313330
|
||||
LinkedList,отсортированный,delete,3,0.0112848510
|
||||
LinkedList,отсортированный,insert,4,3.0345914950
|
||||
LinkedList,отсортированный,find,4,0.0240271220
|
||||
LinkedList,отсортированный,delete,4,0.0112117310
|
||||
LinkedList,отсортированный,insert,5,2.9481954700
|
||||
LinkedList,отсортированный,find,5,0.0239006100
|
||||
LinkedList,отсортированный,delete,5,0.0110857710
|
||||
LinkedList,отсортированный,insert,среднее,2.9983784638
|
||||
LinkedList,отсортированный,find,среднее,0.0239232324
|
||||
LinkedList,отсортированный,delete,среднее,0.0112577564
|
||||
HashTable,отсортированный,insert,1,0.1997087560
|
||||
HashTable,отсортированный,find,1,0.0017550400
|
||||
HashTable,отсортированный,delete,1,0.0008407980
|
||||
HashTable,отсортированный,insert,2,0.1968675190
|
||||
HashTable,отсортированный,find,2,0.0019886760
|
||||
HashTable,отсортированный,delete,2,0.0008920910
|
||||
HashTable,отсортированный,insert,3,0.1907563580
|
||||
HashTable,отсортированный,find,3,0.0018447440
|
||||
HashTable,отсортированный,delete,3,0.0008684640
|
||||
HashTable,отсортированный,insert,4,0.2625327630
|
||||
HashTable,отсортированный,find,4,0.0016053140
|
||||
HashTable,отсортированный,delete,4,0.0008098670
|
||||
HashTable,отсортированный,insert,5,0.1936840590
|
||||
HashTable,отсортированный,find,5,0.0019015160
|
||||
HashTable,отсортированный,delete,5,0.0009053780
|
||||
HashTable,отсортированный,insert,среднее,0.2087098910
|
||||
HashTable,отсортированный,find,среднее,0.0018190580
|
||||
HashTable,отсортированный,delete,среднее,0.0008633196
|
||||
BST,отсортированный,insert,1,4.2195800190
|
||||
BST,отсортированный,find,1,0.0389314570
|
||||
BST,отсортированный,delete,1,0.0190308920
|
||||
BST,отсортированный,insert,2,4.1356184250
|
||||
BST,отсортированный,find,2,0.0383339310
|
||||
BST,отсортированный,delete,2,0.0194247740
|
||||
BST,отсортированный,insert,3,4.1204731890
|
||||
BST,отсортированный,find,3,0.0388593320
|
||||
BST,отсортированный,delete,3,0.0215428460
|
||||
BST,отсортированный,insert,4,4.2120902370
|
||||
BST,отсортированный,find,4,0.0378190250
|
||||
BST,отсортированный,delete,4,0.0188528460
|
||||
BST,отсортированный,insert,5,4.1304951260
|
||||
BST,отсортированный,find,5,0.0359927840
|
||||
BST,отсортированный,delete,5,0.0179617110
|
||||
BST,отсортированный,insert,среднее,4.1636513992
|
||||
BST,отсортированный,find,среднее,0.0379873058
|
||||
BST,отсортированный,delete,среднее,0.0193626138
|
||||
|
Gitea Version: 1.22.0 |
