Simule a concatenação de dois programas de espaço de log no espaço de log

7

Eu tenho dois programas de espaço de log F e G.

  • Programa F receberá entrada na matriz UMA[1 ..n] e criará a matriz de saída B[1 ..n].
  • Programa G receberá como entrada B como criado por F e criar a partir dele a matriz de saída C[1 ..n].

Eu tenho que escrever uma prova de que existe um programa de espaço de log H, que receberá a matriz de entrada UMA e criar a partir dela matriz correspondente C. 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 O(registron)pedaços de memória. Aqui estão algumas condições que você deve manter:

  1. Você precisa usar apenas variáveis ​​que tenham um tipo inteiro simples (por exemplo, intem C ++, longintem Pascal).

  2. O intervalo permitido de número inteiro é definido: se n é o tamanho da entrada que podemos salvar em variáveis ​​apenas valores que são dimensionados com base polimial com base em n.

    Por exemplo: podemos ter variáveis ​​que podem assumir valores em [-n...n], [-3n5...3n5] ou também valores [-4 ... 7], mas não podemos ter variáveis ​​que assumirão valores em [0 ... 2n]. Nenhum outro tipo de variável é permitido, nem matrizes e iteradores.

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

  4. 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 je ievidentemente levam valores em[1 ...n]. Portanto, todas as condições são atendidas e realmente é um programa de espaço de log.

Rafael
fonte
11
Essa é uma tarefa padrão na introdução da graduação aos cursos de complexidade computacional.
Kaveh
11
Dica: Quanto espaço é necessário para calcular B [i]? Como a produção de B à vontade ajuda na execuçãoG?
Yuval Filmus

Respostas:

3

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

Kaveh
fonte
Obrigado por apontar esse argumento! Por acaso, você sabe se esse truque de simulação tem um nome padrão e se existe um livro-padrão em que é apresentado com mais detalhes?
a3nm
11
iirc deve estar em Arora e Barak. Na complexidade da prova, chamamos{(x,Eu,b)(f(x))Eu=b} o gráfico de bits de f. Eu acho que também ouvi pessoas chamando isso de on-the-fly / on demand de computação de resultados intermediários.
Kaveh
11
Muito obrigado! De fato, está em Arora e Barak, Definição 4.16, onde é chamado "implicitamente espaço de log computável".
a3nm