Skip to content

Commit

Permalink
Merge pull request #20 from naminodarie/feature/BinarySearch
Browse files Browse the repository at this point in the history
BinarySearch targets only IComparable<T>
  • Loading branch information
kzrnm authored Dec 20, 2020
2 parents e69dd40 + d568ef2 commit c9e2d93
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 8 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Raise AC0008 on Method
- Follow ac-library v1.3
- [Bug fix]Create all members in CreateOperatorCodeFixProvider
- BinarySearch targets only IComparable<T>

## [1.0.5] - 2020-12-18
### Added
Expand Down
22 changes: 14 additions & 8 deletions Source/AtCoderLibrary/STL/StlFunction.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using AtCoder.Internal;

Expand Down Expand Up @@ -62,6 +63,11 @@ public static NextPermutationEnumerator<T> NextPermutation<T>(IEnumerable<T> ori
#endregion NextPermutation

#region BinarySerch
private struct DefaultComparer<T> : IComparer<T> where T : IComparable<T>
{
public int Compare(T x, T y) => x.CompareTo(y);
}

/// <summary>
/// <paramref name="ok"/> と <paramref name="ng"/> の間で <paramref name="Ok"/>(i) == true を満たす最も <paramref name="ng"/> に近い値を取得します。
/// </summary>
Expand Down Expand Up @@ -118,7 +124,7 @@ public static long BinarySearch(long ok, long ng, Predicate<long> Ok)
/// <para>制約: <paramref name="a"/> がソート済み</para>
/// <para>計算量: O(log <paramref name="n"/>)</para>
/// </remarks>
public static int LowerBound<T>(this T[] a, T v) => BinarySearch(a.AsSpan(), v, Comparer<T>.Default, true);
public static int LowerBound<T>(this T[] a, T v) where T : IComparable<T> => BinarySearch(a.AsSpan(), v, default(DefaultComparer<T>), true);

/// <summary>
/// <paramref name="a"/> の要素のうち、<paramref name="v"/> より大きい値が現れる最小のインデックスを取得します。
Expand All @@ -136,7 +142,7 @@ public static long BinarySearch(long ok, long ng, Predicate<long> Ok)
/// <para>制約: <paramref name="a"/> がソート済み</para>
/// <para>計算量: O(log <paramref name="n"/>)</para>
/// </remarks>
public static int UpperBound<T>(this T[] a, T v) => BinarySearch(a.AsSpan(), v, Comparer<T>.Default, false);
public static int UpperBound<T>(this T[] a, T v) where T : IComparable<T> => BinarySearch(a.AsSpan(), v, default(DefaultComparer<T>), false);
/// <summary>
/// <paramref name="a"/> の要素のうち、<paramref name="v"/> 以上の値が現れる最小のインデックスを取得します。
/// </summary>
Expand All @@ -153,7 +159,7 @@ public static long BinarySearch(long ok, long ng, Predicate<long> Ok)
/// <para>制約: <paramref name="a"/> がソート済み</para>
/// <para>計算量: O(log <paramref name="n"/>)</para>
/// </remarks>
public static int LowerBound<T>(this IList<T> a, T v) => BinarySearch(a, v, Comparer<T>.Default, true);
public static int LowerBound<T>(this IList<T> a, T v) where T : IComparable<T> => BinarySearch(a, v, default(DefaultComparer<T>), true);

/// <summary>
/// <paramref name="a"/> の要素のうち、<paramref name="v"/> より大きい値が現れる最小のインデックスを取得します。
Expand All @@ -171,7 +177,7 @@ public static long BinarySearch(long ok, long ng, Predicate<long> Ok)
/// <para>制約: <paramref name="a"/> がソート済み</para>
/// <para>計算量: O(log <paramref name="n"/>)</para>
/// </remarks>
public static int UpperBound<T>(this IList<T> a, T v) => BinarySearch(a, v, Comparer<T>.Default, false);
public static int UpperBound<T>(this IList<T> a, T v) where T : IComparable<T> => BinarySearch(a, v, default(DefaultComparer<T>), false);
/// <summary>
/// <paramref name="a"/> の要素のうち、<paramref name="v"/> 以上の値が現れる最小のインデックスを取得します。
/// </summary>
Expand All @@ -188,7 +194,7 @@ public static long BinarySearch(long ok, long ng, Predicate<long> Ok)
/// <para>制約: <paramref name="a"/> がソート済み</para>
/// <para>計算量: O(log <paramref name="n"/>)</para>
/// </remarks>
public static int LowerBound<T>(this Span<T> a, T v) => BinarySearch(a, v, Comparer<T>.Default, true);
public static int LowerBound<T>(this Span<T> a, T v) where T : IComparable<T> => BinarySearch(a, v, default(DefaultComparer<T>), true);

/// <summary>
/// <paramref name="a"/> の要素のうち、<paramref name="v"/> より大きい値が現れる最小のインデックスを取得します。
Expand All @@ -206,7 +212,7 @@ public static long BinarySearch(long ok, long ng, Predicate<long> Ok)
/// <para>制約: <paramref name="a"/> がソート済み</para>
/// <para>計算量: O(log <paramref name="n"/>)</para>
/// </remarks>
public static int UpperBound<T>(this Span<T> a, T v) => BinarySearch(a, v, Comparer<T>.Default, false);
public static int UpperBound<T>(this Span<T> a, T v) where T : IComparable<T> => BinarySearch(a, v, default(DefaultComparer<T>), false);
/// <summary>
/// <paramref name="a"/> の要素のうち、<paramref name="v"/> 以上の値が現れる最小のインデックスを取得します。
/// </summary>
Expand All @@ -223,7 +229,7 @@ public static long BinarySearch(long ok, long ng, Predicate<long> Ok)
/// <para>制約: <paramref name="a"/> がソート済み</para>
/// <para>計算量: O(log <paramref name="n"/>)</para>
/// </remarks>
public static int LowerBound<T>(this ReadOnlySpan<T> a, T v) => BinarySearch(a, v, Comparer<T>.Default, true);
public static int LowerBound<T>(this ReadOnlySpan<T> a, T v) where T : IComparable<T> => BinarySearch(a, v, default(DefaultComparer<T>), true);

/// <summary>
/// <paramref name="a"/> の要素のうち、<paramref name="v"/> より大きい値が現れる最小のインデックスを取得します。
Expand All @@ -241,7 +247,7 @@ public static long BinarySearch(long ok, long ng, Predicate<long> Ok)
/// <para>制約: <paramref name="a"/> がソート済み</para>
/// <para>計算量: O(log <paramref name="n"/>)</para>
/// </remarks>
public static int UpperBound<T>(this ReadOnlySpan<T> a, T v) => BinarySearch(a, v, Comparer<T>.Default, false);
public static int UpperBound<T>(this ReadOnlySpan<T> a, T v) where T : IComparable<T> => BinarySearch(a, v, default(DefaultComparer<T>), false);
private static int BinarySearch<T, TOp>(this IList<T> a, T v, TOp cmp, bool isLowerBound)
where TOp : IComparer<T>
{
Expand Down

0 comments on commit c9e2d93

Please sign in to comment.