C# 允许有效删除重复项的有序数据结构
我需要一个数据结构C# 允许有效删除重复项的有序数据结构,c#,java,data-structures,C#,Java,Data Structures,我需要一个数据结构 必须排序(将元素a、b和c添加到空结构中,将使它们位于位置0、1和2) 允许添加重复的项目。这就是,我可以有一个带有a,b,c,a,b的列表 允许删除给定项的所有引用(如果我执行类似于delete(1)的操作,它将删除结构中1的所有引用)。如果我有元素a,b,c,d,c,e并删除元素c,我应该得到a,b,d,e 我只需要通过两种方式访问元素。第一种是删除给定的ocorrence(参见上面的一点)时,另一种是将此结构中的数据转换为列表时 我真的不知道这里最好的数据结构是什么
- 必须排序(将元素
添加到空结构中,将使它们位于位置a、b和c
)0、1和2
- 允许添加重复的项目。这就是,我可以有一个带有
的列表a,b,c,a,b
- 允许删除给定项的所有引用(如果我执行类似于
的操作,它将删除结构中delete(1)
的所有引用)。如果我有元素1
并删除元素a,b,c,d,c,e
,我应该得到c
a,b,d,e
- 我只需要通过两种方式访问元素。第一种是删除给定的ocorrence(参见上面的一点)时,另一种是将此结构中的数据转换为列表时李>
O(n)
操作),但也许我遗漏了什么?树/堆呢?哈希表/映射
我必须假设我将使用此数据结构进行添加和删除
谢谢Apache Collections()的
包
界面应该满足您的要求。它有许多实现,所以可能还有一个跟踪插入顺序的实现(您的第一点)
它已经:
removeAll
删除(计数)
LinkedList
或ArrayList
相比,它也非常快,但我不确定是否插入了元素的索引
它被描述为
具有每个对象的多个副本的集合的包接口
apachecollections的
Bag
界面应该满足您的要求。它有许多实现,所以可能还有一个跟踪插入顺序的实现(您的第一点)
它已经:
removeAll
删除(计数)
LinkedList
或ArrayList
相比,它也非常快,但我不确定是否插入了元素的索引
它被描述为
具有每个对象的多个副本的集合的包接口
我认为您可能需要编写一个专用的数据结构(取决于您的效率要求) 类似于一个双链接列表,其中有一个额外的NexteQualitter和一个指向每个项目第一个的HashMap 然后,您可以快速找到要删除的第一个“b”,并按照所有NexteQualiters将其全部删除(双链接很容易保持列表完整)。 开销就是让地图保持最新。新项的NexteQualitter列表可以只指向map.put(key.nexteQualitter)返回的节点
我肯定会先使用一些简单的东西,只有在速度太慢时才插入这种东西。我认为您可能需要编写一个专用的数据结构(取决于您的效率要求) 类似于一个双链接列表,其中有一个额外的NexteQualitter和一个指向每个项目第一个的HashMap 然后,您可以快速找到要删除的第一个“b”,并按照所有NexteQualiters将其全部删除(双链接很容易保持列表完整)。 开销就是让地图保持最新。新项的NexteQualitter列表可以只指向map.put(key.nexteQualitter)返回的节点
我肯定会先使用一些简单的东西,并且只在速度太慢时插入这种东西。除了firstequaliter之外,HashMap还需要一个lastequaliter。新元素的插入变为O(1)。+1。在我看来,对问题的编辑使这个解决方案变得完美。HashMap除了FirstEqualiter之外还需要一个LastEqualiter。新元素的插入变为O(1)。+1。对这个问题的编辑使这个解决方案变得完美,依我看。你并没有真正提到你对“读取”访问的期望。例如,您是否通过职位访问元素?需要多快?移除特定元素后,位置会发生什么变化?另一个元素的位置会相应地改变吗?看起来Dave的解决方案就是你想要的。你没有真正提到你期望的“读取”访问是怎样的。例如,您是否通过职位访问元素?需要多快?移除特定元素后,位置会发生什么变化?另一个元素的位置会相应地改变吗?看起来Dave的解决方案就是你想要的。