Data structures 是否有一个具有多个索引的高效索引持久数据结构

Data structures 是否有一个具有多个索引的高效索引持久数据结构,data-structures,functional-programming,immutability,Data Structures,Functional Programming,Immutability,我正在寻找一个高效的索引持久数据结构。我通常在.NET中工作,并且知道FSharp的映射,但是该实现和我知道的大多数其他实现只提供一个“索引”,即映射的左侧 基本上情况就是这样 public class MyObject public int Id { get; } public int GroupId { get; } public string Name { get; } 其中,对象的Id将是全局唯一的添加项集。GroupId可能有重复的值,我希望能够使用匹配的Gr

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

基本上情况就是这样

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#地图,例如

Map<int, Map<string, MyObject> >  // int is groupid, string is name
Map//int是groupid,string是name
也许吧?我不清楚您是否也需要整数id快速访问


你也可以看看Clojure的图书馆;我对Clojure了解不多,但一系列高效的持久数据结构似乎是Clojure的优势之一。

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

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

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

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


有不同的数据结构和许多函数可以处理每种数据结构和函数,但您应该首先从功能而不是面向对象的角度来考虑您的问题。

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

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


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

In F#;左边可能是一个索引,但我相信如果你在右边分别插入相同的数据,每个索引都应该指向该数据的相同引用。我知道clojure。我要找的是一个集成的数据结构,可以为我处理多键查找。地图地图可以工作,但这意味着我必须管理所有地图替换,以保持结构的持久性。谢谢你的评论,但我认为我是从功能的角度来看它的。我需要一些更聪明的东西,而不仅仅是列表,然后根据标准从列表中提取,因为我的结构中可能包含大约400-500万个项目,而且它们都需要同时存储在内存中。此外,我需要获得尽可能接近O(1)的访问权限,这意味着简单地使用列表和过滤器是不够有效的enoughPascal,谢谢您的评论。实际上,我使用的是与你描述的非常接近的东西,我只是想看看功能世界中是否已经存在更好的东西。我想我希望的基本上是一个数据结构,它是一个功能数据库表,可以让我快速高效地查找内容。