2015-05-26 2 views
2

Я разрабатываю весовую матрицу для ориентированного взвешенного графика. и я должен вставлять бесконечность, а также в соответствии с правилами весовой матрицы.Лучшая альтернатива бесконечности для целых чисел

enter image description here

До сих пор я придерживаюсь с int.MaxValue встроена функцией C# ... После этого я использую эту весовую матрицу для алгоритма FloydWarshall, но из-за int.MaxValue я получаю очень большие числа в выходном , Я ищу альтернативу, которую можно понимать как бесконечность, но она не дает большой ценности ... ЧТО МОЖЕТ БЫТЬ АЛЬТЕРНАТИВА ...? помните, используя int.

+0

отрицательный? скажем, -1? –

+3

использовать 'int?' Вместо 'int' и использовать null для представления ∞? И взломать вашу реализацию, чтобы понять нули? –

+0

Я предлагаю что-то по строкам @Peter M и предлагаю вам не хранить целые числа напрямую. Вместо этого сохраните обертку, которая указывает значение Infinity или Integer, и вы можете запросить тип или состояние обертки, чтобы получить больше метаданных о вашем значении. – Tejs

ответ

5
  1. Вы можете использовать Nullable<int> (int? для краткости) и просто использовать null означает "бесконечность". Технически это, вероятно, будет хорошо, но это не идеальное семантическое представление того, что вы пытаетесь сделать. Также обратите внимание, что если вы используете математические операции (добавление, умножение и т. Д.), То семантика для значений null, вероятно, не всегда будет соответствовать тому, что вы хотите, представляя бесконечность, поэтому будьте осторожны, когда вы используете таких операторов и что вы на самом деле хотите их делать, когда значения равны нулю/бесконечны.

  2. Вы можете использовать double, который поддерживает нечисловые значения, такие как Infinity. Конечно, вы должны были бы хранить значения с плавающей запятой, а не целые числа. Это может быть или не быть недостатком, с которым вы можете жить в своем приложении, в зависимости от количества значимых цифр, которые вам нужны, и от того, насколько вы чувствительны к проблемам памяти/производительности.

  3. Создайте свой собственный тип, который обертывает целое число (или целое число с нулевым числом), но также имеет представление для бесконечности. Это будет выглядеть так же, как Nullable, и, вероятно, будет иметьочень похожий публичный API, но просто будет использовать логическое значение для отслеживания того, является ли значение бесконечным, а не имеет ли оно значение. В основном это был бы способ переименования частей публичного API int? в соответствии с вашим предполагаемым использованием. Это может выглядеть нечто похожее на это:

    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 
    } 
    

Обратите внимание, что вы можете обрабатывать бесконечные значения по-разному при выполнении различных операторов, чем обнуляемого значений обрабатываются, или вы не можете, это зависит от того, что вы так что просто подумайте о том, что должно произойти.

+0

Обратите внимание, что получение значения бесконечного целого приведет к исключению. https://msdn.microsoft.com/en-us/library/ydkbatt6(v=vs.110).aspx –

Смежные вопросы