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
3e754e97
Commit
3e754e97
authored
Mar 10, 2021
by
Martin Mareš
Browse files
Splay operation and Splay experiment
parent
789e7506
Changes
15
Hide whitespace changes
Inline
Side-by-side
02-splay_operation/cpp/Makefile
0 → 100644
View file @
3e754e97
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 @
3e754e97
// 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 @
3e754e97
#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 @
3e754e97
(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 @
3e754e97
#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 @
3e754e97
#!/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