Eu tenho dois programas de espaço de log e .
- Programa receberá entrada na matriz e criará a matriz de saída .
- Programa receberá como entrada como criado por e criar a partir dele a matriz de saída .
Eu tenho que escrever uma prova de que existe um programa de espaço de log , que receberá a matriz de entrada e criar a partir dela matriz correspondente . Mas não consigo encontrar a maneira correta de escrevê-lo. Como isso é feito?
Um programa de espaço de log é um programa que usa pedaços de memória. Aqui estão algumas condições que você deve manter:
Você precisa usar apenas variáveis que tenham um tipo inteiro simples (por exemplo,
int
em C ++,longint
em Pascal).O intervalo permitido de número inteiro é definido: se é o tamanho da entrada que podemos salvar em variáveis apenas valores que são dimensionados com base polimial com base em .
Por exemplo: podemos ter variáveis que podem assumir valores em , ou também valores , mas não podemos ter variáveis que assumirão valores em . Nenhum outro tipo de variável é permitido, nem matrizes e iteradores.
Exceções das regras sobre são entrada e saída. A entrada estará disponível em variáveis especiais (principalmente matrizes) das quais o seu programa pode apenas ler e a saída pode ser gravada apenas em outras variáveis especiais. Portanto, você não pode ler da saída e não pode aumentar os valores das variáveis de entrada etc.
Seus programas não podem usar recursão.
Exemplo de programa de espaço de log escrito em Pascal (para que todos possam entender) que encontrará o maior número na matriz de números inteiros
var n: integer; //input variable the number of elements in A
A: array [1..n] of integer; //input variable - the array of integers
m: integer; // output variable, the position of maximum
i, j: integer; //working variables
begin
j := 1;
for i := 2 to n do
if A[i] > A[j] then j := i;
m := j;
end;
As únicas duas variáveis aqui são j
e i
evidentemente levam valores em. Portanto, todas as condições são atendidas e realmente é um programa de espaço de log.
Respostas:
A idéia aqui é que não podemos calcular completamente a saída do primeiro algoritmo porque ele pode levar mais do que espaço logarítmico (pode ser polinomialmente grande). Mas não precisamos se formos inteligentes. O que podemos fazer é simular o segundo algoritmo e produzir os bits necessários a partir da saída do primeiro algoritmo on-line. Em outras palavras, simularemos a segunda máquina, quando ela quiser ler bitsEu da sua entrada, ou seja, o bit Eu a partir da saída da primeira máquina, paramos a simulação da segunda máquina, simulamos a primeira e contamos (mas não armazenamos) os bits que ela produz até a saída da Eu No momento, podemos parar a simulação da primeira máquina e continuar com a simulação da segunda máquina, pois agora temos o valor do que ela queria ler.
fonte