Sự đánh đổi không gian thời gian cho vấn đề yếu tố thiếu


14

Đây là một vấn đề nổi tiếng.

Với một mảng A[1n] các số nguyên dương, sản lượng các số nguyên dương nhỏ nhất không trong mảng.

Vấn đề có thể được giải quyết trong không gian và thời gian O(n) : đọc mảng, theo dõi trong không gian O(n) cho dù xảy ra 1,2,,n+1 , quét tìm phần tử nhỏ nhất.

Tôi nhận thấy bạn có thể giao dịch không gian cho thời gian. Nếu bạn có O(nk)chỉ bộ nhớ, bạn có thể làm điều đó trongkvòng và nhận thời gianO(kn). Trong một trường hợp đặc biệt, rõ ràng có thuật toán bậc hai không gian thời gian không đổi.

Câu hỏi của tôi là:

Đây có phải là sự cân bằng tối ưu, tức là không ? Nói chung, làm thế nào để chứng minh loại giới hạn như vậy?timespace=Ω(n2)

Giả sử mô hình RAM, với số học giới hạn và truy cập ngẫu nhiên vào các mảng trong O (1).

Cảm hứng cho vấn đề này: sự đánh đổi không gian thời gian cho các palindromes trong mô hình một băng (xem ví dụ ở đây ).


2
Không, bạn có thể sắp xếp mảng của mình trong sau đó tìm số bị thiếu (số thứ nhất phải là 1, thứ hai là 2, ... nếu không bạn sẽ tìm thấy nó) trong O (n), việc sắp xếp này có thể được thực hiện với sự hợp nhất tại chỗ, có nghĩa là không gian thêm O ( 1 ) , vì vậy thời gian không gian thuộc về O ( n log n ) . Tôi không biết tôi có vấn đề của bạn chính xác hay không (vì điều này tôi đã không trả lời nó, tôi cũng không biết liệu có ràng buộc tốt hơn không). O(nlogn)O(1)O(nlogn)

Tôi giả sử đầu vào là chỉ đọc. (Nếu không, vấn đề có thể được giải quyết tối ưu trong không gian time / O ( 1 ) : nhân đầu vào với 2 và sử dụng tính chẵn lẻ để mô phỏng thuật toán O ( n ) / O ( n ) )O(n)O(1)O(n)/O(n)
sdcvvc

Thuật toán không gian không đổi là gì? Có vẻ như bạn sẽ cần không gian cho n 2 phiên bản đó là "rõ ràng" đối với tôilognn2
Xodarap

Trong mô hình này, số nguyên kích thước từ lấy ; nếu thuận tiện hơn, bạn có thể trả lời bất kỳ biến thể nào của câu hỏi với thời gian space = Ω ( n 2O(1)cho một sốkkhông đổi. timespace=Ω(n2logkn)k
sdcvvc

@sdcvvc, tôi không thể hiểu thuật toán bạn, bạn có thể mô tả thêm một chút không? (chỉ lưu ý rằng việc đọc thành bit sẽ mất O ( log n ) ). O(n)/O(1)O(logn)

Câu trả lời:


2

Điều này có thể được thực hiện trong các hoạt động từ O(nlogn)O(1) từ của bộ nhớ (tương ứng là O(nlog2n) và bộ nhớ O(logn) trong mô hình RAM cấp bit). Thật vậy, giải pháp sẽ dựa trên quan sát sau đây.

Nói có n0 chẵn và n1 số lẻ trong phạm vi [1,n+1] (để n0n1n0+n1=n+1 ). Sau đó, có b{0,1} sao cho có nhiều nhất nb1 giá trị b - 1 có chẵn lẻ b trong đầu vào. Thật vậy, nếu không thì có ít nhất n0chẵn và ít nhất n1 giá trị lẻ trong đầu vào, nghĩa là có ít nhất n0+n1=n+1 giá trị trong đầu vào, mâu thuẫn (chỉ có n trong số chúng). Điều đó có nghĩa là chúng ta chỉ có thể tiếp tục tìm kiếm số bị thiếu trong số các số lẻ hoặc chẵn. Thuật toán tương tự cũng có thể được áp dụng cho các bit cao hơn của ký hiệu nhị phân.

Vì vậy, thuật toán của chúng tôi sẽ trông như thế:

  1. Giả sử chúng ta đã bây giờ mà chỉ có x giá trị trong đầu vào với phần còn lại modulo 2b là như nhau để r[0,2b) nhưng có ít nhất x+1 số trong phạm vi [1,n+1] có còn lại r modulo 2b (khi bắt đầu, chúng tôi biết rằng chắc chắn cho b=0,r=0 ).

  2. Giả sử có các giá trị x0 trong đầu vào với các giá trị còn lại r modulo 2b+1x1 trong đầu vào với phần còn lại r+2b modulo 2b+1 (chúng ta có thể tìm thấy các số này trong một lần đi qua đầu vào). Rõ ràng, x0+x1=x . Hơn nữa, vì có ít nhất x+1 số trong đầu vào với số dư r modulo 2b , ít nhất một trong các cặp(r,b+1),(r+2b,b+1) thỏa mãn các yêu cầu của bước1 .

  3. Chúng tôi đã tìm thấy các số mất tích khi 2bn+1 : chỉ có một số trong phạm vi [1,n+1] có thể có dư r modulo 2b ( r chính nó nếu nó nằm trong phạm vi), do đó có ít hầu hết các giá trị 0 trong đầu vào có phần còn lại như vậy. Vì vậy, r thực sự là mất tích.

Rõ ràng, thuật toán tạm dừng trong các bước O(logn) , mỗi bước cần thời gian O(n) (vượt qua mảng đầu vào). Hơn nữa, chỉ có O(1) từ bộ nhớ được yêu cầu.


Tôi rất vui khi thấy câu hỏi được trả lời sau thời gian đó :)
sdcvvc

1

Nếu tôi hiểu định nghĩa của bạn, điều này có thể được thực hiện trong thời gian tuyến tính với không gian không đổi. Đây rõ ràng là giới hạn thấp nhất, bởi vì ít nhất chúng ta cần đọc toàn bộ đầu vào.

Câu trả lời được đưa ra trong câu hỏi này thỏa mãn.

Không thể chạy cái này với ít thời gian hoặc không gian hơn và việc thêm thời gian hoặc không gian là vô ích, vì vậy không có sự đánh đổi không gian thời gian ở đây. (Quan sát rằng , do đó, sự đánh đổi mà bạn quan sát không có bất thường, trong mọi trường hợp.)n=O(n/k)

Về câu hỏi chung của bạn, tôi không biết bất kỳ định lý hay nào sẽ giúp bạn chứng minh sự đánh đổi trong không gian. Câu hỏi này dường như chỉ ra rằng không có câu trả lời dễ dàng (đã biết). Về cơ bản:

Giả sử một số ngôn ngữ có thể quyết định được trong thời gian (sử dụng một số lượng không gian) và không gian s (sử dụng một lượng thời gian). Chúng ta có thể tìm thấy f , g sao cho L có thể quyết định bởi M chạy trong không gian f ( t , s )g ( t , s ) không?tsf,gLMf(t,s)g(t,s)

vẫn chưa được biết, và một câu trả lời mạnh mẽ sẽ giải quyết được rất nhiều vấn đề mở (đáng chú ý nhất là về SC), ngụ ý rằng không có giải pháp dễ dàng nào tồn tại.


EDIT: Ok, với sự lặp lại (nhưng tôi vẫn giả sử rằng với đầu vào có kích thước , số lượng tối đa có thể là n + 1 ).nn+1

Quan sát rằng thuật toán của chúng tôi cần có khả năng phân biệt giữa ít nhất câu trả lời có thể. Giả sử tại mỗi lần chuyển qua dữ liệu, chúng ta có thể nhận được tối đa k phần dữ liệu. Sau đó, chúng ta sẽ cần n / k vượt qua để phân biệt tất cả các câu trả lời. Giả sử k = n / s thì ta chạy trong nnkn/kk=n/sthời gian. Vì vậy, tôi nghĩ rằng điều này chứng minh những gì bạn muốn.nn/sn=sn

Khó khăn là trong việc chỉ ra rằng mỗi lần chúng ta chỉ nhận được bit. Nếu bạn cho rằng hoạt động hợp pháp duy nhất của chúng tôi là =, thì chúng tôi tốt. Tuy nhiên, nếu bạn cho phép các hoạt động phức tạp hơn, thì bạn sẽ có thể nhận được nhiều thông tin hơn.k


3
The question you linked assumes that each number appears at most once. I do not make this assumption, so the solution does not apply. Thank you for second link.
sdcvvc

@sdcvvc: My mistake, I assumed you were using the version I'm familiar with. I don't have a complete answer, but it's too long for a comment - hopefully my edit is useful.
Xodarap

5
Tôi không mua đối số của bạn sau khi "EDIT". Ngay cả khi bạn chỉ có thể thu thậpk các bit trong một lần chạy, về nguyên tắc là đủ để phân biệt2kđầu ra có thể. Vì vậy, đối số này chỉ có thể ngụ ý giới hạn dưới củan/2k vượt qua, không n/k.
JeffE
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.