Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 允许有效删除重复项的有序数据结构_C#_Java_Data Structures - Fatal编程技术网

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的解决方案就是你想要的。