【问题标题】:Looking for a data structure with persistent sequential indexes寻找具有持久顺序索引的数据结构
【发布时间】:2012-10-23 12:55:14
【问题描述】:

我正在寻找一种基本上像这样工作的数据结构:

  • 结构是有序的值序列。
  • 每个插入的值都声称一个大于前一个索引的索引,不会被重用,也不会移动(它是持久的)。
  • 可以在一次操作中从结构中删除特定索引之前的所有项目。
  • 所有仍然存在的项目都可以通过它们的索引来访问。
  • 可以批量检索两个索引之间的所有项目。 (如果可以在添加新项目时检索它们,那也很棒。)

以上是我最好的实现猜测。我真正想要的属性是能够拥有一个保存某种书签值并且可以读取新项目而不会错过的消费者,并且能够在某个时间戳之前清除项目。但是,数据结构不需要知道时间戳;能够在特定索引之前删除所有内容。

我实现此结构的方式是保留项目计数开始位置的 int,然后直接保留项目列表或列表段列表。索引是某种原始整数,但不会在程序生命周期的实际时间跨度的几倍内回绕。

我所知道的最接近的结构是来自the LMAX Disruptor 的特定环形缓冲区。但是,如果消费者落后太远,这种结构也会阻塞,这不符合我的目的。消费者是面向批处理的,可能得不到频繁的 CPU 时间; Disruptor 最适用于专门的逻辑任务,持续针对环形缓冲区工作。

所以我要问的问题是:

  • 这个有名字吗?
  • 是否有针对 C# 或其他语言的实现?
  • 我的用例有更好的替代方案吗?

【问题讨论】:

    标签: c# .net data-structures


    【解决方案1】:

    不知道任何与此完全一样的预设集合,但您可以创建自定义集合对象,扩展 System.Collections.CollectionBase。

    public class MyCollection : CollectionBase
    {
        public MyCollection() { }
    

    此集合基础对象包含一个 List 属性,您可以以任何您喜欢的方式公开该属性,例如,添加一个 Add() 方法

    public int Add(Object o) // could by anything
    {
        return List.Add(o);
    }
    

    你可以有一个 GetRange(int start, int length) 来返回一个新集合,就像你填充返回集合一样,从基础集合中删除

    【讨论】:

    • +1,如果我没有找到任何其他答案,这基本上就是我将求助的方法。我知道在添加新项目或清除一些旧项目时读取一批项目会遇到一些问题(“集合已修改”并发枚举和变异),这就是为什么我要查看问题是否是已经通过其他方式解决了。
    • 如果您正在寻找即使集合发生变化也保持不变的索引,您可以使用 Dictionary 进行探索,并让持久索引成为“键”和对象值成为字典对的“值”
    • 这也是我的第一个想法,但是在获取一系列值方面会不会非常低效?从字典中取出一些东西是不变的,但它不一定要很快。我想我自己的用法可以保证我的值范围是连续的。
    • 如果你总是想要一个顺序范围,那么为什么需要持久索引呢?集合的默认枚举器将随着集合的变化调整索引,但他确实有助于确保您的项目保持顺序,您始终可以在索引处进行插入,将上述内容向上推。此外,如果您最终获得高值索引,然后清理集合,然后使用最高索引复制到数组,您最终会分配太多内存。
    • “集合的默认枚举器将随着集合的变化调整索引” - 不会是大多数集合的默认枚举器,或者至少不是我会考虑用作我自己的集合的集合的枚举器,抛出可怕的是(“集合已修改;枚举操作可能无法执行”)一旦发生更改?
    猜你喜欢
    • 2013-04-17
    • 2015-06-27
    • 1970-01-01
    • 2013-06-03
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多