【问题标题】:Is there an efficient index persistent data structure with multiple indexes是否存在具有多个索引的高效索引持久数据结构
【发布时间】:2009-10-23 21:05:36
【问题描述】:

我正在寻找一种高效的索引持久数据结构。我通常在 .NET 中工作,并且知道 FSharp 的 Map,但是该实现和我知道的大多数其他实现只提供了一个“索引”,即映射的左侧。

基本上是这样的场景

public class MyObject
    public int Id { get; }
    public int GroupId { get; }
    public string Name { get; }

其中对象的 ID 将是添加的全局唯一项集。 GroupId 可能有重复的值,我希望能够查询具有匹配 GroupId 的所有值,并且在 GroupId 内名称将是唯一的,但可能在不同的 GroupId 之间重复。这不是我可以简单地创建 3 个字段的复合键的情况,因为我需要根据特定字段值独立访问项目组。

我可以做到这一点,并且在过去使用字典中的字典,这已在 STackoverflow 上的其他帖子中推荐过......但是,我也希望数据结构是 1) 完全持久化和一切意味着 2)内存高效——意味着版本需要共享尽可能多的节点 3) 修改效率高 - 我希望它快

我意识到我在这里要求很多,但我想要求避免即使已经完成了重新发明轮子。

谢谢

【问题讨论】:

  • 在 F# 中;它可能是左侧的单个索引,但我相信如果您单独插入它们并在右侧使用相同的数据,每个都应该指向该数据的相同引用。

标签: data-structures functional-programming immutability


【解决方案1】:

我不确定为什么在其他地方以及对您问题的现有答复中,人们建议使用现有结构。重叠结构(映射的映射、列表的映射、字典的字典……)仅适用于两个索引,如果一个比另一个更松散(两个值对 Index1 具有相同的索引意味着这两个值对 Index2 具有相同的索引),这是一个不必要的约束。

我会使用地图记录,其中的数量可以根据需要使用不同的索引,并且我会保持地图中存在的每个值都存在于同一记录中的所有其他值中的不变性。添加一个值显然需要将其添加到记录中的所有映射中。同样用于删除。通过封装,可以使不变量无法从外部越界。

如果您担心存储在数据结构中的值会重复,请不要这样做。每个地图只包含一个指针。它们都将指向该值的相同单一表示。共享将与简单的单索引地图一样好。

【讨论】:

  • 帕斯卡,感谢您的评论。实际上,我使用的东西与您已经描述的非常接近,我只是想看看功能世界中是否已经存在更好的东西。我想我所希望的基本上是一个数据结构,它是一个功能数据库表,可以让我对内容进行非常快速有效的查找。
【解决方案2】:

就像您可以使用字典词典一样,我希望例如F# Map of Maps 可能是您想要的,例如

Map<int, Map<string, MyObject> >  // int is groupid, string is name

也许?我不清楚您是否还需要通过整数 id 快速访问。

您还可以查看 Clojure 的库;我对 Clojure 了解不多,但一系列高效的持久数据结构似乎是 Clojure 的强项之一。

【讨论】:

  • 我知道 clojure。我正在寻找的是一个为我处理多键查找的集成数据结构。一张地图可以工作,但这意味着管理所有地图替换必须由我来完成,以保持结构的持久性。
【解决方案3】:

您似乎正在尝试将 OOP 原则应用于您的 FP 应用程序。

如果你从功能的角度来思考,你想要做什么?

例如,如果您使用 List,您可以告诉它您想要拉取所有具有特定组值的对象。

如果您需要按组快速访问,您可以拥有一个列表地图,这样您就可以拉出一个组中的所有对象。

有不同的数据结构和适用于每种数据结构的许多功能,但您应该首先从功能性而非面向对象的 POV 考虑您的问题。

【讨论】:

  • 感谢您的评论,但我想我是从功能的角度来看的。我需要一些更智能的东西,而不仅仅是列表并根据标准从它们中提取,因为我的结构中可能包含大约 4-5 百万个项目,并且它们都需要立即存储在内存中。此外,我需要尽可能接近 O(1) 访问,这意味着仅使用列表和过滤器效率不够
猜你喜欢
  • 2013-04-17
  • 1970-01-01
  • 2019-09-30
  • 2013-01-06
  • 1970-01-01
  • 2017-12-16
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多