Skip to content

Commit 2d98762

Browse files
committed
Add Boyer-Moore Majority Vote algorithm
1 parent 411763c commit 2d98762

File tree

2 files changed

+125
-0
lines changed

2 files changed

+125
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
using Algorithms.Other;
2+
using NUnit.Framework;
3+
using FluentAssertions;
4+
5+
namespace Algorithms.Tests.Other;
6+
7+
public class BoyerMooreMajorityVoteTests
8+
{
9+
[Test]
10+
public void FindMajority_SimpleMajority_ReturnsCorrectElement()
11+
{
12+
var nums = new[] { 3, 3, 4, 2, 3, 3, 3 };
13+
var result = BoyerMooreMajorityVote.FindMajority(nums);
14+
result.Should().Be(3);
15+
}
16+
17+
[Test]
18+
public void FindMajority_AllSameElements_ReturnsThatElement()
19+
{
20+
var nums = new[] { 5, 5, 5, 5 };
21+
var result = BoyerMooreMajorityVote.FindMajority(nums);
22+
result.Should().Be(5);
23+
}
24+
25+
[Test]
26+
public void FindMajority_NoMajority_ReturnsNull()
27+
{
28+
var nums = new[] { 1, 2, 3, 4 };
29+
var result = BoyerMooreMajorityVote.FindMajority(nums);
30+
result.Should().BeNull();
31+
}
32+
33+
[Test]
34+
public void FindMajority_EmptyArray_ReturnsNull()
35+
{
36+
var nums = Array.Empty<int>();
37+
var result = BoyerMooreMajorityVote.FindMajority(nums);
38+
result.Should().BeNull();
39+
}
40+
41+
[Test]
42+
public void FindMajority_NullArray_ReturnsNull()
43+
{
44+
int[]? nums = null;
45+
var result = BoyerMooreMajorityVote.FindMajority(nums!);
46+
result.Should().BeNull();
47+
}
48+
49+
[Test]
50+
public void FindMajority_SingleElement_ReturnsThatElement()
51+
{
52+
var nums = new[] { 7 };
53+
var result = BoyerMooreMajorityVote.FindMajority(nums);
54+
result.Should().Be(7);
55+
}
56+
57+
[Test]
58+
public void FindMajority_MajorityAtEnd_ReturnsCorrectElement()
59+
{
60+
var nums = new[] { 1, 2, 2, 2, 2 };
61+
var result = BoyerMooreMajorityVote.FindMajority(nums);
62+
result.Should().Be(2);
63+
}
64+
65+
[Test]
66+
public void FindMajority_MajorityAtStart_ReturnsCorrectElement()
67+
{
68+
var nums = new[] { 8, 8, 8, 8, 1, 2 };
69+
var result = BoyerMooreMajorityVote.FindMajority(nums);
70+
result.Should().Be(8);
71+
}
72+
73+
[Test]
74+
public void FindMajority_NegativeNumbers_ReturnsCorrectElement()
75+
{
76+
var nums = new[] { -1, -1, -1, 2, 2 };
77+
var result = BoyerMooreMajorityVote.FindMajority(nums);
78+
result.Should().Be(-1);
79+
}
80+
81+
[Test]
82+
public void FindMajority_ExactlyHalf_ReturnsNull()
83+
{
84+
var nums = new[] { 1, 1, 2, 2 };
85+
var result = BoyerMooreMajorityVote.FindMajority(nums);
86+
result.Should().BeNull();
87+
}
88+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
namespace Algorithms.Other;
2+
3+
/// <summary>
4+
/// Boyer-Moore Majority Vote algorithm.
5+
/// Finds element appearing more than n/2 times in O(n) time, O(1) space.
6+
/// </summary>
7+
public static class BoyerMooreMajorityVote
8+
{
9+
/// <summary>
10+
/// Finds the majority element.
11+
/// </summary>
12+
/// <param name="nums">Input array.</param>
13+
/// <returns>Majority element or null.</returns>
14+
public static int? FindMajority(int[] nums)
15+
{
16+
if (nums?.Length == 0) return null;
17+
18+
var candidate = FindCandidate(nums!);
19+
return IsMajority(nums!, candidate) ? candidate : null;
20+
}
21+
22+
private static int FindCandidate(int[] nums)
23+
{
24+
int candidate = nums[0], count = 1;
25+
26+
for (int i = 1; i < nums.Length; i++)
27+
{
28+
if (count == 0) candidate = nums[i];
29+
count += nums[i] == candidate ? 1 : -1;
30+
}
31+
32+
return candidate;
33+
}
34+
35+
private static bool IsMajority(int[] nums, int candidate) =>
36+
nums.Count(n => n == candidate) > nums.Length / 2;
37+
}

0 commit comments

Comments
 (0)