namespace Search { using System; public static partial class Extensions { /// Use Binary Search to find index of GLB for value /// type of entries and value /// array of entries /// search value /// entries must be in ascending order /// index into entries of GLB for value public static int RecursiveBinarySearchForGLB(this T[] entries, T value) where T : IComparable { return entries.RecursiveBinarySearchForGLB(value, 0, entries.Length - 1); } /// Use Binary Search to find index of GLB for value /// type of entries and value /// array of entries /// search value /// leftmost index to search /// rightmost index to search /// entries must be in ascending order /// index into entries of GLB for value public static int RecursiveBinarySearchForGLB(this T[] entries, T value, int left, int right) where T : IComparable { if (left <= right) { var middle = left + (right - left) / 2; return entries[middle].CompareTo(value) < 0 ? entries.RecursiveBinarySearchForGLB(value, middle + 1, right) : entries.RecursiveBinarySearchForGLB(value, left, middle - 1); } //[Assert]left == right + 1 // GLB: entries[right] < value && value <= entries[right + 1] return right; } /// Use Binary Search to find index of LUB for value /// type of entries and value /// array of entries /// search value /// entries must be in ascending order /// index into entries of LUB for value public static int RecursiveBinarySearchForLUB(this T[] entries, T value) where T : IComparable { return entries.RecursiveBinarySearchForLUB(value, 0, entries.Length - 1); } /// Use Binary Search to find index of LUB for value /// type of entries and value /// array of entries /// search value /// leftmost index to search /// rightmost index to search /// entries must be in ascending order /// index into entries of LUB for value public static int RecursiveBinarySearchForLUB(this T[] entries, T value, int left, int right) where T : IComparable { if (left <= right) { var middle = left + (right - left) / 2; return entries[middle].CompareTo(value) <= 0 ? entries.RecursiveBinarySearchForLUB(value, middle + 1, right) : entries.RecursiveBinarySearchForLUB(value, left, middle - 1); } //[Assert]left == right + 1 // LUB: entries[left] > value && value >= entries[left - 1] return left; } } }