Skip to content

Commit

Permalink
Merge pull request #112 from kzrnm/feature/pq
Browse files Browse the repository at this point in the history
Add PriorityQueue.DequeueEnqueue(T) and PriorityQueue.TryPeek(out T)
  • Loading branch information
kzrnm committed Nov 28, 2023
2 parents a1fbf30 + 1410631 commit 8a68f67
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 14 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [3.7.0] - 2023-11-29
### Added
- Add PriorityQueue.TryPeek(out T)
- Add PriorityQueue.DequeueEnqueue(T)

## [3.6.2] - 2023-11-26
### Changed
- Fix EnqueueDequeue
Expand Down
4 changes: 2 additions & 2 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
<RepositoryUrl>https://github.com/kzrnm/ac-library-csharp</RepositoryUrl>
<PackageReleaseNotes>https://github.com/kzrnm/ac-library-csharp/blob/main/CHANGELOG.md</PackageReleaseNotes>

<Version>3.6.2</Version>
<AssemblyVersion>3.6.2.101</AssemblyVersion>
<Version>3.7.0</Version>
<AssemblyVersion>3.7.0.101</AssemblyVersion>
<RepositoryCommit Condition="'$(GIT_COMMIT)' != ''">$(GIT_COMMIT)</RepositoryCommit>

<SignAssembly>True</SignAssembly>
Expand Down
24 changes: 23 additions & 1 deletion Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,22 @@ public void Enqueue(T value)
UpdateUp(Count - 1);
}
[MethodImpl(256)]
public bool TryPeek(out T result)
{
if (Count == 0)
{
result = default;
return false;
}
result = data[0];
return true;
}
[MethodImpl(256)]
public bool TryDequeue(out T result)
{
if (Count == 0)
{
result = default(T);
result = default;
return false;
}
result = Dequeue();
Expand Down Expand Up @@ -78,6 +89,17 @@ public T EnqueueDequeue(T value)
return res;
}
/// <summary>
/// Dequeue してから <paramref name="value"/> を Enqueue(T) します。
/// </summary>
[MethodImpl(256)]
public T DequeueEnqueue(T value)
{
var res = data[0];
data[0] = value;
UpdateDown(0);
return res;
}
/// <summary>
/// Dequeue した値に <paramref name="func"/> を適用して Enqueue(T) します。
/// </summary>
[MethodImpl(256)]
Expand Down
41 changes: 38 additions & 3 deletions Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp`2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,35 @@ public void Enqueue(TKey key, TValue value)
UpdateUp(Count - 1);
}
[MethodImpl(256)]
public bool TryPeek(out TKey key, out TValue value)
{
if (Count == 0)
{
key = default;
value = default;
return false;
}
(key, value) = (keys[0], values[0]);
return true;
}
[MethodImpl(256)]
public bool TryPeek(out KeyValuePair<TKey, TValue> result)
{
if (Count == 0)
{
result = default;
return false;
}
result = Peek;
return true;
}
[MethodImpl(256)]
public bool TryDequeue(out TKey key, out TValue value)
{
if (Count == 0)
{
key = default(TKey);
value = default(TValue);
key = default;
value = default;
return false;
}
(key, value) = Dequeue();
Expand All @@ -69,7 +92,7 @@ public bool TryDequeue(out KeyValuePair<TKey, TValue> result)
{
if (Count == 0)
{
result = default(KeyValuePair<TKey, TValue>);
result = default;
return false;
}
result = Dequeue();
Expand Down Expand Up @@ -101,6 +124,18 @@ public KeyValuePair<TKey, TValue> EnqueueDequeue(TKey key, TValue value)
return res;
}
/// <summary>
/// Dequeue してから <paramref name="value"/> を Enqueue(T) します。
/// </summary>
[MethodImpl(256)]
public KeyValuePair<TKey, TValue> DequeueEnqueue(TKey key, TValue value)
{
var res = KeyValuePair.Create(keys[0], values[0]);
keys[0] = key;
values[0] = value;
UpdateDown(0);
return res;
}
/// <summary>
/// Dequeue した値に <paramref name="func"/> を適用して Enqueue(T) します。
/// </summary>
[MethodImpl(256)]
Expand Down
77 changes: 69 additions & 8 deletions Test/ac-library-csharp.Test/STL/PriorityQueueTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,11 @@ public void Simple()
pq.Enqueue(-lx);
foreach (var lx in list)
{
pq.TryDequeue(out var res).Should().BeTrue();
pq.TryPeek(out var res).Should().BeTrue();
pq.TryDequeue(out res).Should().BeTrue();
res.Should().Be(-lx);
}
pq.TryPeek(out _).Should().BeFalse();
pq.TryDequeue(out _).Should().BeFalse();
pq.Count.Should().Be(0);
}
Expand Down Expand Up @@ -110,7 +112,8 @@ public void SimpleKV()
pq.Enqueue(-lx, lx);
foreach (var lx in list)
{
pq.TryDequeue(out var res).Should().BeTrue();
pq.TryPeek(out var res).Should().BeTrue();
pq.TryDequeue(out res).Should().BeTrue();
res.Should().Be(KeyValuePair.Create(-(long)lx, lx));
}
pq.TryDequeue(out _).Should().BeFalse();
Expand All @@ -120,10 +123,14 @@ public void SimpleKV()
pq.Enqueue(-lx, lx);
foreach (var lx in list)
{
pq.TryDequeue(out var key, out var val).Should().BeTrue();
pq.TryPeek(out var key, out var val).Should().BeTrue();
key.Should().Be(-lx);
val.Should().Be(lx);
pq.TryDequeue(out key, out val).Should().BeTrue();
key.Should().Be(-lx);
val.Should().Be(lx);
}
pq.TryPeek(out _, out _).Should().BeFalse();
pq.TryDequeue(out _, out _).Should().BeFalse();
pq.Count.Should().Be(0);
}
Expand Down Expand Up @@ -270,8 +277,62 @@ void EnqueueDequeue(int value)
}
}


[Fact]
public void DequeueEnqueue()
{
var pq1 = new PriorityQueue<int>();
var pq2 = new PriorityQueue<int>();
for (int i = 10; i > 0; i--)
{
pq1.Enqueue(i);
pq2.Enqueue(i);
}
var mt = MTRandom.Create();

for (int i = -1; i < 20; i++)
{
DequeueEnqueue();
}

void DequeueEnqueue()
{
var value = mt.Next();
pq1.DequeueEnqueue(value).Should().Be(pq2.Dequeue());
pq2.Enqueue(value);
pq1.Unorderd().ToArray().Should().BeEquivalentTo(pq2.Unorderd().ToArray());
}
}

[Fact]
public void DequeueEnqueueKV()
{
var pq1 = new PriorityQueueDictionary<int, string>();
var pq2 = new PriorityQueueDictionary<int, string>();
for (int i = 10; i > 0; i--)
{
pq1.Enqueue(i, i.ToString());
pq2.Enqueue(i, i.ToString());
}
var mt = MTRandom.Create();

for (int i = -1; i < 20; i++)
{
DequeueEnqueue();
}

void DequeueEnqueue()
{
var key = mt.Next();
var value = mt.Next().ToString();
pq1.DequeueEnqueue(key, value).Should().Be(pq2.Dequeue());
pq2.Enqueue(key, value);
pq1.UnorderdKeys().ToArray().Should().BeEquivalentTo(pq2.UnorderdKeys().ToArray());
pq1.UnorderdValues().ToArray().Should().BeEquivalentTo(pq2.UnorderdValues().ToArray());
}
}
[Fact]
public void DequeueEnqueueFunc()
{
var pq1 = new PriorityQueue<int>();
var pq2 = new PriorityQueue<int>();
Expand All @@ -285,10 +346,10 @@ public void DequeueEnqueue()

for (int i = -1; i < 20; i++)
{
EnqueueDequeue();
DequeueEnqueue();
}

void EnqueueDequeue()
void DequeueEnqueue()
{
pq2.Enqueue(func(pq2.Dequeue()));
pq1.DequeueEnqueue(func);
Expand All @@ -297,7 +358,7 @@ void EnqueueDequeue()
}

[Fact]
public void DequeueEnqueueKV()
public void DequeueEnqueueFuncKV()
{
var pq1 = new PriorityQueueDictionary<int, string>();
var pq2 = new PriorityQueueDictionary<int, string>();
Expand All @@ -311,10 +372,10 @@ public void DequeueEnqueueKV()

for (int i = -1; i < 20; i++)
{
EnqueueDequeue();
DequeueEnqueue();
}

void EnqueueDequeue()
void DequeueEnqueue()
{
var (k, v) = pq2.Dequeue();
var (ek, ev) = func(k, v);
Expand Down

0 comments on commit 8a68f67

Please sign in to comment.