2017-08-16 23 views
0

我想知道你的意见是什么的最有效的方法如下:什么编程转换表的算法

我需要1转换为3个值,使之成为一个单一的价值,同时利用转换表:

enter image description here

下面是一个例子:

低+高+高=中等

培养基+我dium +高=高

你们认为什么是编程这种算法最有效的方式?我将使用的语言是VBA(Excel)

我已经想过要编写大量的嵌套If语句,但我的编程感觉告诉我有一个更简单的方法。

在此先感谢!

+1

“最高效”是非常主观的。你装什么?紧凑的代码,快速的代码,... –

+1

你可以使用上面的内容,并在那里找到组合,并转移到左边?也看看分组的逻辑,“所以如果1,2,3相等,它是价值,3或2低中,无低我总是高” –

+0

@LS_ᴅᴇᴠ紧凑确实是最想要的 – Krapton

回答

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) 
+0

美丽!我没有考虑不使用该表的可能性。谢谢! – Krapton

+0

@Krapton:参见可能会更新关于对称性。 –

+0

@Krapton:还要注意,我对总和7的观察是错误的,所以问题更加容易。 –

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 
+0

看起来不错!谢谢 – Krapton

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. 定义你的函数(和类型,如果你愿意的话):

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 

氏s会快而短。在使用前只需要处理一些数据!

+0

谢谢!我把它作为一个任务,这是PowerPoint演示文稿的一部分。我还没有把它放在excel表格中,因为我不确定这是处理这个问题的最好方法,但是你的回答很有趣! – Krapton

相关问题