Mô phỏng sự kết hợp của hai chương trình không gian log trong không gian log


7

Tôi đã có hai chương trình log-không gian và .FG

  • Chương trình sẽ nhận đầu vào trong mảng và sẽ tạo mảng đầu ra .FA[1..n]B[1..n]
  • Chương trình sẽ nhận đầu vào như được tạo bởi và tạo từ đó mảng đầu ra .GBFC[1..n]

Tôi phải viết một bằng chứng rằng có tồn tại chương trình không gian log , sẽ nhận được mảng đầu vào và tạo từ mảng tương ứng . Nhưng tôi không thể tìm ra cách viết chính xác. Làm thế nào được thực hiện?HAC


Chương trình không gian nhật ký là chương trình sử dụng các bit bộ nhớ . Dưới đây là một số điều kiện bạn phải giữ:O(logn)

  1. Bạn chỉ phải sử dụng các biến có kiểu số nguyên đơn giản (ví dụ inttrong C ++, longinttrong Pascal).

  2. Phạm vi số nguyên được phép được xác định: nếu là kích thước của đầu vào, chúng ta có thể lưu vào các biến chỉ các giá trị có kích thước đa hình dựa trên .nn

    Ví dụ: chúng ta có thể có các biến có thể nhận các giá trị trong , hoặc cả các giá trị , nhưng chúng ta có thể ' t có các biến sẽ đảm nhận các giá trị trong . Không có loại biến nào khác được cho phép, cũng không phải là mảng và vòng lặp.[n...n][-3n5...3n5][-4 ... 7][0 ... 2n]

  3. Ngoại lệ từ các quy tắc về là đầu vào và đầu ra. Đầu vào sẽ có sẵn trong các biến đặc biệt (chủ yếu là mảng) mà chương trình của bạn chỉ có thể đọc được và đầu ra chỉ có thể được ghi vào các biến đặc biệt khác. Vì vậy, bạn không thể đọc từ đầu ra và bạn không thể tăng giá trị của các biến đầu vào, v.v.

  4. Chương trình của bạn không thể sử dụng đệ quy.

Ví dụ về chương trình không gian log được viết bằng Pascal (để mọi người có thể hiểu nó) sẽ tìm thấy số lớn nhất trong mảng số nguyên

    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;

Hai biến duy nhất ở đây là jirõ ràng chúng lấy các giá trị trong . Do đó, tất cả các điều kiện được đáp ứng và nó thực sự là một chương trình không gian log.[1 ...n]


1
Đây là một bài tập tiêu chuẩn trong giới thiệu đại học cho các khóa học phức tạp tính toán.
Kaveh

1
Gợi ý: Cần bao nhiêu dung lượng để tính B [i]? Làm thế nào để sản xuất B theo ý muốn giúp chạy ? G
Yuval Filmus

Câu trả lời:


3

Ý tưởng ở đây là chúng ta không thể tính toán hoàn toàn đầu ra của thuật toán đầu tiên bởi vì nó có thể mất nhiều hơn không gian logarit (nó có thể lớn về mặt đa thức). Nhưng chúng ta không cần phải thông minh. Những gì chúng ta có thể làm là mô phỏng thuật toán thứ hai và tạo ra các bit cần thiết từ đầu ra của thuật toán đầu tiên trên mạng. Nói cách khác, chúng ta sẽ mô phỏng máy thứ hai, khi nó muốn đọc bit từ đầu vào của nó, tức là bit từ đầu ra của máy thứ nhất, chúng ta dừng mô phỏng của máy thứ hai, mô phỏng máy thứ nhất và đếm (nhưng không lưu trữ) các bit mà nó xuất ra cho đến khi nó xuất raTôiTôiTôibit lúc đó chúng ta có thể dừng mô phỏng của máy thứ nhất và tiếp tục với mô phỏng của máy thứ hai vì bây giờ chúng ta có giá trị của những gì nó muốn đọc.


Cảm ơn đã chỉ ra lập luận này! Trong bất kỳ trường hợp nào, bạn có biết liệu thủ thuật mô phỏng này có một tên tiêu chuẩn hay không, và nếu có một cuốn sách giáo khoa tiêu chuẩn nơi nó được trình bày chi tiết hơn?
a3nm

1
iirc nó nên ở Arora và Barak. Trong độ phức tạp chứng minh, chúng ta gọi đồ thị bit của . Tôi nghĩ rằng tôi cũng đã nghe người ta gọi nó là tính toán nhanh chóng / theo yêu cầu của kết quả trung gian. {(x,Tôi,b)|(f(x))Tôi= =b}f
Kaveh

1
Cảm ơn rất nhiều! Thật vậy, nó nằm trong Arora và Barak, Định nghĩa 4.16, nơi nó được gọi là "logspace ngầm tính toán".
a3nm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.