Skip to content

Commit 90953e6

Browse files
committed
Add Boyer-Moore Majority Vote algorithm
1 parent 411763c commit 90953e6

File tree

2 files changed

+155
-0
lines changed

2 files changed

+155
-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: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace Algorithms.Other;
5+
6+
/// <summary>
7+
/// Boyer-Moore Majority Vote Algorithm finds the majority element in an array.
8+
/// A majority element appears more than n/2 times where n is the array length.
9+
/// Time complexity: O(n), Space complexity: O(1).
10+
/// </summary>
11+
public static class BoyerMooreMajorityVote
12+
{
13+
/// <summary>
14+
/// Finds the majority element in the array.
15+
/// </summary>
16+
/// <param name="nums">Input array.</param>
17+
/// <returns>The majority element, or null if none exists.</returns>
18+
public static int? FindMajority(int[] nums)
19+
{
20+
if (nums == null || nums.Length == 0)
21+
{
22+
return null;
23+
}
24+
25+
var candidate = FindCandidate(nums);
26+
return IsMajority(nums, candidate) ? candidate : null;
27+
}
28+
29+
private static int FindCandidate(int[] nums)
30+
{
31+
int candidate = nums[0];
32+
int count = 1;
33+
34+
for (int i = 1; i < nums.Length; i++)
35+
{
36+
if (count == 0)
37+
{
38+
candidate = nums[i];
39+
count = 1;
40+
}
41+
else if (nums[i] == candidate)
42+
{
43+
count++;
44+
}
45+
else
46+
{
47+
count--;
48+
}
49+
}
50+
51+
return candidate;
52+
}
53+
54+
private static bool IsMajority(int[] nums, int candidate)
55+
{
56+
int count = 0;
57+
foreach (var num in nums)
58+
{
59+
if (num == candidate)
60+
{
61+
count++;
62+
}
63+
}
64+
65+
return count > nums.Length / 2;
66+
}
67+
}

0 commit comments

Comments
 (0)