哪种算法可以在一系列数字中查找空的数字范围?

时间:2017-08-08 21:46:15

标签: c# algorithm data-structures range

我正在做一些文件分析,在那里我标记了文件中探索的区域。现在我想找到 un 探索的区域,所以我知道接下来要看什么。这非常类似于碎片整理软件显示的免费和使用区域。

示例:

在这张图片中,假设探索区域为红色,未探测区域为灰色区域。我需要确定这些红色区域的灰色区域边界。

enter image description here

我当前的代码,一个记录已阅读内容的自定义二进制阅读器:

public class CustomBinaryReader : BinaryReader {

    private readonly List<Block> _blocks;

    public CustomBinaryReader([NotNull] Stream input) : this(input, Encoding.Default) { }

    public CustomBinaryReader(Stream input, Encoding encoding, bool leaveOpen = true) : base(input, encoding, leaveOpen) {
        _blocks = new List<Block>();
    }

    public override byte[] ReadBytes(int count) {
        Log(count);
        return base.ReadBytes(count);
    }

    private void Log(int count) {
        _blocks.Add(new Block(BaseStream.Position, count));
    }

    private IEnumerable<Block> GetUnreadBlocks() {
        // how to get unread blocks in the stream, from read blocks ?
        throw new NotImplementedException();
    }
}

定义区域的类型:

public class Block {
    public Block(long position, long length) {
        Position = position;
        Length = length;
    }

    public long Position { get; }
    public long Length { get; }
}

问题:

是否有一类算法或数据结构可以解决此类问题(如树或图)?如果这样的事情不存在,你能否就如何解决这个问题给我一些方法或提示?

2 个答案:

答案 0 :(得分:2)

按位置顺序对使用过的区域进行排序。 找到每个的上限为position+length。 从那里开始,每个开放区域从一个区域的上限开始,直到(但不包括)下一个区域的下限。

答案 1 :(得分:1)

@Prune 的回答,这是完整的实施:

BinaryReader

这是做什么的:

它记录了Read...次读取的内容,并且可以返回已读取或未读取的区域。每个LoggedBinaryReader方法都由期刊记录。

实际上我需要这个用于旧的视频游戏模糊格式,为此我编写了一个解析器,在十六进制编辑器中浏览+ 300Kb的数据,其中包含奇怪的结构,以确保我读取整个文件是过度的,这个{{ 1}}立即告诉我我最终错过了什么:)