feat: implement comparator
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
e327524d91
commit
6d804155e1
3 changed files with 156 additions and 0 deletions
62
comparator.html
Executable file
62
comparator.html
Executable file
|
@ -0,0 +1,62 @@
|
|||
<!DOCTYPE html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css?family=Open+Sans:600"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<link href="style.css" rel="stylesheet" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<form id="insertTree" onSubmit="return insertCallback()">
|
||||
<input
|
||||
id="insertInput"
|
||||
type="text"
|
||||
placeholder="Number to insert"
|
||||
maxlength="4"
|
||||
size="14"
|
||||
autofocus
|
||||
/>
|
||||
<input type="submit" value="Insert" />
|
||||
</form>
|
||||
<form id="deleteTree" onSubmit="return deleteCallback()">
|
||||
<input
|
||||
id="deleteInput"
|
||||
type="text"
|
||||
placeholder="Number to delete"
|
||||
maxlength="4"
|
||||
size="14"
|
||||
/>
|
||||
<input type="submit" value="Delete" />
|
||||
</form>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div id="left" style="text-align: center"></div>
|
||||
</td>
|
||||
<td>
|
||||
<div id="right" style="text-align: center"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
|
||||
|
||||
<script src="https://d3js.org/d3.v5.min.js"></script>
|
||||
<script src="https://unpkg.com/@hpcc-js/wasm@0.3.11/dist/index.min.js"></script>
|
||||
<script src="https://unpkg.com/d3-graphviz@3.0.5/build/d3-graphviz.js"></script>
|
||||
|
||||
<script src="utils.js"></script>
|
||||
|
||||
<script src="node.js"></script>
|
||||
<script src="ranked_tree.js"></script>
|
||||
<script src="avl.js"></script>
|
||||
<script src="wavl.js"></script>
|
||||
<script src="ravl.js"></script>
|
||||
|
||||
<script src="recorder.js"></script>
|
||||
<script src="comparator_visualization.js"></script>
|
||||
</body>
|
39
comparator.js
Normal file
39
comparator.js
Normal file
|
@ -0,0 +1,39 @@
|
|||
function nodesEquals(left, right, same) {
|
||||
same = same ?? true;
|
||||
|
||||
if (!left || !right) {
|
||||
return left === right;
|
||||
}
|
||||
|
||||
return (
|
||||
left.value === right.value &&
|
||||
(!same || left.rank === right.rank) &&
|
||||
nodesEquals(left.left, right.left, same) &&
|
||||
nodesEquals(left.right, right.right, same)
|
||||
);
|
||||
}
|
||||
|
||||
class Comparator {
|
||||
constructor(left, right) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
}
|
||||
|
||||
insert(value) {
|
||||
this.left.insert(value);
|
||||
this.right.insert(value);
|
||||
}
|
||||
|
||||
delete(value) {
|
||||
this.left.delete(value);
|
||||
this.right.delete(value);
|
||||
}
|
||||
|
||||
equals() {
|
||||
return nodesEquals(this.left.root, this.right.root);
|
||||
}
|
||||
|
||||
similar() {
|
||||
return nodesEquals(this.left.root, this.right.root, false);
|
||||
}
|
||||
}
|
55
comparator_visualization.js
Normal file
55
comparator_visualization.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
let lRecorder = new Recorder(
|
||||
d3.select("#left").graphviz(),
|
||||
"left"
|
||||
).renderAtOnce();
|
||||
let rRecorder = new Recorder(
|
||||
d3.select("#right").graphviz(),
|
||||
"right"
|
||||
).renderAtOnce();
|
||||
|
||||
let left = new AVLTree();
|
||||
let right = new WAVLTree();
|
||||
|
||||
left.recorder = lRecorder;
|
||||
right.recorder = rRecorder;
|
||||
|
||||
function insertCallback() {
|
||||
let number = document.getElementById("insertInput").value;
|
||||
if (number === "") {
|
||||
return false;
|
||||
}
|
||||
|
||||
let value = parseInt(number);
|
||||
|
||||
left.insert(value);
|
||||
right.insert(value);
|
||||
|
||||
document.getElementById("insertInput").value = "";
|
||||
return false;
|
||||
}
|
||||
|
||||
function deleteCallback() {
|
||||
let number = document.getElementById("deleteInput").value;
|
||||
if (number === "") {
|
||||
return false;
|
||||
}
|
||||
|
||||
let value = parseInt(number);
|
||||
|
||||
left.delete(value);
|
||||
right.delete(value);
|
||||
|
||||
document.getElementById("deleteInput").value = "";
|
||||
return false;
|
||||
}
|
||||
|
||||
async function render() {
|
||||
await Promise.all([
|
||||
new Promise(() => lRecorder.render()),
|
||||
new Promise(() => rRecorder.render()),
|
||||
]);
|
||||
// lRecorder.render();
|
||||
// rRecorder.render();
|
||||
setTimeout(render);
|
||||
}
|
||||
render();
|
Loading…
Reference in a new issue