整数无穷大的最佳替代方案

Best Alternative to the infinity for integers

我正在为有向加权图开发权重矩阵。而且我还必须根据权重矩阵的规则插入无穷大。

到目前为止,我一直在使用 int.MaxValueC# 的内置函数... 在此之后,我将这个权重矩阵用于 FloydWarshall 算法,但由于 int.MaxValue 我在输出中得到了非常大的数字。我正在寻找一种可以理解为无穷大的替代方案,但它并没有提供很大的价值......可以选择什么......?记得使用 int.

  1. 您可以使用 Nullable<int>(简称 int?),只需使用 null 表示 "infinity"。从技术上讲,这可能没问题,但它不是您正在尝试做的事情的理想语义表示。另请注意,如果您使用数学运算(加法、乘法等),null 值的语义在表示无穷大时可能并不总是与您想要的相匹配,因此在使用此类运算符时要小心,并且当值为 null/infinite.

  2. 时,您实际希望他们做什么
  3. 您可以使用 double,它支持非数字值,例如 Infinity。当然,您将存储浮点值,而不是整数。这可能是也可能不是您可以在申请中接受的缺点,具体取决于您需要的有效数字的数量以及您对 memory/performance 问题的敏感程度。

  4. 创建您自己的类型,它包含一个整数(或可为 null 的整数),但也具有无穷大的表示形式。这基本上看起来就像 Nullable,并且可能有一个 非常 类似 public API,但只是使用布尔值来跟踪是否与否的价值是无限的,而不是它是否有价值。它基本上只是一种重命名 int? 的 public API 部分的方法,以符合您的预期用途。它可能看起来类似于:

    public struct InfiniteInteger
    {
        private int? value;
        public InfiniteInteger()
        {
            this.value = null;
        }
        public InfiniteInteger(int value)
        {
            this.value = value;
        }
        public int Value { get { return value.Value; } }
        public bool IsInfinite { get { return value.HasValue; } }
        //todo explicit/implicit conversion operators as you see fit
        //todo override math operators (+, -, *, %, etc.) as you see fit
        //todo override equality/comparison operators; 
        // these can just be passed down directly to the wrapped value's implementation
    }
    

请注意,在执行不同的运算符时,您可能希望以不同的方式处理无限值,而不是处理可空值,或者您可能不希望,这取决于您在做什么,所以花点时间想想应该发生什么.