C# 数据结构类似于字典,但具有范围?

C# 数据结构类似于字典,但具有范围?,c#,data-structures,range,C#,Data Structures,Range,给定一个二叉树,它的每个节点都包含一个范围为的项,例如,一个特定节点可能包含范围为(1到1.23456) 如果查询元素小于或大于所描述的范围,它将检查相应的子元素。例如,它是1.3 如下所示,我们将查看右分支,执行2个“if”检查,看看它是否适合元素的范围 尽管平衡二叉搜索树(BST)是快速遍历数据集的一种优雅方式,但如果子项越来越多,“如果”检查的数量会显著增加。当必须每秒执行数百万次时,问题就更大了 是否有一种优雅的方法来存储对象,使得给定一个元素的值(例如1.3),它的值可以简单地输入到字

给定一个二叉树,它的每个节点都包含一个范围为的项,例如,一个特定节点可能包含范围为
(1到1.23456)

如果查询元素小于或大于所描述的范围,它将检查相应的子元素。例如,它是
1.3

如下所示,我们将查看右分支,执行2个“if”检查,看看它是否适合元素的范围

尽管平衡二叉搜索树(BST)是快速遍历数据集的一种优雅方式,但如果子项越来越多,“如果”检查的数量会显著增加。当必须每秒执行数百万次时,问题就更大了

是否有一种优雅的方法来存储对象,使得给定一个元素的值(例如1.3),它的值可以简单地输入到字典中?这将快速检索该值适合其范围的适当元素,如果不适合,则为null

然而,字典不检查范围,相反,它只需要一个值。因此,如果提供的键在项的范围内,是否有一个数据结构可以提供项

一个人也有类似的问题,但他发现内存被浪费了。有人建议他采用BST方法,但这是唯一的解决方案吗

很抱歉,如果有一个明显的答案,我可能会错过它。

你在问什么?区间树允许你在
O(logn)
时间内获得区间
x..y
上的所有元素。对于C#实现,我使用了调用的库,它工作得很好

在计算机科学中,区间树是一种有序的数据树 结构来保持间隔。具体来说,它允许 有效地查找与任何给定间隔或时间重叠的所有间隔 点。它通常用于窗口查询,例如,查找 计算机化地图上矩形视口内的所有道路,或 查找三维场景中的所有可见元素。类似的 数据结构是段树


为什么你认为带有范围键的字典会减少if()s?确切的问题是什么(使用已知的解决方案)无论如何?@DimitrisFousteris,解决方案是一个排序列表,仍然不能解决我在一行中多次使用if检查的问题。如果这是不可避免的,有没有一种超高效的方法来检查一个项目是否在给定范围内而不使用if(1O(1)您需要能够生成一个固定时间的hashcode来创建查找,以查找您试图查找的集合中的节点。要获得范围的工作hashcode并不容易,因此,如果没有针对您的唯一数据集的大量专门代码,您最好能做的就是
O(log n)
通过二进制搜索。@AwkwardSilence,这实际上取决于您的数据和用例。我将从IntervalTreeLib开始,看看它是如何工作的。不要忘记logN增长非常缓慢,您可能会对它的速度感到惊喜,不要忘了字典实际上不是一个恒定的检索(冲突)。logN(百万)=6.我可以为您提供一些解决方案,但您需要回答以下问题:1)范围是否不重叠,2)范围是否是静态的(例如,一旦建立了数据结构,您就无法添加/删除范围),3)为了获得更高的速度,您需要消耗多少内存?@ChrisEelmaa,谢谢您,Chris,在平面点位置,因为多边形区域是凸的,并且不是由许多顶点构成的,所以结构的大小不会增长,-我不必使用持久的BST。在从集合中引入/移除新顶点后,我可以重新构建树。我的情况不要求范围重叠,事实上,元素范围之间没有空值。最多有5-10个元素,所以我不认为BST是最好的选择。然而,这似乎是检查元素范围的唯一合理方法:/@AwkwardSilence对我来说似乎仍然有点不清楚。我建议你修改你的帖子,添加所有你能想到的细节。如果您的整个数据集只有10-15个元素,那么没有什么能比得上好的原始线性扫描。