我認爲你可以簡單地使用二叉搜索樹,或者更好的AVL(如果你不期待大量的插入或刪除)。
示例代碼:使用跨樹遍歷上限值(使用此repository通過bitlush AVL實現)
class Range<T> where T : IComparable<T>
{
public T LBound { get; set; }
public T UBound { get; set; }
public bool ContainsValue(T value)
{
return (this.LBound.CompareTo(value) <= 0) && (value.CompareTo(this.UBound) <= 0);
}
}
class RangeKeyComparer : IComparer<Range<double>>
{
public int Compare(Range<double> x, Range<double> y)
{
return x.UBound.CompareTo(y.UBound);
}
}
class RangeAvlTree<T, TValue> : AvlTree<Range<T>, TValue> where T : IComparable<T>
{
public RangeAvlTree(IComparer<Range<T>> comparer)
{
//update access modifier to 'protected' in base class
_comparer = comparer;
}
public bool Search(T searchKey, out TValue value)
{
//update access modifier to 'protected' in base class
AvlNode<Range<T>, TValue> node = _root;
while (node != null)
{
if (node.Key.ContainsValue(searchKey))
{
value = node.Value;
return true;
}
else if (searchKey.CompareTo(node.Key.UBound) == 1)
node = node.Right;
else if (searchKey.CompareTo(node.Key.UBound) == -1)
node = node.Left;
}
value = default(TValue);
return false;
}
}
使用
static void Main(string[] args)
{
var tree = new RangeAvlTree<double, string>(new RangeKeyComparer());
tree.Insert(new Range<double> { LBound = 0.0, UBound = 1.39 }, "Element: 0.0 - 1.39");
tree.Insert(new Range<double> { LBound = 1.4, UBound = 2.09 }, "Element: 1.4 - 2.09");
tree.Insert(new Range<double> { LBound = 2.1, UBound = 4.89 }, "Element: 2.1 - 4.89");
tree.Insert(new Range<double> { LBound = 4.9, UBound = 5.0 }, "Element: 4.9 - 5.00");
string element;
foreach(var value in new[] { 0.1, 1.41, 3, 2.04, 2.092, 4.93, 3.4 })
if (tree.Search(value, out element))
Console.WriteLine($"Found match: {value} matches {element}");
else
Console.WriteLine($"Not found: {value}");
Console.ReadLine();
}
來源
2017-05-26 17:32:14
Ada
顯示什麼......你試過和你卡住的地方。 SO不是代碼服務。 – HimBromBeere
你是否在像ex,(1; 10),(20; 35)之類的元素之間有孔值,或者它更像是<10; 15),<15; 23),<23; 53)? – Logman
@HimBromBeere我不是要求代碼。我以清晰簡潔的方式要求提供信息,這絕對是本網站的內容。 – user923