什么是编制转换表算法的最有效方法

时间:2017-08-16 12:03:16

标签: vba algorithm logic

我想知道您对以下内容的看法:

我需要转换1到3个值,并在使用转换表时将其转换为单个值:

enter image description here

以下是一个例子:

低+高+高=中等

中+高+高=

您认为对此算法进行编程的最有效方法是什么?我将使用的语言是VBA(Excel)

我已经考虑过制作很多嵌套的If语句,但是我的编程意识告诉我这是一种更简单的方法。

提前致谢!

3 个答案:

答案 0 :(得分:2)

是否需要桌子?

如果您取三个值的总和,则得到以下对应关系:

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)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

“效率最高”是非常主观的。我会将所有值放入一个数组(不是那么多)并使用基于您的值的索引访问它。

  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 = Meddium,2 =高

  3. 定义您的功能(如果您愿意,可以输入):

  4. 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
    

    这将是快而短的。只需要在使用前稍微处理一下你的数据!