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