Skip to content

Commit 891944c

Browse files
committed
Merge branch 'master' into beta
2 parents 6c74c1d + 3df0acc commit 891944c

9 files changed

+138
-22
lines changed

docs/api/Advanced.Algorithms.DataStructures.AVLTree-1.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ <h4 id="Advanced_Algorithms_DataStructures_AVLTree_1__ctor_IEnumerable__0__Syste
129129
<div class="markdown level1 conceptual"></div>
130130
<h5 class="decalaration">Declaration</h5>
131131
<div class="codewrapper">
132-
<pre><code class="lang-csharp hljs">public AVLTree(IEnumerable&lt;T&gt; sortedKeys, bool enableNodeLookUp = false)</code></pre>
132+
<pre><code class="lang-csharp hljs">public AVLTree(IEnumerable&lt;T&gt; sortedCollection, bool enableNodeLookUp = false)</code></pre>
133133
</div>
134134
<h5 class="parameters">Parameters</h5>
135135
<table class="table table-bordered table-striped table-condensed">
@@ -143,8 +143,8 @@ <h5 class="parameters">Parameters</h5>
143143
<tbody>
144144
<tr>
145145
<td><span class="xref">IEnumerable</span>&lt;T&gt;</td>
146-
<td><span class="parametername">sortedKeys</span></td>
147-
<td><p>The sorted keys.</p>
146+
<td><span class="parametername">sortedCollection</span></td>
147+
<td><p>The initial sorted collection.</p>
148148
</td>
149149
</tr>
150150
<tr>

docs/api/Advanced.Algorithms.DataStructures.BST-1.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ <h4 id="Advanced_Algorithms_DataStructures_BST_1__ctor_IEnumerable__0__" data-ui
139139
<div class="markdown level1 conceptual"></div>
140140
<h5 class="decalaration">Declaration</h5>
141141
<div class="codewrapper">
142-
<pre><code class="lang-csharp hljs">public BST(IEnumerable&lt;T&gt; sortedKeys)</code></pre>
142+
<pre><code class="lang-csharp hljs">public BST(IEnumerable&lt;T&gt; sortedCollection)</code></pre>
143143
</div>
144144
<h5 class="parameters">Parameters</h5>
145145
<table class="table table-bordered table-striped table-condensed">
@@ -153,7 +153,7 @@ <h5 class="parameters">Parameters</h5>
153153
<tbody>
154154
<tr>
155155
<td><span class="xref">IEnumerable</span>&lt;T&gt;</td>
156-
<td><span class="parametername">sortedKeys</span></td>
156+
<td><span class="parametername">sortedCollection</span></td>
157157
<td></td>
158158
</tr>
159159
</tbody>

docs/api/Advanced.Algorithms.DataStructures.RedBlackTree-1.html

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ <h4 id="Advanced_Algorithms_DataStructures_RedBlackTree_1__ctor_IEnumerable__0__
129129
<div class="markdown level1 conceptual"></div>
130130
<h5 class="decalaration">Declaration</h5>
131131
<div class="codewrapper">
132-
<pre><code class="lang-csharp hljs">public RedBlackTree(IEnumerable&lt;T&gt; sortedKeys = null)</code></pre>
132+
<pre><code class="lang-csharp hljs">public RedBlackTree(IEnumerable&lt;T&gt; sortedCollection = null)</code></pre>
133133
</div>
134134
<h5 class="parameters">Parameters</h5>
135135
<table class="table table-bordered table-striped table-condensed">
@@ -143,8 +143,9 @@ <h5 class="parameters">Parameters</h5>
143143
<tbody>
144144
<tr>
145145
<td><span class="xref">IEnumerable</span>&lt;T&gt;</td>
146-
<td><span class="parametername">sortedKeys</span></td>
147-
<td></td>
146+
<td><span class="parametername">sortedCollection</span></td>
147+
<td><p>The sorted initial collection.</p>
148+
</td>
148149
</tr>
149150
</tbody>
150151
</table>

docs/api/Advanced.Algorithms.DataStructures.SplayTree-1.html

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ <h4 id="Advanced_Algorithms_DataStructures_SplayTree_1__ctor_IEnumerable__0__" d
139139
<div class="markdown level1 conceptual"></div>
140140
<h5 class="decalaration">Declaration</h5>
141141
<div class="codewrapper">
142-
<pre><code class="lang-csharp hljs">public SplayTree(IEnumerable&lt;T&gt; collection)</code></pre>
142+
<pre><code class="lang-csharp hljs">public SplayTree(IEnumerable&lt;T&gt; sortedCollection)</code></pre>
143143
</div>
144144
<h5 class="parameters">Parameters</h5>
145145
<table class="table table-bordered table-striped table-condensed">
@@ -153,8 +153,9 @@ <h5 class="parameters">Parameters</h5>
153153
<tbody>
154154
<tr>
155155
<td><span class="xref">IEnumerable</span>&lt;T&gt;</td>
156-
<td><span class="parametername">collection</span></td>
157-
<td></td>
156+
<td><span class="parametername">sortedCollection</span></td>
157+
<td><p>The sorted collection.</p>
158+
</td>
158159
</tr>
159160
</tbody>
160161
</table>

docs/api/Advanced.Algorithms.DataStructures.TreapTree-1.html

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ <h4 id="Advanced_Algorithms_DataStructures_TreapTree_1__ctor_IEnumerable__0__" d
139139
<div class="markdown level1 conceptual"></div>
140140
<h5 class="decalaration">Declaration</h5>
141141
<div class="codewrapper">
142-
<pre><code class="lang-csharp hljs">public TreapTree(IEnumerable&lt;T&gt; collection)</code></pre>
142+
<pre><code class="lang-csharp hljs">public TreapTree(IEnumerable&lt;T&gt; sortedCollection)</code></pre>
143143
</div>
144144
<h5 class="parameters">Parameters</h5>
145145
<table class="table table-bordered table-striped table-condensed">
@@ -153,8 +153,9 @@ <h5 class="parameters">Parameters</h5>
153153
<tbody>
154154
<tr>
155155
<td><span class="xref">IEnumerable</span>&lt;T&gt;</td>
156-
<td><span class="parametername">collection</span></td>
157-
<td></td>
156+
<td><span class="parametername">sortedCollection</span></td>
157+
<td><p>The initial sorted collection.</p>
158+
</td>
158159
</tr>
159160
</tbody>
160161
</table>

docs/index.json

Lines changed: 5 additions & 5 deletions
Large diffs are not rendered by default.

src/Advanced.Algorithms/DataStructures/Tree/AvlTree.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@ public AVLTree(bool enableNodeLookUp = false)
3434
/// <param name="enableNodeLookUp">Enabling lookup will fasten deletion/insertion/exists operations
3535
/// at the cost of additional space.</param>
3636
public AVLTree(IEnumerable<T> sortedCollection, bool enableNodeLookUp = false)
37-
: this(enableNodeLookUp)
3837
{
3938
ValidateSortedCollection(sortedCollection);
4039
var nodes = sortedCollection.Select(x => new AVLTreeNode<T>(null, x)).ToArray();
4140
Root = (AVLTreeNode<T>)ToBST(nodes);
4241
recomputeHeight(Root);
4342
assignCount(Root);
43+
44+
if (enableNodeLookUp)
45+
{
46+
nodeLookUp = nodes.ToDictionary(x => x.Value, x => x as BSTNodeBase<T>);
47+
}
4448
}
4549

4650

src/Advanced.Algorithms/DataStructures/Tree/RedBlackTree.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,9 @@ internal bool Exists(T value)
131131
{
132132
if (nodeLookUp != null)
133133
{
134-
return (nodeLookUp[value] as RedBlackTreeNode<T>, Root.Position(value));
134+
//since node look up is only used by Bentley-Ottmann algorithm internally
135+
//and it does'nt need the position we can return defualt(int).
136+
return (nodeLookUp[value] as RedBlackTreeNode<T>, default(int));
135137
}
136138

137139
var result = Root.Find(value);
@@ -831,6 +833,7 @@ public T NextHigher(T value)
831833
return next != null ? next.Value : default(T);
832834
}
833835

836+
///Special (internal only) method for Bentley-Ottmann sweep line algorithm.
834837
internal void Swap(T value1, T value2)
835838
{
836839
var node1 = find(value1).Item1;

tests/Advanced.Algorithms.Tests/DataStructures/Tree/AVLTree_Tests.cs

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,77 @@ public void AVLTree_Accuracy_Test()
9898
{
9999
var nodeCount = 1000;
100100

101+
var rnd = new Random();
102+
var sorted = Enumerable.Range(1, nodeCount).ToList();
103+
var randomNumbers = sorted
104+
.OrderBy(x => rnd.Next())
105+
.ToList();
106+
107+
var tree = new AVLTree<int>();
108+
109+
for (int i = 0; i < nodeCount; i++)
110+
{
111+
tree.Insert(randomNumbers[i]);
112+
113+
Assert.IsTrue(tree.HasItem(randomNumbers[i]));
114+
Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue));
115+
tree.Root.VerifyCount();
116+
117+
var actualHeight = tree.GetHeight();
118+
119+
//http://stackoverflow.com/questions/30769383/finding-the-minimum-and-maximum-height-in-a-avl-tree-given-a-number-of-nodes
120+
var maxHeight = 1.44 * Math.Log(nodeCount + 2, 2) - 0.328;
121+
122+
Assert.IsTrue(actualHeight < maxHeight);
123+
Assert.IsTrue(tree.Count == i + 1);
124+
}
125+
126+
for (int i = 0; i < sorted.Count; i++)
127+
{
128+
Assert.AreEqual(sorted[i], tree.ElementAt(i));
129+
Assert.AreEqual(i, tree.IndexOf(sorted[i]));
130+
}
131+
132+
randomNumbers = Enumerable.Range(1, nodeCount)
133+
.OrderBy(x => rnd.Next())
134+
.ToList();
135+
136+
//IEnumerable test using linq
137+
Assert.AreEqual(tree.Count, tree.Count());
138+
Assert.AreEqual(tree.Count, tree.AsEnumerableDesc().Count());
139+
140+
for (int i = 0; i < nodeCount; i++)
141+
{
142+
if (rnd.NextDouble() >= 0.5)
143+
{
144+
tree.Delete(randomNumbers[i]);
145+
}
146+
else
147+
{
148+
var index = tree.IndexOf(randomNumbers[i]);
149+
Assert.AreEqual(tree.ElementAt(index), randomNumbers[i]);
150+
tree.RemoveAt(index);
151+
}
152+
153+
Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue));
154+
tree.Root.VerifyCount();
155+
156+
var actualHeight = tree.GetHeight();
157+
158+
//http://stackoverflow.com/questions/30769383/finding-the-minimum-and-maximum-height-in-a-avl-tree-given-a-number-of-nodes
159+
var maxHeight = 1.44 * Math.Log(nodeCount + 2, 2) - 0.328;
160+
161+
Assert.IsTrue(actualHeight < maxHeight);
162+
}
163+
164+
Assert.IsTrue(tree.Count == 0);
165+
}
166+
167+
[TestMethod]
168+
public void AVLTree_Accuracy_Test_With_Node_LookUp()
169+
{
170+
var nodeCount = 1000;
171+
101172
var rnd = new Random();
102173
var sorted = Enumerable.Range(1, nodeCount).ToList();
103174
var randomNumbers = sorted
@@ -165,7 +236,7 @@ public void AVLTree_Accuracy_Test()
165236
}
166237

167238
[TestMethod]
168-
public void AVLTree_BulkInit_Test()
239+
public void AVLTree_BulkInit_Test_With_Node_LookUp()
169240
{
170241
var nodeCount = 1000;
171242

@@ -199,6 +270,41 @@ public void AVLTree_BulkInit_Test()
199270
Assert.IsTrue(tree.Count == 0);
200271
}
201272

273+
[TestMethod]
274+
public void AVLTree_BulkInit_Test()
275+
{
276+
var nodeCount = 1000;
277+
278+
var rnd = new Random();
279+
var randomNumbers = Enumerable.Range(1, nodeCount).ToList();
280+
281+
var tree = new AVLTree<int>(randomNumbers, true);
282+
283+
Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue));
284+
Assert.AreEqual(tree.Count, tree.Count());
285+
286+
tree.Root.VerifyCount();
287+
288+
for (int i = 0; i < nodeCount; i++)
289+
{
290+
tree.Delete(randomNumbers[i]);
291+
292+
tree.Root.VerifyCount();
293+
Assert.IsTrue(tree.Root.IsBinarySearchTree(int.MinValue, int.MaxValue));
294+
295+
var actualHeight = tree.GetHeight();
296+
297+
//http://stackoverflow.com/questions/30769383/finding-the-minimum-and-maximum-height-in-a-avl-tree-given-a-number-of-nodes
298+
var maxHeight = 1.44 * Math.Log(nodeCount + 2, 2) - 0.328;
299+
300+
Assert.IsTrue(actualHeight < maxHeight);
301+
302+
Assert.IsTrue(tree.Count == nodeCount - 1 - i);
303+
}
304+
305+
Assert.IsTrue(tree.Count == 0);
306+
}
307+
202308
[TestMethod]
203309
public void AVLTree_Stress_Test()
204310
{

0 commit comments

Comments
 (0)