我正在做一些文件分析,我在文件中标记探索的区域。现在我想找到未开发的区域,所以我知道下一步该看什么。这很像碎片整理软件显示的免费和使用区域。

示例:

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

c# - 哪种算法可以在数字范围内查找空的数字范围?-LMLPHP

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

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; }
}

问题:

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

最佳答案

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

关于c# - 哪种算法可以在数字范围内查找空的数字范围?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45578506/

10-11 21:59