2015-05-26 58 views
2

我正在開發有向加權圖的權重矩陣。而且我必須根據權重矩陣的規則插入無窮大。整數的無窮大的最佳替代方案

enter image description here

到目前爲止,我正在用的C#int.MaxValue內置函數... 堅持在這之後我使用FloydWarshall算法這個權重矩陣,但由於int.MaxValue我得到的輸出非常大的數字。我正在尋找一種可以理解爲無窮大的替代方案,但它並沒有給予什麼大的價值......可以替代的是......?記得使用int。

+0

負面?說,-1? –

+3

使用'int?'而不是'int',並使用null來表示∞?並破解你的實現來了解空值? –

+0

我建議沿着@Peter M的方向,並建議你不要直接存儲整數。而應該存儲一個指示Infinity或Integer值的包裝器,並且您可以查詢包裝器的類型或狀態以獲取有關您的值的更多元數據。 – Tejs

回答

5
  1. 你可以使用Nullable<int>int?的簡稱),只需使用null表示 「無窮大」。從技術上講,這可能會很好,但它不是你想要做的事情的理想語義表示。還要注意的是,如果使用數學運算(加法,乘法等),那麼null值的語義可能並不總是與表示無窮大時所需的語義相匹配,所以在使用這些運算符時要小心,以及您真正想要的他們在值爲null /無限時執行此操作。

  2. 您可以使用double,它支持非數字值,如Infinity。當然,你會存儲浮點值,而不是整數。這可能是也可能不是您可以在應用程序中生活的缺點,具體取決於您需要的有效數字的數量以及對內存/性能問題的敏感程度。

  3. 創建自己的包裝一個整數(或一個可空的整數)的類型,但也有無限的表示。這基本上看起來就像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 
    } 
    

注意,你可能需要執行不同的運營商不是空的值時,以不同的方式處理無限值的處理方式,或者你可能不會,這取決於你在做什麼做,所以只需要一些時間來考慮應該發生什麼。

+0

請注意,接收無限整數的值將引發異常。 https://msdn.microsoft.com/en-us/library/ydkbatt6(v=vs.110).aspx –