Pergunta

Fazer as relacionadas com o espaço benefícios do uso de um on-the-fly analisador superam o tempo e prestações de pré-gerada a tabela de pesquisa?


Versão longa:

Eu sou a criação de uma química ferramenta de referência, e estou incluindo um recurso que automaticamente o nome de fórmulas de conformidade com um padrão específico;exemplo: C[n]H[2n+2] => [n]ane;onde [n] é um número inteiro para o lado esquerdo;e um índice em uma matriz de nomes na RHS.(meth, eth, …)

Tanto quanto eu posso ver, isso pode ser implementado de duas maneiras:

  1. Eu pré-gerar uma chave/valor dupla de pesquisa de dicionário de formula <=> name pares;quando o aplicativo é iniciado (de inicialização mais lento), ou uma lista estática que é publicado com a aplicação (mais lento o download).

  2. As fórmulas são avaliadas na mosca por um parser.

No abordagem 1. nome => fórmula de pesquisa torna-se mais simples por uma ordem de magnitude;mas o gerador irá, a menos que eu queira navio de dezenas de megabytes de dados com o aplicativo, tem que ter um preset, e bastante baixo valor para n.

Além disso é o fato de que as fórmulas podem ter vários termos;como C[n]H[2n+1]OC[n']H[2n'+1];e para cada um destes, o número de possíveis correspondências aumenta geometricamente com n.Além disso, usando esta abordagem iria comer RAM como ninguém negócios.

Abordagem 2. permite-me apoio bastante grande de valores de n utilização de um relativamente pequeno para a tabela de pesquisa, mas faz name => fórmula de pesquisa um pouco mais complexo.Comparado com o pré-geração de arquivo para envio com o aplicativo, ele também permite-me corrigir erros na lógica de geração sem ter para enviar novos arquivos de dados.

Isso também requer que cada fórmula de ser comparado com um rápido teste para várias regras, determinando-se poderia ajuste;que, se há um monte de regras, leva tempo, o que pode levar a lentidão perceptível na interface.

A pergunta então é:

  1. Há considerações a compensação de eu ter falhado a conta, ou abordagens que eu não tenha considerado?

  2. As vantagens de usar um no-a-rapidamente analisador de justificar o aumento da complexidade de implementação?

Foi útil?

Solução

Você deve ir com a segunda abordagem.

Uma solução possível é um algoritmo ganancioso.Definir o conjunto de transformações como uma expressão regular (usado para testar o padrão) e uma função que é dada a regexp objeto de correspondência e retorna a transformada de seqüência de caracteres.

Expressões regulares não estão muito poderoso o suficiente para lidar com aquilo que você quer directamente.Em vez disso, você vai ter que fazer algo como:

m = re.match(r"C\[(\d+)\]H\[(\d+)]\]", formula)
if m:
    C_count, H_count = int(m.group(1)), int(m.group(2))
    match_size = len(m.group(0))
    if C_count*2+2 == H_count:
        replacement = alkane_lookup[C_count]
    elif C_count*2 == H_count:
        replacement = alkene_lookup[C_count]
    ...
    else:
        replacement = m.group(0)  # no replacement available

(além de muito mais para as outras possibilidades)

em seguida, incorporar isso em um ciclo que parece:

formula = "...."
new_formula = ""
while formula:
    match_size, replacement = find_replacement(formula)
    new_formula += replacement
    formula = formula[match_size:]

(Você vai precisar para lidar com o caso onde nada de jogos.Uma forma possível é a de incluir uma lista de todos os possíveis elementos no final de find_replacement(), que retorna o próximo elemento e contagens.)

Este é um algoritmo ganancioso, que não garante a menor solução.Isso é mais complicado, mas desde químicos-se ter idéias diferentes sobre a forma correta, eu não me preocupar muito com ele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top