簡體   English   中英

編寫轉化表算法的最有效方法是什么

[英]What's the most efficient way of programming a conversion table algorithm

我想知道您對以下內容有何看法:

我需要在使用轉換表的同時將1到3的值轉換為一個值:

在此處輸入圖片說明

這是一個例子:

低+高+高=中

中+中+高=高

你們認為對這種算法進行編程的最有效方法是什么? 我將使用的語言是VBA(Excel)

我已經考慮過要制作很多嵌套的If語句,但是我的編程意識告訴我有一種更簡單的方法。

提前致謝!

需要桌子嗎?

如果將三個值相加,將得到以下對應關系:

Low: 3, 4 or 5
Medium: 6
High: 7, 8, or 9.

碼:

        P = V1 + V2 + V3
        If P < 6 Then
            R = 1
        ElseIf P < 7 Then
            R = 2
        Else
            R = 3
        End If

您也可以直接將總和制成表格,或使用公式

Sgn(V1 + V2 + V3 - 6) + 2

(因為三個變量必須以某種方式出現,所以很難做到更緊湊)。


實際上,由於分數是對稱的,因此初始表可能已經被壓縮為

111 => 1
112 => 1
113 => 1
122 => 1
123 => 2
222 => 2
223 => 3
233 => 3
333 => 3

最后說明

如果分數以(-1, 0, +1)比例表示,則公式可簡化為

Sgn(V1 + V2 + V3)
Sub heres_an_idea()

Dim dicLow As New Scripting.Dictionary
Dim dicMed As New Scripting.Dictionary
Dim dicHigh As New Scripting.Dictionary

dicLow.Add "LLL", ""
dicLow.Add "LLM", ""
dicLow.Add "LLH", ""

dicMed.Add "MMM", ""

dicHigh.Add "HHH", ""

If dicLow.Exists("MMM") Then
    'low
    Debug.Print "low"
ElseIf dicMed.Exists("MMM") Then
    'med
    Debug.Print "med"
ElseIf dicHigh.Exists("MMM") Then
    'high
    Debug.Print "high"
End If

End Sub

“最有效”是非常主觀的。 我會將所有值放入一個數組(數量不多),並根據您的值中的索引進行訪問。

  1. 考慮index = FirstValue + SecondValue*3 + ThirdValue*9

    FirstValue:0 = L1,1 = L2,2 = L3

    SecondValue,ThirdValue:0 = L1、1 = L2、2 = L3、3 =未使用

    (此設置不是最佳的,因為您可以將未使用的第二個與使用的第三個結合使用,但是可以截斷這些值!)

    這將導致3 *(3 * 4 + 1)= 39組合,一個小字符串!

  2. 將所有結果放入表中並組成一個字符串:

    myData = "000001011001012122011122122001012122012" ,其中0 =低,1 =中,2 =高

  3. 定義函數(如果需要,並輸入):

VBA代碼:

Enum myType
     L1 = 0
     L2 = 1
     L3 = 2
End Enum

Function getValue(ByVal V1 As myType, Optional ByVal V2 As myType = 3, Optional ByVal V3 As myType = 3)
        getValue = Array("Low", "Meddium", "High")(Mid("000001011001012122011122122001012122012", V1 + V2 * 3 + V3 * 9 + 1, 1))
End Function

這將是短暫的。 使用前只需要稍微處理一下數據即可!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM