我正在为定向加权图开发权重矩阵。我必须根据权重矩阵的规则插入无穷大。
到目前为止,我坚持使用C#的int.MaxValue
内置函数...
在此之后我将这个权重矩阵用于FloydWarshall算法,但由于int.MaxValue,我在输出中获得了非常大的数字。我正在寻找一种可以被理解为无限的替代方案,但它并没有给出很大的价值......什么可以替代...?记得使用int。
答案 0 :(得分:5)
您可以使用Nullable<int>
(简称int?
)并使用null
表示“无限”。从技术上讲,这可能会很好,但它不是你想要做的理想的语义表示。另请注意,如果使用数学运算(加法,乘法等),null
值的语义可能并不总是与表示无穷大时所需的值匹配,因此在使用此类运算符时要小心,当值为null /无限时,你真正希望他们做什么。
您可以使用double
,它支持Infinity
等非数字值。当然,您将存储浮点值,而不是整数。这可能是也可能不是您可以在应用程序中使用的缺点,具体取决于您需要的重要数字的数量,以及您对内存/性能问题的敏感程度。
创建自己的包装整数(或可以为空的整数)的类型,但也有无穷大的表示。这基本上看起来就像Nullable
,并且可能有一个非常类似的公共API,但只是使用布尔来跟踪值是否是无限的,而不是是否或不是它有价值。它基本上只是一种重命名int?
的公共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
}
请注意,在执行不同的运算符而不是处理可空值时,您可能希望以不同的方式处理无限值,或者您可能不会,这取决于您正在执行的操作,因此只需花一些时间来考虑应该发生的事情。 / p>