通过带有范围的多个参数搜索对象的高效设计

Vla*_*lad 5 c# algorithm indexing search in-memory-database

我在内存中有一组相同类型的对象,每个对象都有多个不可变int属性(但不仅仅是它们).

我需要在那里(或多个)找到一个对象,其属性在指定值附近的小范围内.例如a == 5+-1 && b == 21+-2 && c == 9 && any d.

存储对象的最佳方法是什么,所以我可以像这样有效地检索它们?

我考虑过制作SortedList每个属性并使用,BinarySearch但我有很多属性,所以我希望有一个更通用的方式,而不是这么多SortedLists.

集合本身不是不可变的很重要:我需要能够添加/删除项目.

是否存在像对象(不仅仅是数据)的内存数据库?

小智 0

只是稍微扩展一下 @j_random_hacker 的答案:“估计选择性”的常用方法是为索引构建直方图。但是,您可能已经直观地知道哪个标准将产生“a == 5+-1 && b == 21+-2 && c == 9”中的最小初始结果集。最有可能的是“c == 9”,除非“c”存在大量重复值和小范围的潜在值。

因此,对谓词的简单分析将是一个简单的起点。平等条件很可能是最具选择性的(表现出最高的选择性)。

从那时起,RDBMS 将对结果集中的记录进行顺序扫描,以过滤剩余的谓词。这可能也是您最好的方法。

或者,有任何数量的内存中、占用空间小、支持 SQL 的 DBMS 可以为您完成繁重的工作(eXtremeDB、SQLite、RDM...google 是您的朋友)和/或具有赢得胜利的较低级别接口不会为您完成所有工作(仍然是大部分工作),但也不会将 SQL 强加于您。