【发布时间】:2013-10-15 19:06:21
【问题描述】:
假设我想创建一个具有 10 个属性的 Class 集合,这个集合包含大约 1000 万个项目。
现在我想通过 Class 的任何属性以 O(1) 时间复杂度或接近 O(1) 搜索这个集合。(不仅仅是一个属性,即 ID 或 Name)
如果我通过 LINQ 查询使用 List 而不是它,它将需要 O(n) 时间复杂度,所以它不能被使用。
C# 的字典只能由一种键类型索引。所以也不能用。
作为一种解决方案,我可以为每个属性创建 10 个字典,但该解决方案需要大量内存,因为它有 1000 万个项目。所以这是不可行的。
附:我只想要内存解决方案(无数据库),并且可以通过类的任何单个属性搜索集合(例如 MyCollection[2] 或 MyCollection["John"] 或 MyCollection["12/12/2013"] 等)和搜索时间必须接近 O(1)。
那么我该如何实现这种数据结构呢??
【问题讨论】:
-
您知道有 10 个属性,假设它们是
ints 和字段以便于计算,因此每个 4 字节乘以 10 亿将使您处于约 40 GB 的内存范围,对吗?这只是物品,没有任何容器...... -
10 亿条内存记录 ???真的吗?
-
考虑到数据库通常确实创建额外的数据结构“索引”以改进对不同列的搜索(这在概念上等同于您的属性),我怀疑这是可能的。另外,您真的要在内存中存储 10 亿个项目吗?这是很多内存
-
OrderedDictionary?但它是非通用的 -
每个“键”都需要一个单独的索引。最终,唯一的 O(1) 解决方案将是 10 个独立的字典,并具有适当的哈希函数。
标签: c# data-structures dictionary indexing in-memory