【问题标题】:Multi Indexed in Collection with O(1) searching time集合中的多索引,搜索时间为 O(1)
【发布时间】: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


【解决方案1】:

你不能。您需要在内存或时间之间进行权衡。要么创建 10 个不同的索引(即 10 个内部字典)以获得 O(1) 查找时间,要么进行线性搜索以防止内存占用增加。

这些都是你的选择。没有什么灵丹妙药可以让你两全其美。

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2012-08-14
    相关资源
    最近更新 更多