Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
datovky
assignments
Commits
7e11e384
Commit
7e11e384
authored
Feb 22, 2022
by
David Mareček
Browse files
assignment 2
parent
a45b15de
Changes
9
Hide whitespace changes
Inline
Side-by-side
02-splay_operation/cpp/Makefile
0 → 100644
View file @
7e11e384
test
:
splay_operation_test
./
$<
CXXFLAGS
=
-std
=
c++11
-O2
-Wall
-Wextra
-g
-Wno-sign-compare
splay_operation_test
:
splay_operation.h splay_operation_test.cpp test_main.cpp
$(CXX)
$(CXXFLAGS)
$^
-o
$@
clean
::
rm
-f
splay_operation_test
.PHONY
:
clean test
02-splay_operation/cpp/splay_operation.h
0 → 100644
View file @
7e11e384
// A node of the tree
class
Node
{
public:
int
key
;
Node
*
left
;
Node
*
right
;
Node
*
parent
;
// Constructor
Node
(
int
key
,
Node
*
parent
=
nullptr
,
Node
*
left
=
nullptr
,
Node
*
right
=
nullptr
)
{
this
->
key
=
key
;
this
->
parent
=
parent
;
this
->
left
=
left
;
this
->
right
=
right
;
if
(
left
)
left
->
parent
=
this
;
if
(
right
)
right
->
parent
=
this
;
}
};
// Binary tree
class
Tree
{
public:
// Pointer to root of the tree; nullptr if the tree is empty.
Node
*
root
;
Tree
(
Node
*
root
=
nullptr
)
{
this
->
root
=
root
;
}
// Rotate the given `node` up. Perform a single rotation of the edge
// between the node and its parent, choosing left or right rotation
// appropriately.
virtual
void
rotate
(
Node
*
node
)
{
if
(
node
->
parent
)
{
if
(
node
->
parent
->
left
==
node
)
{
if
(
node
->
right
)
node
->
right
->
parent
=
node
->
parent
;
node
->
parent
->
left
=
node
->
right
;
node
->
right
=
node
->
parent
;
}
else
{
if
(
node
->
left
)
node
->
left
->
parent
=
node
->
parent
;
node
->
parent
->
right
=
node
->
left
;
node
->
left
=
node
->
parent
;
}
if
(
node
->
parent
->
parent
)
{
if
(
node
->
parent
->
parent
->
left
==
node
->
parent
)
node
->
parent
->
parent
->
left
=
node
;
else
node
->
parent
->
parent
->
right
=
node
;
}
else
{
root
=
node
;
}
Node
*
original_parent
=
node
->
parent
;
node
->
parent
=
node
->
parent
->
parent
;
original_parent
->
parent
=
node
;
}
}
// Look up the given key in the tree, returning the
// the node with the requested key or nullptr.
Node
*
lookup
(
int
key
)
{
// TODO: Utilize splay suitably.
Node
*
node
=
root
;
while
(
node
)
{
if
(
node
->
key
==
key
)
{
return
node
;
}
if
(
key
<
node
->
key
)
node
=
node
->
left
;
else
node
=
node
->
right
;
}
return
nullptr
;
}
// Insert a key into the tree.
// If the key is already present, nothing happens.
void
insert
(
int
key
)
{
// TODO: Utilize splay suitably.
if
(
!
root
)
{
root
=
new
Node
(
key
);
return
;
}
Node
*
node
=
root
;
while
(
node
->
key
!=
key
)
{
if
(
key
<
node
->
key
)
{
if
(
!
node
->
left
)
node
->
left
=
new
Node
(
key
,
node
);
node
=
node
->
left
;
}
else
{
if
(
!
node
->
right
)
node
->
right
=
new
Node
(
key
,
node
);
node
=
node
->
right
;
}
}
}
// Delete given key from the tree.
// It the key is not present, nothing happens.
void
remove
(
int
key
)
{
// TODO: Utilize splay suitably.
Node
*
node
=
root
;
while
(
node
&&
node
->
key
!=
key
)
{
if
(
key
<
node
->
key
)
node
=
node
->
left
;
else
node
=
node
->
right
;
}
if
(
node
)
{
if
(
node
->
left
&&
node
->
right
)
{
Node
*
replacement
=
node
->
right
;
while
(
replacement
->
left
)
replacement
=
replacement
->
left
;
node
->
key
=
replacement
->
key
;
node
=
replacement
;
}
Node
*
replacement
=
node
->
left
?
node
->
left
:
node
->
right
;
if
(
node
->
parent
)
{
if
(
node
->
parent
->
left
==
node
)
node
->
parent
->
left
=
replacement
;
else
node
->
parent
->
right
=
replacement
;
}
else
{
root
=
replacement
;
}
if
(
replacement
)
replacement
->
parent
=
node
->
parent
;
delete
node
;
}
}
// Splay the given node.
// If a single rotation needs to be performed, perform it as the last rotation
// (i.e., to move the splayed node to the root of the tree).
virtual
void
splay
(
Node
*
node
)
{
// TODO: Implement
}
// Destructor to free all allocated memory.
~
Tree
()
{
Node
*
node
=
root
;
while
(
node
)
{
Node
*
next
;
if
(
node
->
left
)
{
next
=
node
->
left
;
node
->
left
=
nullptr
;
}
else
if
(
node
->
right
)
{
next
=
node
->
right
;
node
->
right
=
nullptr
;
}
else
{
next
=
node
->
parent
;
delete
node
;
}
node
=
next
;
}
}
};
02-splay_operation/cpp/splay_operation_test.cpp
0 → 100644
View file @
7e11e384
#include <algorithm>
#include <cassert>
#include <fstream>
#include <functional>
#include <string>
#include <utility>
#include <vector>
#include "splay_operation.h"
using
namespace
std
;
// If the condition is not true, report an error and halt.
#define EXPECT(condition, message) do { if (!(condition)) expect_failed(message); } while (0)
void
expect_failed
(
const
string
&
message
);
// Flatten the tree: return a sorted list of all keys in the tree.
vector
<
int
>
flatten
(
const
Tree
&
tree
)
{
constexpr
int
L
=
0
,
R
=
1
,
F
=
2
;
Node
*
node
=
tree
.
root
;
vector
<
int
>
flattened
,
stack
=
{
L
};
while
(
!
stack
.
empty
())
{
if
(
stack
.
back
()
==
L
)
{
stack
.
back
()
=
R
;
if
(
node
->
left
)
{
node
=
node
->
left
;
stack
.
push_back
(
L
);
}
}
else
if
(
stack
.
back
()
==
R
)
{
flattened
.
push_back
(
node
->
key
);
stack
.
back
()
=
F
;
if
(
node
->
right
)
{
node
=
node
->
right
;
stack
.
push_back
(
L
);
}
}
else
{
node
=
node
->
parent
;
stack
.
pop_back
();
}
}
return
flattened
;
}
// Test for splay operation with required helpers
class
TestSplay
{
public:
static
Node
*
deserialize_node
(
const
string
&
text
,
int
&
index
)
{
EXPECT
(
text
[
index
++
]
==
'('
,
"Internal error during example deserialization"
);
if
(
text
[
index
]
==
')'
)
{
index
++
;
return
nullptr
;
}
else
{
int
comma
=
text
.
find
(
','
,
index
);
int
key
=
stoi
(
text
.
substr
(
index
,
comma
-
index
));
Node
*
left
=
deserialize_node
(
text
,
(
index
=
comma
+
1
));
Node
*
right
=
deserialize_node
(
text
,
++
index
);
EXPECT
(
text
[
index
++
]
==
')'
,
"Internal error during example deserialization"
);
return
new
Node
(
key
,
nullptr
,
left
,
right
);
}
}
static
Node
*
deserialize_root
(
const
string
&
text
)
{
int
index
=
0
;
Node
*
root
=
deserialize_node
(
text
,
index
);
assert
(
index
==
text
.
size
());
return
root
;
}
static
string
compare
(
Node
*
system
,
Node
*
gold
)
{
if
(
!
system
&&
gold
)
{
return
"expected node with key "
+
to_string
(
gold
->
key
)
+
", found None"
;
}
else
if
(
system
&&
!
gold
)
{
return
"expected None, found node with key "
+
to_string
(
system
->
key
);
}
else
if
(
system
&&
gold
)
{
if
(
system
->
key
!=
gold
->
key
)
return
"expected node with key "
+
to_string
(
gold
->
key
)
+
", found "
+
to_string
(
system
->
key
);
auto
result
=
compare
(
system
->
left
,
gold
->
left
);
if
(
!
result
.
empty
())
return
result
;
return
compare
(
system
->
right
,
gold
->
right
);
}
return
string
();
}
static
void
test
()
{
ifstream
splay_tests_file
(
"splay_tests.txt"
);
EXPECT
(
splay_tests_file
.
is_open
(),
"Cannot open splay_tests.txt file with the tests"
);
string
original
,
splayed
;
int
target
;
while
(
splay_tests_file
>>
original
>>
target
>>
splayed
)
{
Tree
original_tree
(
deserialize_root
(
original
));
Tree
splayed_tree
(
deserialize_root
(
splayed
));
Node
*
target_node
=
original_tree
.
root
;
while
(
target_node
&&
target_node
->
key
!=
target
)
if
(
target
<
target_node
->
key
)
target_node
=
target_node
->
left
;
else
target_node
=
target_node
->
right
;
EXPECT
(
target_node
,
"Internal error during finding the target node in the tree to splay"
);
original_tree
.
splay
(
target_node
);
auto
error
=
compare
(
original_tree
.
root
,
splayed_tree
.
root
);
EXPECT
(
error
.
empty
(),
"Error running splay on key "
+
to_string
(
target
)
+
" of "
+
original
+
": "
+
error
);
}
}
};
void
test_lookup
()
{
// Insert even numbers
Tree
tree
;
for
(
int
i
=
0
;
i
<
5000000
;
i
+=
2
)
tree
.
insert
(
i
);
// Find non-existing
for
(
int
i
=
1
;
i
<
5000000
;
i
+=
2
)
for
(
int
j
=
0
;
j
<
10
;
j
++
)
EXPECT
(
!
tree
.
lookup
(
i
),
"Non-existing element was found"
);
// Find existing
for
(
int
i
=
0
;
i
<
5000000
;
i
+=
2
)
for
(
int
j
=
0
;
j
<
10
;
j
++
)
EXPECT
(
tree
.
lookup
(
i
),
"Existing element was not found"
);
}
void
test_insert
()
{
// Test validity first
{
Tree
tree
;
vector
<
int
>
sequence
=
{
997
};
for
(
int
i
=
2
;
i
<
1999
;
i
++
)
sequence
.
push_back
((
sequence
.
back
()
*
sequence
.
front
())
%
1999
);
for
(
const
auto
&
i
:
sequence
)
tree
.
insert
(
i
);
vector
<
int
>
flattened
=
flatten
(
tree
);
sort
(
sequence
.
begin
(),
sequence
.
end
());
EXPECT
(
flattened
==
sequence
,
"Incorrect tree after a sequence of inserts"
);
}
// Test speed
{
Tree
tree
;
for
(
int
i
=
0
;
i
<
5000000
;
i
++
)
for
(
int
j
=
0
;
j
<
10
;
j
++
)
tree
.
insert
(
i
);
}
}
void
test_remove
()
{
// Test validity first
{
Tree
tree
;
for
(
int
i
=
2
;
i
<
1999
*
2
;
i
++
)
tree
.
insert
(
i
);
vector
<
int
>
sequence
=
{
2
*
997
};
for
(
int
i
=
2
;
i
<
1999
;
i
++
)
sequence
.
push_back
(
2
*
((
sequence
.
back
()
*
sequence
.
front
()
/
4
)
%
1999
));
for
(
const
auto
&
i
:
sequence
)
tree
.
remove
(
i
+
1
);
vector
<
int
>
flattened
=
flatten
(
tree
);
sort
(
sequence
.
begin
(),
sequence
.
end
());
EXPECT
(
flattened
==
sequence
,
"Correct tree after a sequence of removes"
);
}
// Test speed
{
Tree
tree
;
for
(
int
i
=
0
;
i
<
5000000
;
i
++
)
tree
.
insert
(
i
);
// Non-existing elements
for
(
int
i
=
1
;
i
<
5000000
;
i
+=
2
)
for
(
int
j
=
0
;
j
<
10
;
j
++
)
tree
.
remove
(
i
);
// Existing elements
for
(
int
i
=
2
;
i
<
5000000
;
i
+=
2
)
for
(
int
j
=
0
;
j
<
10
;
j
++
)
tree
.
remove
(
i
);
}
}
vector
<
pair
<
string
,
function
<
void
()
>>>
tests
=
{
{
"splay"
,
TestSplay
::
test
},
{
"lookup"
,
test_lookup
},
{
"insert"
,
test_insert
},
{
"remove"
,
test_remove
},
};
02-splay_operation/cpp/splay_tests.txt
0 → 100644
View file @
7e11e384
(3,(1,(0,(),()),(2,(),())),(4,(),())) 4 (4,(3,(1,(0,(),()),(2,(),())),()),())
(6,(5,(),()),(8,(7,(),()),(9,(),()))) 5 (5,(),(6,(),(8,(7,(),()),(9,(),()))))
(3,(1,(0,(),()),(2,(),())),(7,(5,(4,(),()),(6,(),())),(8,(),()))) 8 (8,(7,(3,(1,(0,(),()),(2,(),())),(5,(4,(),()),(6,(),()))),()),())
(11,(9,(7,(6,(),()),(8,(),())),(10,(),())),(13,(12,(),()),(14,(),()))) 10 (10,(9,(7,(6,(),()),(8,(),())),()),(11,(),(13,(12,(),()),(14,(),()))))
(8,(6,(5,(),()),(7,(),())),(10,(9,(),()),(12,(11,(),()),(13,(),())))) 9 (9,(8,(6,(5,(),()),(7,(),())),()),(10,(),(12,(11,(),()),(13,(),()))))
(16,(12,(11,(),()),(14,(13,(),()),(15,(),()))),(18,(17,(),()),(19,(),()))) 11 (11,(),(12,(),(16,(14,(13,(),()),(15,(),())),(18,(17,(),()),(19,(),())))))
(3,(1,(0,(),()),(2,(),())),(7,(5,(4,(),()),(6,(),())),(11,(9,(8,(),()),(10,(),())),(12,(),())))) 12 (12,(3,(1,(0,(),()),(2,(),())),(11,(7,(5,(4,(),()),(6,(),())),(9,(8,(),()),(10,(),()))),())),())
(17,(11,(9,(8,(),()),(10,(),())),(15,(13,(12,(),()),(14,(),())),(16,(),()))),(19,(18,(),()),(20,(),()))) 16 (16,(15,(11,(9,(8,(),()),(10,(),())),(13,(12,(),()),(14,(),()))),()),(17,(),(19,(18,(),()),(20,(),()))))
(9,(7,(6,(),()),(8,(),())),(15,(13,(11,(10,(),()),(12,(),())),(14,(),())),(17,(16,(),()),(18,(),())))) 14 (14,(9,(7,(6,(),()),(8,(),())),(13,(11,(10,(),()),(12,(),())),())),(15,(),(17,(16,(),()),(18,(),()))))
(23,(19,(17,(15,(14,(),()),(16,(),())),(18,(),())),(21,(20,(),()),(22,(),()))),(25,(24,(),()),(26,(),()))) 18 (18,(17,(15,(14,(),()),(16,(),())),()),(23,(19,(),(21,(20,(),()),(22,(),()))),(25,(24,(),()),(26,(),()))))
(8,(6,(5,(),()),(7,(),())),(12,(10,(9,(),()),(11,(),())),(14,(13,(),()),(16,(15,(),()),(17,(),()))))) 13 (13,(8,(6,(5,(),()),(7,(),())),(12,(10,(9,(),()),(11,(),())),())),(14,(),(16,(15,(),()),(17,(),()))))
(22,(16,(14,(13,(),()),(15,(),())),(18,(17,(),()),(20,(19,(),()),(21,(),())))),(24,(23,(),()),(25,(),()))) 17 (17,(16,(14,(13,(),()),(15,(),())),()),(22,(18,(),(20,(19,(),()),(21,(),()))),(24,(23,(),()),(25,(),()))))
(14,(12,(11,(),()),(13,(),())),(20,(16,(15,(),()),(18,(17,(),()),(19,(),()))),(22,(21,(),()),(23,(),())))) 15 (15,(14,(12,(11,(),()),(13,(),())),()),(16,(),(20,(18,(17,(),()),(19,(),())),(22,(21,(),()),(23,(),())))))
(28,(24,(20,(19,(),()),(22,(21,(),()),(23,(),()))),(26,(25,(),()),(27,(),()))),(30,(29,(),()),(31,(),()))) 19 (19,(),(28,(20,(),(24,(22,(21,(),()),(23,(),())),(26,(25,(),()),(27,(),())))),(30,(29,(),()),(31,(),()))))
(3,(1,(0,(),()),(2,(),())),(7,(5,(4,(),()),(6,(),())),(11,(9,(8,(),()),(10,(),())),(15,(13,(12,(),()),(14,(),())),(16,(),()))))) 16 (16,(7,(3,(1,(0,(),()),(2,(),())),(5,(4,(),()),(6,(),()))),(15,(11,(9,(8,(),()),(10,(),())),(13,(12,(),()),(14,(),()))),())),())
(25,(15,(13,(12,(),()),(14,(),())),(19,(17,(16,(),()),(18,(),())),(23,(21,(20,(),()),(22,(),())),(24,(),())))),(27,(26,(),()),(28,(),()))) 24 (24,(15,(13,(12,(),()),(14,(),())),(23,(19,(17,(16,(),()),(18,(),())),(21,(20,(),()),(22,(),()))),())),(25,(),(27,(26,(),()),(28,(),()))))
(11,(9,(8,(),()),(10,(),())),(21,(15,(13,(12,(),()),(14,(),())),(19,(17,(16,(),()),(18,(),())),(20,(),()))),(23,(22,(),()),(24,(),())))) 20 (20,(11,(9,(8,(),()),(10,(),())),(19,(15,(13,(12,(),()),(14,(),())),(17,(16,(),()),(18,(),()))),())),(21,(),(23,(22,(),()),(24,(),()))))
(33,(29,(23,(21,(20,(),()),(22,(),())),(27,(25,(24,(),()),(26,(),())),(28,(),()))),(31,(30,(),()),(32,(),()))),(35,(34,(),()),(36,(),()))) 28 (28,(27,(23,(21,(20,(),()),(22,(),())),(25,(24,(),()),(26,(),()))),()),(29,(),(33,(31,(30,(),()),(32,(),())),(35,(34,(),()),(36,(),())))))
(9,(7,(6,(),()),(8,(),())),(13,(11,(10,(),()),(12,(),())),(19,(17,(15,(14,(),()),(16,(),())),(18,(),())),(21,(20,(),()),(22,(),()))))) 18 (18,(13,(9,(7,(6,(),()),(8,(),())),(11,(10,(),()),(12,(),()))),(17,(15,(14,(),()),(16,(),())),())),(19,(),(21,(20,(),()),(22,(),()))))
(31,(21,(19,(18,(),()),(20,(),())),(27,(25,(23,(22,(),()),(24,(),())),(26,(),())),(29,(28,(),()),(30,(),())))),(33,(32,(),()),(34,(),()))) 26 (26,(21,(19,(18,(),()),(20,(),())),(25,(23,(22,(),()),(24,(),())),())),(31,(27,(),(29,(28,(),()),(30,(),()))),(33,(32,(),()),(34,(),()))))
(17,(15,(14,(),()),(16,(),())),(27,(23,(21,(19,(18,(),()),(20,(),())),(22,(),())),(25,(24,(),()),(26,(),()))),(29,(28,(),()),(30,(),())))) 22 (22,(17,(15,(14,(),()),(16,(),())),(21,(19,(18,(),()),(20,(),())),())),(27,(23,(),(25,(24,(),()),(26,(),()))),(29,(28,(),()),(30,(),()))))
(39,(35,(31,(29,(27,(26,(),()),(28,(),())),(30,(),())),(33,(32,(),()),(34,(),()))),(37,(36,(),()),(38,(),()))),(41,(40,(),()),(42,(),()))) 30 (30,(29,(27,(26,(),()),(28,(),())),()),(35,(31,(),(33,(32,(),()),(34,(),()))),(39,(37,(36,(),()),(38,(),())),(41,(40,(),()),(42,(),())))))
(8,(6,(5,(),()),(7,(),())),(12,(10,(9,(),()),(11,(),())),(16,(14,(13,(),()),(15,(),())),(18,(17,(),()),(20,(19,(),()),(21,(),())))))) 17 (17,(12,(8,(6,(5,(),()),(7,(),())),(10,(9,(),()),(11,(),()))),(16,(14,(13,(),()),(15,(),())),())),(18,(),(20,(19,(),()),(21,(),()))))
(30,(20,(18,(17,(),()),(19,(),())),(24,(22,(21,(),()),(23,(),())),(26,(25,(),()),(28,(27,(),()),(29,(),()))))),(32,(31,(),()),(33,(),()))) 25 (25,(20,(18,(17,(),()),(19,(),())),(24,(22,(21,(),()),(23,(),())),())),(30,(26,(),(28,(27,(),()),(29,(),()))),(32,(31,(),()),(33,(),()))))
(16,(14,(13,(),()),(15,(),())),(26,(20,(18,(17,(),()),(19,(),())),(22,(21,(),()),(24,(23,(),()),(25,(),())))),(28,(27,(),()),(29,(),())))) 21 (21,(16,(14,(13,(),()),(15,(),())),(20,(18,(17,(),()),(19,(),())),())),(26,(22,(),(24,(23,(),()),(25,(),()))),(28,(27,(),()),(29,(),()))))
(38,(34,(28,(26,(25,(),()),(27,(),())),(30,(29,(),()),(32,(31,(),()),(33,(),())))),(36,(35,(),()),(37,(),()))),(40,(39,(),()),(41,(),()))) 29 (29,(28,(26,(25,(),()),(27,(),())),()),(34,(30,(),(32,(31,(),()),(33,(),()))),(38,(36,(35,(),()),(37,(),())),(40,(39,(),()),(41,(),())))))
(14,(12,(11,(),()),(13,(),())),(18,(16,(15,(),()),(17,(),())),(24,(20,(19,(),()),(22,(21,(),()),(23,(),()))),(26,(25,(),()),(27,(),()))))) 19 (19,(18,(14,(12,(11,(),()),(13,(),())),(16,(15,(),()),(17,(),()))),()),(20,(),(24,(22,(21,(),()),(23,(),())),(26,(25,(),()),(27,(),())))))
(36,(26,(24,(23,(),()),(25,(),())),(32,(28,(27,(),()),(30,(29,(),()),(31,(),()))),(34,(33,(),()),(35,(),())))),(38,(37,(),()),(39,(),()))) 27 (27,(26,(24,(23,(),()),(25,(),())),()),(36,(28,(),(32,(30,(29,(),()),(31,(),())),(34,(33,(),()),(35,(),())))),(38,(37,(),()),(39,(),()))))
(22,(20,(19,(),()),(21,(),())),(32,(28,(24,(23,(),()),(26,(25,(),()),(27,(),()))),(30,(29,(),()),(31,(),()))),(34,(33,(),()),(35,(),())))) 23 (23,(22,(20,(19,(),()),(21,(),())),()),(32,(24,(),(28,(26,(25,(),()),(27,(),())),(30,(29,(),()),(31,(),())))),(34,(33,(),()),(35,(),()))))
(44,(40,(36,(32,(31,(),()),(34,(33,(),()),(35,(),()))),(38,(37,(),()),(39,(),()))),(42,(41,(),()),(43,(),()))),(46,(45,(),()),(47,(),()))) 31 (31,(),(40,(32,(),(36,(34,(33,(),()),(35,(),())),(38,(37,(),()),(39,(),())))),(44,(42,(41,(),()),(43,(),())),(46,(45,(),()),(47,(),())))))
(3,(1,(0,(),()),(2,(),())),(7,(5,(4,(),()),(6,(),())),(11,(9,(8,(),()),(10,(),())),(15,(13,(12,(),()),(14,(),())),(19,(17,(16,(),()),(18,(),())),(20,(),())))))) 20 (20,(3,(1,(0,(),()),(2,(),())),(11,(7,(5,(4,(),()),(6,(),())),(9,(8,(),()),(10,(),()))),(19,(15,(13,(12,(),()),(14,(),())),(17,(16,(),()),(18,(),()))),()))),())
(37,(23,(21,(20,(),()),(22,(),())),(27,(25,(24,(),()),(26,(),())),(31,(29,(28,(),()),(30,(),())),(35,(33,(32,(),()),(34,(),())),(36,(),()))))),(39,(38,(),()),(40,(),()))) 36 (36,(27,(23,(21,(20,(),()),(22,(),())),(25,(24,(),()),(26,(),()))),(35,(31,(29,(28,(),()),(30,(),())),(33,(32,(),()),(34,(),()))),())),(37,(),(39,(38,(),()),(40,(),()))))
(15,(13,(12,(),()),(14,(),())),(29,(19,(17,(16,(),()),(18,(),())),(23,(21,(20,(),()),(22,(),())),(27,(25,(24,(),()),(26,(),())),(28,(),())))),(31,(30,(),()),(32,(),())))) 28 (28,(15,(13,(12,(),()),(14,(),())),(19,(17,(16,(),()),(18,(),())),(27,(23,(21,(20,(),()),(22,(),())),(25,(24,(),()),(26,(),()))),()))),(29,(),(31,(30,(),()),(32,(),()))))
(49,(45,(35,(33,(32,(),()),(34,(),())),(39,(37,(36,(),()),(38,(),())),(43,(41,(40,(),()),(42,(),())),(44,(),())))),(47,(46,(),()),(48,(),()))),(51,(50,(),()),(52,(),()))) 44 (44,(35,(33,(32,(),()),(34,(),())),(43,(39,(37,(36,(),()),(38,(),())),(41,(40,(),()),(42,(),()))),())),(49,(45,(),(47,(46,(),()),(48,(),()))),(51,(50,(),()),(52,(),()))))
(11,(9,(8,(),()),(10,(),())),(15,(13,(12,(),()),(14,(),())),(25,(19,(17,(16,(),()),(18,(),())),(23,(21,(20,(),()),(22,(),())),(24,(),()))),(27,(26,(),()),(28,(),()))))) 24 (24,(11,(9,(8,(),()),(10,(),())),(15,(13,(12,(),()),(14,(),())),(23,(19,(17,(16,(),()),(18,(),())),(21,(20,(),()),(22,(),()))),()))),(25,(),(27,(26,(),()),(28,(),()))))
(45,(31,(29,(28,(),()),(30,(),())),(41,(35,(33,(32,(),()),(34,(),())),(39,(37,(36,(),()),(38,(),())),(40,(),()))),(43,(42,(),()),(44,(),())))),(47,(46,(),()),(48,(),()))) 40 (40,(31,(29,(28,(),()),(30,(),())),(39,(35,(33,(32,(),()),(34,(),())),(37,(36,(),()),(38,(),()))),())),(45,(41,(),(43,(42,(),()),(44,(),()))),(47,(46,(),()),(48,(),()))))
(23,(21,(20,(),()),(22,(),())),(37,(33,(27,(25,(24,(),()),(26,(),())),(31,(29,(28,(),()),(30,(),())),(32,(),()))),(35,(34,(),()),(36,(),()))),(39,(38,(),()),(40,(),())))) 32 (32,(23,(21,(20,(),()),(22,(),())),(31,(27,(25,(24,(),()),(26,(),())),(29,(28,(),()),(30,(),()))),())),(33,(),(37,(35,(34,(),()),(36,(),())),(39,(38,(),()),(40,(),())))))
(57,(53,(49,(43,(41,(40,(),()),(42,(),())),(47,(45,(44,(),()),(46,(),())),(48,(),()))),(51,(50,(),()),(52,(),()))),(55,(54,(),()),(56,(),()))),(59,(58,(),()),(60,(),()))) 48 (48,(47,(43,(41,(40,(),()),(42,(),())),(45,(44,(),()),(46,(),()))),()),(57,(49,(),(53,(51,(50,(),()),(52,(),())),(55,(54,(),()),(56,(),())))),(59,(58,(),()),(60,(),()))))
(9,(7,(6,(),()),(8,(),())),(13,(11,(10,(),()),(12,(),())),(17,(15,(14,(),()),(16,(),())),(23,(21,(19,(18,(),()),(20,(),())),(22,(),())),(25,(24,(),()),(26,(),())))))) 22 (22,(9,(7,(6,(),()),(8,(),())),(17,(13,(11,(10,(),()),(12,(),())),(15,(14,(),()),(16,(),()))),(21,(19,(18,(),()),(20,(),())),()))),(23,(),(25,(24,(),()),(26,(),()))))
(43,(29,(27,(26,(),()),(28,(),())),(33,(31,(30,(),()),(32,(),())),(39,(37,(35,(34,(),()),(36,(),())),(38,(),())),(41,(40,(),()),(42,(),()))))),(45,(44,(),()),(46,(),()))) 38 (38,(33,(29,(27,(26,(),()),(28,(),())),(31,(30,(),()),(32,(),()))),(37,(35,(34,(),()),(36,(),())),())),(43,(39,(),(41,(40,(),()),(42,(),()))),(45,(44,(),()),(46,(),()))))
(21,(19,(18,(),()),(20,(),())),(35,(25,(23,(22,(),()),(24,(),())),(31,(29,(27,(26,(),()),(28,(),())),(30,(),())),(33,(32,(),()),(34,(),())))),(37,(36,(),()),(38,(),())))) 30 (30,(21,(19,(18,(),()),(20,(),())),(25,(23,(22,(),()),(24,(),())),(29,(27,(26,(),()),(28,(),())),()))),(35,(31,(),(33,(32,(),()),(34,(),()))),(37,(36,(),()),(38,(),()))))
(55,(51,(41,(39,(38,(),()),(40,(),())),(47,(45,(43,(42,(),()),(44,(),())),(46,(),())),(49,(48,(),()),(50,(),())))),(53,(52,(),()),(54,(),()))),(57,(56,(),()),(58,(),()))) 46 (46,(41,(39,(38,(),()),(40,(),())),(45,(43,(42,(),()),(44,(),())),())),(55,(51,(47,(),(49,(48,(),()),(50,(),()))),(53,(52,(),()),(54,(),()))),(57,(56,(),()),(58,(),()))))
(17,(15,(14,(),()),(16,(),())),(21,(19,(18,(),()),(20,(),())),(31,(27,(25,(23,(22,(),()),(24,(),())),(26,(),())),(29,(28,(),()),(30,(),()))),(33,(32,(),()),(34,(),()))))) 26 (26,(17,(15,(14,(),()),(16,(),())),(21,(19,(18,(),()),(20,(),())),(25,(23,(22,(),()),(24,(),())),()))),(31,(27,(),(29,(28,(),()),(30,(),()))),(33,(32,(),()),(34,(),()))))
(51,(37,(35,(34,(),()),(36,(),())),(47,(43,(41,(39,(38,(),()),(40,(),())),(42,(),())),(45,(44,(),()),(46,(),()))),(49,(48,(),()),(50,(),())))),(53,(52,(),()),(54,(),()))) 42 (42,(37,(35,(34,(),()),(36,(),())),(41,(39,(38,(),()),(40,(),())),())),(51,(47,(43,(),(45,(44,(),()),(46,(),()))),(49,(48,(),()),(50,(),()))),(53,(52,(),()),(54,(),()))))
(29,(27,(26,(),()),(28,(),())),(43,(39,(35,(33,(31,(30,(),()),(32,(),())),(34,(),())),(37,(36,(),()),(38,(),()))),(41,(40,(),()),(42,(),()))),(45,(44,(),()),(46,(),())))) 34 (34,(29,(27,(26,(),()),(28,(),())),(33,(31,(30,(),()),(32,(),())),())),(39,(35,(),(37,(36,(),()),(38,(),()))),(43,(41,(40,(),()),(42,(),())),(45,(44,(),()),(46,(),())))))
(63,(59,(55,(51,(49,(47,(46,(),()),(48,(),())),(50,(),())),(53,(52,(),()),(54,(),()))),(57,(56,(),()),(58,(),()))),(61,(60,(),()),(62,(),()))),(65,(64,(),()),(66,(),()))) 50 (50,(49,(47,(46,(),()),(48,(),())),()),(63,(55,(51,(),(53,(52,(),()),(54,(),()))),(59,(57,(56,(),()),(58,(),())),(61,(60,(),()),(62,(),())))),(65,(64,(),()),(66,(),()))))
(8,(6,(5,(),()),(7,(),())),(12,(10,(9,(),()),(11,(),())),(16,(14,(13,(),()),(15,(),())),(20,(18,(17,(),()),(19,(),())),(22,(21,(),()),(24,(23,(),()),(25,(),()))))))) 21 (21,(8,(6,(5,(),()),(7,(),())),(16,(12,(10,(9,(),()),(11,(),())),(14,(13,(),()),(15,(),()))),(20,(18,(17,(),()),(19,(),())),()))),(22,(),(24,(23,(),()),(25,(),()))))
(42,(28,(26,(25,(),()),(27,(),())),(32,(30,(29,(),()),(31,(),())),(36,(34,(33,(),()),(35,(),())),(38,(37,(),()),(40,(39,(),()),(41,(),())))))),(44,(43,(),()),(45,(),()))) 37 (37,(32,(28,(26,(25,(),()),(27,(),())),(30,(29,(),()),(31,(),()))),(36,(34,(33,(),()),(35,(),())),())),(42,(38,(),(40,(39,(),()),(41,(),()))),(44,(43,(),()),(45,(),()))))
(20,(18,(17,(),()),(19,(),())),(34,(24,(22,(21,(),()),(23,(),())),(28,(26,(25,(),()),(27,(),())),(30,(29,(),()),(32,(31,(),()),(33,(),()))))),(36,(35,(),()),(37,(),())))) 29 (29,(20,(18,(17,(),()),(19,(),())),(24,(22,(21,(),()),(23,(),())),(28,(26,(25,(),()),(27,(),())),()))),(34,(30,(),(32,(31,(),()),(33,(),()))),(36,(35,(),()),(37,(),()))))
(54,(50,(40,(38,(37,(),()),(39,(),())),(44,(42,(41,(),()),(43,(),())),(46,(45,(),()),(48,(47,(),()),(49,(),()))))),(52,(51,(),()),(53,(),()))),(56,(55,(),()),(57,(),()))) 45 (45,(40,(38,(37,(),()),(39,(),())),(44,(42,(41,(),()),(43,(),())),())),(54,(50,(46,(),(48,(47,(),()),(49,(),()))),(52,(51,(),()),(53,(),()))),(56,(55,(),()),(57,(),()))))
(16,(14,(13,(),()),(15,(),())),(20,(18,(17,(),()),(19,(),())),(30,(24,(22,(21,(),()),(23,(),())),(26,(25,(),()),(28,(27,(),()),(29,(),())))),(32,(31,(),()),(33,(),()))))) 25 (25,(16,(14,(13,(),()),(15,(),())),(20,(18,(17,(),()),(19,(),())),(24,(22,(21,(),()),(23,(),())),()))),(30,(26,(),(28,(27,(),()),(29,(),()))),(32,(31,(),()),(33,(),()))))
(50,(36,(34,(33,(),()),(35,(),())),(46,(40,(38,(37,(),()),(39,(),())),(42,(41,(),()),(44,(43,(),()),(45,(),())))),(48,(47,(),()),(49,(),())))),(52,(51,(),()),(53,(),()))) 41 (41,(36,(34,(33,(),()),(35,(),())),(40,(38,(37,(),()),(39,(),())),())),(50,(46,(42,(),(44,(43,(),()),(45,(),()))),(48,(47,(),()),(49,(),()))),(52,(51,(),()),(53,(),()))))
(28,(26,(25,(),()),(27,(),())),(42,(38,(32,(30,(29,(),()),(31,(),())),(34,(33,(),()),(36,(35,(),()),(37,(),())))),(40,(39,(),()),(41,(),()))),(44,(43,(),()),(45,(),())))) 33 (33,(28,(26,(25,(),()),(27,(),())),(32,(30,(29,(),()),(31,(),())),())),(38,(34,(),(36,(35,(),()),(37,(),()))),(42,(40,(39,(),()),(41,(),())),(44,(43,(),()),(45,(),())))))
(62,(58,(54,(48,(46,(45,(),()),(47,(),())),(50,(49,(),()),(52,(51,(),()),(53,(),())))),(56,(55,(),()),(57,(),()))),(60,(59,(),()),(61,(),()))),(64,(63,(),()),(65,(),()))) 49 (49,(48,(46,(45,(),()),(47,(),())),()),(62,(54,(50,(),(52,(51,(),()),(53,(),()))),(58,(56,(55,(),()),(57,(),())),(60,(59,(),()),(61,(),())))),(64,(63,(),()),(65,(),()))))
(14,(12,(11,(),()),(13,(),())),(18,(16,(15,(),()),(17,(),())),(22,(20,(19,(),()),(21,(),())),(28,(24,(23,(),()),(26,(25,(),()),(27,(),()))),(30,(29,(),()),(31,(),())))))) 23 (23,(14,(12,(11,(),()),(13,(),())),(22,(18,(16,(15,(),()),(17,(),())),(20,(19,(),()),(21,(),()))),())),(24,(),(28,(26,(25,(),()),(27,(),())),(30,(29,(),()),(31,(),())))))
(48,(34,(32,(31,(),()),(33,(),())),(38,(36,(35,(),()),(37,(),())),(44,(40,(39,(),()),(42,(41,(),()),(43,(),()))),(46,(45,(),()),(47,(),()))))),(50,(49,(),()),(51,(),()))) 39 (39,(38,(34,(32,(31,(),()),(33,(),())),(36,(35,(),()),(37,(),()))),()),(48,(40,(),(44,(42,(41,(),()),(43,(),())),(46,(45,(),()),(47,(),())))),(50,(49,(),()),(51,(),()))))
(26,(24,(23,(),()),(25,(),())),(40,(30,(28,(27,(),()),(29,(),())),(36,(32,(31,(),()),(34,(33,(),()),(35,(),()))),(38,(37,(),()),(39,(),())))),(42,(41,(),()),(43,(),())))) 31 (31,(26,(24,(23,(),()),(25,(),())),(30,(28,(27,(),()),(29,(),())),())),(40,(32,(),(36,(34,(33,(),()),(35,(),())),(38,(37,(),()),(39,(),())))),(42,(41,(),()),(43,(),()))))
(60,(56,(46,(44,(43,(),()),(45,(),())),(52,(48,(47,(),()),(50,(49,(),()),(51,(),()))),(54,(53,(),()),(55,(),())))),(58,(57,(),()),(59,(),()))),(62,(61,(),()),(63,(),()))) 47 (47,(46,(44,(43,(),()),(45,(),())),()),(60,(56,(48,(),(52,(50,(49,(),()),(51,(),())),(54,(53,(),()),(55,(),())))),(58,(57,(),()),(59,(),()))),(62,(61,(),()),(63,(),()))))
(22,(20,(19,(),()),(21,(),())),(26,(24,(23,(),()),(25,(),())),(36,(32,(28,(27,(),()),(30,(29,(),()),(31,(),()))),(34,(33,(),()),(35,(),()))),(38,(37,(),()),(39,(),()))))) 27 (27,(22,(20,(19,(),()),(21,(),())),(26,(24,(23,(),()),(25,(),())),())),(36,(28,(),(32,(30,(29,(),()),(31,(),())),(34,(33,(),()),(35,(),())))),(38,(37,(),()),(39,(),()))))
(56,(42,(40,(39,(),()),(41,(),())),(52,(48,(44,(43,(),()),(46,(45,(),()),(47,(),()))),(50,(49,(),()),(51,(),()))),(54,(53,(),()),(55,(),())))),(58,(57,(),()),(59,(),()))) 43 (43,(42,(40,(39,(),()),(41,(),())),()),(56,(52,(44,(),(48,(46,(45,(),()),(47,(),())),(50,(49,(),()),(51,(),())))),(54,(53,(),()),(55,(),()))),(58,(57,(),()),(59,(),()))))
(34,(32,(31,(),()),(33,(),())),(48,(44,(40,(36,(35,(),()),(38,(37,(),()),(39,(),()))),(42,(41,(),()),(43,(),()))),(46,(45,(),()),(47,(),()))),(50,(49,(),()),(51,(),())))) 35 (35,(34,(32,(31,(),()),(33,(),())),()),(44,(36,(),(40,(38,(37,(),()),(39,(),())),(42,(41,(),()),(43,(),())))),(48,(46,(45,(),()),(47,(),())),(50,(49,(),()),(51,(),())))))
(68,(64,(60,(56,(52,(51,(),()),(54,(53,(),()),(55,(),()))),(58,(57,(),()),(59,(),()))),(62,(61,(),()),(63,(),()))),(66,(65,(),()),(67,(),()))),(70,(69,(),()),(71,(),()))) 51 (51,(),(68,(60,(52,(),(56,(54,(53,(),()),(55,(),())),(58,(57,(),()),(59,(),())))),(64,(62,(61,(),()),(63,(),())),(66,(65,(),()),(67,(),())))),(70,(69,(),()),(71,(),()))))
02-splay_operation/cpp/test_main.cpp
0 → 100644
View file @
7e11e384
#include <cstdlib>
#include <functional>
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using
namespace
std
;
extern
vector
<
pair
<
string
,
function
<
void
()
>>>
tests
;
void
expect_failed
(
const
string
&
message
)
{
cerr
<<
"Test error: "
<<
message
<<
endl
;
exit
(
1
);
}
int
main
(
int
argc
,
char
*
argv
[])
{
vector
<
string
>
required_tests
;
if
(
argc
>
1
)
{
required_tests
.
assign
(
argv
+
1
,
argv
+
argc
);
}
else
{
for
(
const
auto
&
test
:
tests
)
required_tests
.
push_back
(
test
.
first
);
}
for
(
const
auto
&
required_test
:
required_tests
)
{
bool
found
=
false
;
for
(
const
auto
&
test
:
tests
)
if
(
required_test
==
test
.
first
)
{
cerr
<<
"Running test "
<<
required_test
<<
endl
;
test
.
second
();
found
=
true
;
break
;
}
if
(
!
found
)
{
cerr
<<
"Unknown test "
<<
required_test
<<
endl
;
return
1
;
}
}
return
0
;
}
02-splay_operation/python/splay_operation.py
0 → 100644
View file @
7e11e384
#!/usr/bin/env python3
class
Node
:
"""Node in a binary tree `Tree`"""
def
__init__
(
self
,
key
,
left
=
None
,
right
=
None
,
parent
=
None
):
self
.
key
=
key
self
.
parent
=
parent
self
.
left
=
left
self
.
right
=
right
if
left
is
not
None
:
left
.
parent
=
self
if
right
is
not
None
:
right
.
parent
=
self
class
Tree
:
"""A simple binary search tree"""
def
__init__
(
self
,
root
=
None
):
self
.
root
=
root
def
rotate
(
self
,
node
):
""" Rotate the given `node` up.
Performs a single rotation of the edge between the given node
and its parent, choosing left or right rotation appropriately.
"""
if
node
.
parent
is
not
None
:
if
node
.
parent
.
left
==
node
:
if
node
.
right
is
not
None
:
node
.
right
.
parent
=
node
.
parent
node
.
parent
.
left
=
node
.
right
node
.
right
=
node
.
parent
else
:
if
node
.
left
is
not
None
:
node
.
left
.
parent
=
node
.
parent
node
.
parent
.
right
=
node
.
left
node
.
left
=
node
.
parent
if
node
.
parent
.
parent
is
not
None
:
if
node
.
parent
.
parent
.
left
==
node
.
parent
:
node
.
parent
.
parent
.
left
=
node
else
:
node
.
parent
.
parent
.
right
=
node
else
:
self
.
root
=
node
node
.
parent
.
parent
,
node
.
parent
=
node
,
node
.
parent
.
parent
def
lookup
(
self
,
key
):
"""Look up the given key in the tree.
Returns the node with the requested key or `None`.
"""
# TODO: Utilize splay suitably.
node
=
self
.
root
while
node
is
not
None
:
if
node
.
key
==
key
:
return
node
if
key
<
node
.
key
:
node
=
node
.
left
else
:
node
=
node
.
right
return
None
def
insert
(
self
,
key
):
"""Insert key into the tree.
If the key is already present, nothing happens.
"""
# TODO: Utilize splay suitably.
if
self
.
root
is
None
:
self
.
root
=
Node
(
key
)
return
node
=
self
.
root
while
node
.
key
!=
key
:
if
key
<
node
.
key
:
if
node
.
left
is
None
:
node
.
left
=
Node
(
key
,
parent
=
node
)
node
=
node
.
left
else
:
if
node
.
right
is
None
:
node
.
right
=
Node
(
key
,
parent
=
node
)
node
=
node
.
right
def
remove
(
self
,
key
):
"""Remove given key from the tree.
It the key is not present, nothing happens.
"""
# TODO: Utilize splay suitably.
node
=
self
.
root
while
node
is
not
None
and
node
.
key
!=
key
:
if
key
<
node
.
key
:
node
=
node
.
left
else
:
node
=
node
.
right
if
node
is
not
None
:
if
node
.
left
is
not
None
and
node
.
right
is
not
None
:
replacement
=
node
.
right
while
replacement
.
left
is
not
None
:
replacement
=
replacement
.
left
node
.
key
=
replacement
.
key
node
=
replacement
replacement
=
node
.
left
if
node
.
left
is
not
None
else
node
.
right
if
node
.
parent
is
not
None
:
if
node
.
parent
.
left
==
node
:
node
.
parent
.
left
=
replacement
else
:
node
.
parent
.
right
=
replacement
else
:
self
.
root
=
replacement
if
replacement
is
not
None
:
replacement
.
parent
=
node
.
parent
def
splay
(
self
,
node
):
"""Splay the given node.
If a single rotation needs to be performed, perform it as the last rotation
(i.e., to move the splayed node to the root of the tree).
"""