【发布时间】:2020-12-06 07:24:01
【问题描述】:
最近,我了解到Sorted Dictionary 类实现了对键的二进制搜索,我想利用它来发挥我的优势。我正在制作一个piecewise 线性函数类,它表示一系列间隔上的线条集合。
我这样定义了一个Interval 类:
public class Interval : ICloneable, IComparable, IComparable<Interval>
{
public Interval()
{
}
public Interval(double start, double end)
{
Start = start;
End = end;
}
// Properties
public double Start { get; set; } = double.NaN;
public double End { get; set; } = double.NaN;
public double Span => End - Start;
// Methods
public object Clone() => MemberwiseClone();
public int CompareTo(object obj)
{
return Start.CompareTo(obj);
}
public int CompareTo([AllowNull] Interval other)
{
if (Start < other.Start)
{
return -1;
}
else if (Start > other.Start)
{
return 1;
}
else
{
return 0;
}
}
public bool Contains(double x) => Start <= x && x <= End;
public override string ToString() => $"[{Start}, {End}]";
}
而有问题的SortedDictionary 在分段函数类中的工作方式如下:
public class PiecewiseLinearFunction : ICloneable
{
...
// The dictionary
public SortedDictionary<Interval, Line2D> Functions { get; set; } = new SortedDictionary<Interval, Line2D>(); // Where Line2D is just a class that contains a function definition for a line
// Methods
public Interval FindInterval(double x)
=> Functions.Keys.Where(interval => interval.Contains(x)).FirstOrDefault();
public double Solve(double x)
{
var interval = FindInterval(x);
if (interval != null && Functions.ContainsKey(interval))
{
return Functions[interval].Solve(x);
}
else
{
return double.NaN;
}
}
}
如您所见,PiecewiseLinearFunction.FindInterval(double x) 方法线性搜索字典的键,以便找到包含(或不包含)x 的区间,可用于二进制查找,但这显然完全违背了进行二进制查找的目的。
我想知道是否可以以某种方式让字典查找 double x 值,并在检查 Interval.Contains(double x) 是 true 或 false 的同时对区间进行二进制搜索以确定是否存在有效区间(key)和对应的行,可用于获取x处的函数值。
换句话说,有没有办法使用谓词进行搜索,例如FindInterval(double x) => Functions.Keys.FindBinary(i => i.Contains(x))。
【问题讨论】:
-
你会面临双精度值的损失,应该使用某种公差
-
我同意,在完整的代码中还有很多改进之处,但我现在主要关心的是查找。
-
我不认为
SortedDictionary在内部使用二叉树这一事实对您有帮助。该类的所有使用者都知道字典键是排序的。您想对数据执行二进制搜索,但SortedDictionary不提供对数据的索引访问,因此不适合二进制搜索。 -
所以你的意思是我最好编写一个本身包含间隔和行的类,然后为该类的集合编写自定义二进制搜索?
-
如果间隔可以重叠,我需要一个封装的数据结构来跟踪额外信息以支持二进制搜索,仅自定义间隔类和二进制搜索是不够的。
标签: c# dictionary binary-search-tree