整数无穷大的最佳替代方案
Best Alternative to the infinity for integers
我正在为有向加权图开发权重矩阵。而且我还必须根据权重矩阵的规则插入无穷大。
到目前为止,我一直在使用 int.MaxValue
C# 的内置函数...
在此之后,我将这个权重矩阵用于 FloydWarshall 算法,但由于 int.MaxValue 我在输出中得到了非常大的数字。我正在寻找一种可以理解为无穷大的替代方案,但它并没有提供很大的价值......可以选择什么......?记得使用 int.
您可以使用 Nullable<int>
(简称 int?
),只需使用 null
表示 "infinity"。从技术上讲,这可能没问题,但它不是您正在尝试做的事情的理想语义表示。另请注意,如果您使用数学运算(加法、乘法等),null
值的语义在表示无穷大时可能并不总是与您想要的相匹配,因此在使用此类运算符时要小心,并且当值为 null/infinite.
时,您实际希望他们做什么
您可以使用 double
,它支持非数字值,例如 Infinity
。当然,您将存储浮点值,而不是整数。这可能是也可能不是您可以在申请中接受的缺点,具体取决于您需要的有效数字的数量以及您对 memory/performance 问题的敏感程度。
创建您自己的类型,它包含一个整数(或可为 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
}
请注意,在执行不同的运算符时,您可能希望以不同的方式处理无限值,而不是处理可空值,或者您可能不希望,这取决于您在做什么,所以花点时间想想应该发生什么.
我正在为有向加权图开发权重矩阵。而且我还必须根据权重矩阵的规则插入无穷大。
到目前为止,我一直在使用 int.MaxValue
C# 的内置函数...
在此之后,我将这个权重矩阵用于 FloydWarshall 算法,但由于 int.MaxValue 我在输出中得到了非常大的数字。我正在寻找一种可以理解为无穷大的替代方案,但它并没有提供很大的价值......可以选择什么......?记得使用 int.
您可以使用
Nullable<int>
(简称int?
),只需使用null
表示 "infinity"。从技术上讲,这可能没问题,但它不是您正在尝试做的事情的理想语义表示。另请注意,如果您使用数学运算(加法、乘法等),null
值的语义在表示无穷大时可能并不总是与您想要的相匹配,因此在使用此类运算符时要小心,并且当值为 null/infinite. 时,您实际希望他们做什么
您可以使用
double
,它支持非数字值,例如Infinity
。当然,您将存储浮点值,而不是整数。这可能是也可能不是您可以在申请中接受的缺点,具体取决于您需要的有效数字的数量以及您对 memory/performance 问题的敏感程度。创建您自己的类型,它包含一个整数(或可为 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 }
请注意,在执行不同的运算符时,您可能希望以不同的方式处理无限值,而不是处理可空值,或者您可能不希望,这取决于您在做什么,所以花点时间想想应该发生什么.