Как я могу оптимизировать алгоритм множественного (матричного) переключения / случая? - PullRequest
5 голосов
/ 31 октября 2009

Можно ли оптимизировать этот (матричный) алгоритм:

//        | case 1 | case 2 | case 3 |
//  ------|--------|--------|--------|
//        |        |        |        |
//  case a|   a1   |   a2   |   a3   |
//        |        |        |        |
//  case b|   b1   |   b2   |   b3   |
//        |        |        |        |
//  case c|   c1   |   c2   |   c3   |
//        |        |        |        |

switch (var)
    {
      case 1:
      switch (subvar)
      {
        case a:
          process a1;
        case b:
          process b1;    
        case c:
          process c1;
      }
      case 2:
      switch (subvar)
      {
        case a:
          process a2;
        case b:
          process b2;    
        case c:
          process c2;
      }
      case 3:
      switch (subvar)
      {
        case a:
          process a3;
        case b:
          process b3;    
        case c:
          process c3;
      }
    }

Код довольно прост, но вы должны представить себе более сложный с большим количеством «switch / case».

Я работаю с 3 переменными. В зависимости от того, принимают ли они значения 1, 2, 3 или a, b, c или альфа, бета, у Чарли есть разные процессы для достижения. Можно ли оптимизировать его любым другим способом, кроме как через серию «переключатель / кейс»?

(вопрос уже задан на французском здесь ).

Редактировать : (из ответов Драна Дейна на комментарии ниже. Они также могут быть в этом более заметном месте!)
« optimize » следует понимать как наличие для записи меньшего количества кода , меньшего числа «переключатель / регистр». Идея состоит в том, чтобы улучшить удобочитаемость, удобство обслуживания , , а не производительность.

Возможно, есть способ написать меньше кода с помощью «Цепочки ответственности», но это решение не оптимально во всех отношениях, поскольку требует создания множества объектов в памяти.

Ответы [ 11 ]

0 голосов
/ 31 октября 2009

Возможно, вы хотите генерацию кода?

#! /usr/bin/python
first = [1, 2, 3]
second = ['a', 'b', 'c']

def emit(first, second):
    result = "switch (var)\n{\n"
    for f in first:
        result += " case {0}:\n switch (subvar)\n {{\n".format(f)
        for s in second:
            result += "  case {1}:\n   process {1}{0};\n".format(f,s)
        result += " }\n"
    result += "}\n"
    return result

print emit(first,second)
#file("autogen.c","w").write(emit(first,second))

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

...