Skip to content

Commit 135e2eb

Browse files
Merge pull request #8 from justcoding121/develop
Merge with Beta
2 parents f66fbdd + 7af2b86 commit 135e2eb

File tree

15 files changed

+177
-136
lines changed

15 files changed

+177
-136
lines changed

Advanced.Algorithms.Tests/BitAlgorithms/BaseConversion_Tests.cs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,40 @@ public class BaseConversion_Tests
1414
[TestMethod]
1515
public void BaseConversion_Smoke_Test()
1616
{
17+
//decimal to binary
18+
Assert.AreEqual("11",
19+
BaseConversion.Convert("1011", "01",
20+
"0123456789"));
21+
22+
//binary to decimal
23+
Assert.AreEqual("11.5",
24+
BaseConversion.Convert("1011.10", "01",
25+
"0123456789"));
26+
27+
//decimal to base3
1728
Assert.AreEqual("Foo",
1829
BaseConversion.Convert("9", "0123456789",
1930
"oF8"));
2031

32+
//base3 to decimal
2133
Assert.AreEqual("9",
2234
BaseConversion.Convert("Foo", "oF8",
2335
"0123456789"));
2436

37+
//hex to binary
2538
Assert.AreEqual("10011",
2639
BaseConversion.Convert("13", "0123456789abcdef",
2740
"01"));
2841

29-
Assert.AreEqual("JAM!",
30-
BaseConversion.Convert("CODE", "O!CDE?",
31-
"A?JM!."));
42+
//decimal to hex
43+
Assert.AreEqual("5.0e631f8a0902de00d1b71758e219652b",
44+
BaseConversion.Convert("5.05620", "0123456789",
45+
"0123456789abcdef"));
46+
47+
//hex to decimal with precision 5
48+
Assert.AreEqual("5.05619",
49+
BaseConversion.Convert("5.0e631f8a0902de00d1b71758e219652b", "0123456789abcdef",
50+
"0123456789", 5));
3251

3352
}
3453
}

Advanced.Algorithms.Tests/DataStructures/Heap/Max/BMaxHeap_Tests.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,10 @@ public class BMaxHeap_Tests
1616
[TestMethod]
1717
public void BMaxHeap_Test()
1818
{
19+
var rnd = new Random();
1920

20-
var initial = new List<int>();
21-
22-
for (int i = 50; i >=0; i--)
23-
{
24-
initial.Add(i);
25-
}
21+
var initial = new List<int>(Enumerable.Range(0, 51)
22+
.OrderBy(x => rnd.Next()));
2623

2724
//insert test
2825
var tree = new BMaxHeap<int>(initial);
@@ -38,7 +35,7 @@ public void BMaxHeap_Test()
3835
Assert.AreEqual(Max, 99 - i);
3936
}
4037

41-
var rnd = new Random();
38+
4239
var testSeries = Enumerable.Range(1, 49)
4340
.OrderBy(x => rnd.Next()).ToList();
4441

Advanced.Algorithms.Tests/DataStructures/Heap/Max/D-aryMaxHeap_Tests.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,14 @@ public class AsD_aryMaxTree_Tests
1414
/// A tree test
1515
/// </summary>
1616
[TestMethod]
17-
public void AsD_aryHeap_Test()
17+
public void D_ary_MaxHeap_Test()
1818
{
19-
var initial = new List<int>();
19+
var rnd = new Random();
2020

21-
for (int i = 0; i <= 50; i++)
22-
{
23-
initial.Add(i);
24-
}
21+
var initial = new List<int>(Enumerable.Range(0, 51)
22+
.OrderBy(x => rnd.Next()));
2523

26-
//insert test
2724
var tree = new D_aryMaxHeap<int>(4, initial);
28-
2925
for (int i = 51; i <= 99; i++)
3026
{
3127
tree.Insert(i);
@@ -37,7 +33,6 @@ public void AsD_aryHeap_Test()
3733
Assert.AreEqual(max, i);
3834
}
3935

40-
var rnd = new Random();
4136
var testSeries = Enumerable.Range(1, 49).OrderBy(x => rnd.Next()).ToList();
4237

4338
foreach (var item in testSeries)

Advanced.Algorithms.Tests/DataStructures/Heap/Min/BMinHeap_Tests.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,8 @@ public class BMinHeap_Tests
1616
[TestMethod]
1717
public void BMinHeap_Test()
1818
{
19-
20-
var initial = new List<int>();
21-
22-
for (int i = 0; i <= 50; i++)
23-
{
24-
initial.Add(i);
25-
}
19+
var rnd = new Random();
20+
var initial = Enumerable.Range(0, 51).OrderBy(x => rnd.Next()).ToList();
2621

2722
//insert test
2823
var tree = new BMinHeap<int>(initial);
@@ -38,7 +33,7 @@ public void BMinHeap_Test()
3833
Assert.AreEqual(min, i);
3934
}
4035

41-
var rnd = new Random();
36+
4237
var testSeries = Enumerable.Range(1, 49).OrderBy(x => rnd.Next()).ToList();
4338

4439
foreach (var item in testSeries)

Advanced.Algorithms.Tests/DataStructures/Heap/Min/D-aryMinHeap_Tests.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,8 @@ public class AsD_aryMinTree_Tests
1616
[TestMethod]
1717
public void AsD_aryHeap_Test()
1818
{
19-
var initial = new List<int>();
20-
21-
for (int i = 0; i <= 50; i++)
22-
{
23-
initial.Add(i);
24-
}
19+
var rnd = new Random();
20+
var initial = Enumerable.Range(0, 51).OrderBy(x => rnd.Next()).ToList();
2521

2622
//insert test
2723
var tree = new D_aryMinHeap<int>(4, initial);
@@ -37,7 +33,6 @@ public void AsD_aryHeap_Test()
3733
Assert.AreEqual(min, i);
3834
}
3935

40-
var rnd = new Random();
4136
var testSeries = Enumerable.Range(1, 49).OrderBy(x => rnd.Next()).ToList();
4237

4338
foreach (var item in testSeries)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void AVLTree_AccuracyTest()
109109

110110
Assert.IsTrue(tree.HasItem(randomNumbers[i]));
111111

112-
Assert.IsTrue(BinarySearchTreeTester<int>.VerifyIsBinarySearchTree(tree.Root));
112+
Assert.IsTrue(BinarySearchTreeTester<int>.VerifyIsBinarySearchTree(tree.Root, int.MinValue, int.MaxValue));
113113

114114
var actualHeight = tree.GetHeight();
115115

@@ -128,7 +128,7 @@ public void AVLTree_AccuracyTest()
128128
{
129129
tree.Delete(randomNumbers[i]);
130130

131-
Assert.IsTrue(BinarySearchTreeTester<int>.VerifyIsBinarySearchTree(tree.Root));
131+
Assert.IsTrue(BinarySearchTreeTester<int>.VerifyIsBinarySearchTree(tree.Root, int.MinValue, int.MaxValue));
132132

133133
var actualHeight = tree.GetHeight();
134134

Advanced.Algorithms.Tests/DataStructures/Tree/RedBlackTree_Tests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public void RedBlackTree_AccuracyTest()
6565
{
6666
tree.Insert(randomNumbers[i]);
6767
Assert.IsTrue(tree.HasItem(randomNumbers[i]));
68-
Assert.IsTrue(BinarySearchTreeTester<int>.VerifyIsBinarySearchTree(tree.Root));
68+
Assert.IsTrue(BinarySearchTreeTester<int>.VerifyIsBinarySearchTree(tree.Root, int.MinValue, int.MaxValue));
6969

7070
var actualHeight = tree.GetHeight();
7171

@@ -85,7 +85,7 @@ public void RedBlackTree_AccuracyTest()
8585
for (int i = 0; i < nodeCount; i++)
8686
{
8787
tree.Delete(randomNumbers[i]);
88-
Assert.IsTrue(BinarySearchTreeTester<int>.VerifyIsBinarySearchTree(tree.Root));
88+
Assert.IsTrue(BinarySearchTreeTester<int>.VerifyIsBinarySearchTree(tree.Root, int.MinValue, int.MaxValue));
8989

9090
var actualHeight = tree.GetHeight();
9191

Advanced.Algorithms.Tests/DataStructures/Tree/TestHelpers/BinarySearchTreeTester.cs

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,21 @@ namespace Advanced.Algorithms.Tests.DataStructures.Tree.TestHelpers
99
{
1010
public class BinarySearchTreeTester<T> where T:IComparable
1111
{
12-
13-
public static bool VerifyIsBinarySearchTree(IBSTNode<T> node)
12+
13+
public static bool VerifyIsBinarySearchTree(IBSTNode<T> node, T lowerBound, T upperBound)
1414
{
1515
if (node == null)
1616
{
1717
return true;
1818
}
1919

20-
if (node.Left != null)
21-
{
22-
if (node.Left.Value.CompareTo(node.Value) > 0)
23-
{
24-
return false;
25-
}
26-
}
27-
28-
if (node.Right != null)
20+
if (node.Value.CompareTo(upperBound)>= 0 || node.Value.CompareTo(lowerBound) <= 0)
2921
{
30-
if (node.Right.Value.CompareTo(node.Value) < 0)
31-
{
32-
return false;
33-
}
22+
return false;
3423
}
35-
return VerifyIsBinarySearchTree(node.Left) &&
36-
VerifyIsBinarySearchTree(node.Right);
24+
25+
return VerifyIsBinarySearchTree(node.Left, lowerBound, node.Value) &&
26+
VerifyIsBinarySearchTree(node.Right, node.Value, upperBound);
3727
}
3828
}
3929
}

Advanced.Algorithms/BitAlgorithms/BaseConversion.cs

Lines changed: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,39 @@ public class BaseConversion
1515
/// <param name="srcBaseChars">Should be in correct order => eg. 0123456789 for decimal</param>
1616
/// <param name="dstBaseChars">>Should be in correct order => eg. 01 for binary</param>
1717
/// <returns></returns>
18-
public static string Convert(string srcNumber,
18+
public static string Convert(string srcNumber,
1919
string srcBaseChars,
20-
string dstBaseChars)
20+
string dstBaseChars, int precision = 32)
2121
{
22+
srcNumber = srcNumber.Trim();
23+
if (srcNumber.Contains("."))
24+
{
25+
var tmp = srcNumber.Split('.');
26+
var whole = tmp[0].TrimEnd();
27+
var fraction = tmp[1].TrimStart();
28+
29+
return ConvertWhole(whole, srcBaseChars, dstBaseChars) +
30+
"." + ConvertFraction(fraction, srcBaseChars, dstBaseChars, precision);
31+
}
32+
33+
return ConvertWhole(srcNumber, srcBaseChars, dstBaseChars);
34+
}
35+
/// <summary>
36+
/// Converts base of given number
37+
/// </summary>
38+
/// <param name="srcNumber">input number in source base system</param>
39+
/// <param name="srcBaseChars">Should be in correct order => eg. 0123456789 for decimal</param>
40+
/// <param name="dstBaseChars">>Should be in correct order => eg. 01 for binary</param>
41+
/// <returns></returns>
42+
private static string ConvertWhole(string srcNumber,
43+
string srcBaseChars,
44+
string dstBaseChars)
45+
{
46+
if (string.IsNullOrEmpty(srcNumber))
47+
{
48+
return string.Empty;
49+
}
50+
2251
var srcBase = srcBaseChars.Length;
2352
var dstBase = dstBaseChars.Length;
2453

@@ -27,7 +56,7 @@ public static string Convert(string srcNumber,
2756
throw new Exception("Invalid source base length.");
2857
}
2958

30-
if (dstBase <=1)
59+
if (dstBase <= 1)
3160
{
3261
throw new Exception("Invalid destination base length.");
3362
}
@@ -36,16 +65,17 @@ public static string Convert(string srcNumber,
3665
var j = 0;
3766
//convert to base 10
3867
//move from least to most significant numbers
39-
for(int i=srcNumber.Length-1;i >= 0;i--)
68+
for (int i = srcNumber.Length - 1; i >= 0; i--)
4069
{
4170
//eg. 1 * 2^0
42-
base10Result += (long)((srcBaseChars.IndexOf(srcNumber[i])) * Math.Pow(srcBase, j));
71+
base10Result += (srcBaseChars.IndexOf(srcNumber[i]))
72+
* (long)(Math.Pow(srcBase, j));
4373
j++;
4474
}
4575

4676
var result = new StringBuilder();
4777
//now convert to target base
48-
while(base10Result!=0)
78+
while (base10Result != 0)
4979
{
5080
var rem = (int)base10Result % dstBase;
5181
result.Insert(0, dstBaseChars[rem]);
@@ -55,5 +85,51 @@ public static string Convert(string srcNumber,
5585
return result.ToString();
5686

5787
}
88+
89+
private static string ConvertFraction(string srcNumber,
90+
string srcBaseChars,
91+
string dstBaseChars, int maxPrecision)
92+
{
93+
if (string.IsNullOrEmpty(srcNumber))
94+
{
95+
return string.Empty;
96+
}
97+
98+
var srcBase = srcBaseChars.Length;
99+
var dstBase = dstBaseChars.Length;
100+
101+
if (srcBase <= 1)
102+
{
103+
throw new Exception("Invalid source base length.");
104+
}
105+
106+
if (dstBase <= 1)
107+
{
108+
throw new Exception("Invalid destination base length.");
109+
}
110+
111+
decimal base10Result = 0;
112+
//convert to base 10
113+
//move from most significant numbers to least
114+
for (int i = 0; i < srcNumber.Length; i++)
115+
{
116+
//eg. 1 * 1/(2^1)
117+
base10Result += (srcBaseChars.IndexOf(srcNumber[i]))
118+
* (decimal)(1 / Math.Pow(srcBase, i + 1));
119+
}
120+
121+
var result = new StringBuilder();
122+
//now convert to target base
123+
while (base10Result != 0 && maxPrecision > 0)
124+
{
125+
base10Result = base10Result * dstBase;
126+
result.Append(dstBaseChars[(int)Math.Floor(base10Result)]);
127+
base10Result -= Math.Floor(base10Result);
128+
maxPrecision--;
129+
}
130+
131+
return result.ToString();
132+
133+
}
58134
}
59135
}

0 commit comments

Comments
 (0)