Khởi động: bitvector ngẫu nhiên
Khi khởi động, chúng ta có thể bắt đầu với trường hợp mỗi bitvector được chọn iid một cách ngẫu nhiên. Sau đó, hóa ra vấn đề có thể được giải quyết trong thời gian (chính xác hơn, có thể được thay thế bằng ).O(n1.6min(k,lgn))lg 31.6lg3
Chúng tôi sẽ xem xét biến thể hai bộ sau đây của vấn đề:
Bộ cho của bitvectors, xác định nơi tồn tại một không chồng chéo cặp . s ∈ S , t ∈ TS,T⊆{0,1}ks∈S,t∈T
Kỹ thuật cơ bản để giải quyết điều này là phân chia và chinh phục. Dưới đây là thuật toán thời gian bằng cách sử dụng phép chia và chinh phục:O(n1.6k)
Tách và dựa trên vị trí bit đầu tiên. Nói cách khác, biểu mẫu , , , .T S 0 = { s ∈ S : s 0 = 0 } S 1 = { s ∈ S : s 0 = 1 } T 0 = { t ∈ T : t 0 = 0 } T 1 = { t ∈ T : t 0 = 1 }STS0={s∈S:s0=0}S1={s∈S:s0=1}T0={t∈T:t0=0}T1={t∈T:t0=1}
Bây giờ, hãy tìm đệ quy một cặp không chồng chéo từ , từ và từ . Nếu bất kỳ cuộc gọi đệ quy nào tìm thấy một cặp không chồng lấp, hãy xuất nó, nếu không thì xuất ra "Không tồn tại cặp chồng chéo".S 0 , T 1 T 1 , S 0S0,T0S0,T1T1,S0
Vì tất cả các bitvector được chọn ngẫu nhiên, chúng ta có thể mong đợi và . Do đó, chúng tôi có ba cuộc gọi đệ quy và chúng tôi đã giảm kích thước của vấn đề xuống hai lần (cả hai bộ đều giảm kích thước theo hệ số hai). Sau khi chia tách , một trong hai bộ giảm xuống kích thước 1 và vấn đề có thể được giải quyết trong thời gian tuyến tính. Chúng ta có một mối quan hệ lặp lại dọc theo các dòng , có giải pháp là . Kế toán thời gian chạy chính xác hơn trong trường hợp hai bộ, chúng ta thấy thời gian chạy là .| T b | ≈ | T | / 2 lg phút ( | S | , | T | ) T ( n ) = 3 T ( n / 2 ) + O ( n k ) T ( n ) = O ( n 1.6 k ) O|Sb|≈|S|/2|Tb|≈|T|/2lgmin(|S|,|T|)T(n)=3T(n/2)+O(nk)T(n)=O(n1.6k)O(min(|S|,|T|)0.6max(|S|,|T|)k)
Điều này có thể được cải thiện hơn nữa, bằng cách lưu ý rằng nếu , thì xác suất tồn tại một cặp không chồng chéo là nhỏ theo cấp số nhân. Cụ thể, nếu là hai vectơ ngẫu nhiên, xác suất chúng không trùng nhau là . Nếu , có cặp như vậy, do liên kết ràng buộc, xác suất tồn tại một cặp không chồng chéo là tối đa . Khi , đây là . Vì vậy, là bước tiền xử lý, nếux , y ( 3 / 4 ) k | S | = | T | = N n 2 n 2 ( 3 / 4 ) k k ≥ 2,5 lg n + 100 ≤ 1 / 2 100 k ≥ 2,5 lg n + 100k≥2.5lgn+100x,y(3/4)k|S|=|T|=nn2n2(3/4)kk≥2.5lgn+100≤1/2100k≥2.5lgn+100, sau đó chúng ta có thể trả về ngay lập tức "Không tồn tại cặp không chồng chéo" (xác suất này không chính xác là nhỏ không đáng kể), nếu không chúng ta chạy thuật toán trên.
Do đó, chúng tôi đạt được thời gian chạy của (hoặc cho biến thể hai bộ được đề xuất ở trên), trong trường hợp đặc biệt trong đó các bitvector được chọn thống nhất một cách ngẫu nhiên.O ( tối thiểu ( | S | , | T | ) 0.6 max ( | S | , | T | ) min ( k , lg n ) )O(n1.6min(k,lgn))O(min(|S|,|T|)0.6max(|S|,|T|)min(k,lgn))
Tất nhiên, đây không phải là một phân tích trường hợp xấu nhất. Bitvector ngẫu nhiên dễ dàng hơn đáng kể so với trường hợp xấu nhất - nhưng hãy coi nó như một sự khởi động, để có được một số ý tưởng mà có lẽ chúng ta có thể áp dụng cho trường hợp chung.
Bài học từ sự khởi động
Chúng ta có thể học được một vài bài học từ sự khởi động ở trên. Đầu tiên, phân chia và chinh phục (tách trên một vị trí bit) có vẻ hữu ích. Thứ hai, bạn muốn phân chia trên một vị trí bit với càng nhiều ở vị trí đó càng tốt; Càng có nhiều , kích thước của bài toán con bạn giảm càng ít.010
Thứ ba, điều này cho thấy vấn đề trở nên khó khăn hơn khi mật độ của trở nên nhỏ hơn - nếu có rất ít trong số các bitvector (chúng chủ yếu là ), vấn đề có vẻ khá khó khăn, vì mỗi lần phân tách giảm kích thước của các bài toán con một chút. Vì vậy, xác định mật độ là phân số của các bit là (nghĩa là trong số tất cả các bit ) và mật độ của vị trí bit là phân số của bitvector là tại vị trí .1 0 Δ 1 n k i 1 i110Δ1nki1i
Xử lý mật độ rất thấp
Bước tiếp theo, chúng ta có thể tự hỏi điều gì sẽ xảy ra nếu mật độ cực kỳ nhỏ. Nó chỉ ra rằng nếu mật độ ở mọi vị trí bit nhỏ hơn , chúng tôi đảm bảo rằng tồn tại một cặp không chồng chéo: có một đối số tồn tại (không mang tính xây dựng) cho thấy một số không chồng lấp cặp phải tồn tại. Điều này không giúp chúng tôi tìm thấy nó, nhưng ít nhất chúng tôi biết nó tồn tại.1/k−−√
Tại sao điều này là trường hợp? Giả sử rằng một cặp bitvector được bao phủ bởi vị trí bit nếu . Lưu ý rằng mỗi cặp bitvector chồng chéo phải được bao phủ bởi một số vị trí bit. Bây giờ, nếu chúng ta sửa một vị trí bit cụ thể , số lượng cặp có thể được bao phủ bởi vị trí bit đó nhiều nhất là . Tổng hợp trên tất cả của các vị trí bit, chúng tôi thấy rằng tổng số cặp được bao phủ bởi một số vị trí bit lài x i = y i = 1 i ( n Δ ( i ) ) 2 < n 2 / k k < n 2x,yixi=yi=1i(nΔ(i))2<n2/kk<n2. Điều này có nghĩa là phải tồn tại một số cặp không được bao phủ bởi bất kỳ vị trí bit nào, điều này ngụ ý rằng cặp này không chồng chéo. Vì vậy, nếu mật độ đủ thấp ở mọi vị trí bit, thì một cặp không chồng chéo chắc chắn tồn tại.
Tuy nhiên, tôi không thể xác định được một thuật toán nhanh để tìm ra một cặp không chồng chéo như vậy, trong các chế độ này, mặc dù một thuật toán được đảm bảo tồn tại. Tôi không thấy ngay bất kỳ kỹ thuật nào mang lại thời gian chạy có sự phụ thuộc bậc hai vào . Vì vậy, đây là một trường hợp đặc biệt tốt đẹp để tập trung vào, nếu bạn muốn dành thời gian suy nghĩ về vấn đề này.n
Hướng tới một thuật toán trường hợp chung
Trong trường hợp chung, một heuristic tự nhiên dường như là: chọn vị trí bit với số lượng nhiều nhất là (nghĩa là có mật độ cao nhất) và phân chia trên đó. Nói cách khác:1i1
Tìm vị trí bit tối đa hóa .Δ ( i )iΔ(i)
Tách và dựa trên vị trí bit . Nói cách khác, biểu mẫu , , , .T i S 0 = { s ∈ S : s i = 0 } S 1 = { s ∈ S : s i = 1 } T 0 = { t ∈ T : t i = 0 } T 1 = { t ∈ T : t i = 1 }STiS0={s∈S:si=0}S1={s∈S:si=1}T0={t∈T:ti=0}T1={t∈T:ti=1}
Bây giờ, hãy tìm đệ quy một cặp không chồng chéo từ , từ và từ . Nếu bất kỳ cuộc gọi đệ quy nào tìm thấy một cặp không chồng lấp, hãy xuất nó, nếu không thì xuất ra "Không tồn tại cặp chồng chéo".S 0 , T 1 T 1 , S 0S0,T0S0,T1T1,S0
Thách thức là phân tích hiệu suất của nó trong trường hợp xấu nhất.
Chúng ta hãy giả sử rằng là một bước tiền xử lý, trước tiên chúng ta tính mật độ của mọi vị trí bit. Ngoài ra, nếu cho mọi , giả sử rằng bước tiền xử lý xuất ra "Một cặp chồng chéo tồn tại" (tôi nhận ra rằng điều này không thể hiện ví dụ về một cặp chồng chéo, nhưng hãy đặt nó sang một bên như một thách thức riêng biệt). Tất cả điều này có thể được thực hiện trong thời gian . Thông tin mật độ có thể được duy trì hiệu quả khi chúng tôi thực hiện các cuộc gọi đệ quy; nó sẽ không phải là người đóng góp chi phối thời gian hoạt động. iO(nk)Δ(i)<1/k−−√iO(nk)
Thời gian chạy của thủ tục này sẽ là gì? Tôi không chắc chắn, nhưng đây là một vài quan sát có thể giúp ích. Mỗi cấp độ đệ quy làm giảm kích thước bài toán khoảng bitvector (ví dụ: từ bitvector đến bitvector). Do đó, đệ quy chỉ có thể đi sâu về các mức . Tuy nhiên, tôi không chắc chắn làm thế nào để đếm số lượng lá trong cây đệ quy (có rất ít hơn lá), vì vậy tôi không chắc thời gian chạy này sẽ dẫn đến thời gian nào đến. nn-n/ √n/k−−√n √n−n/k−−√ 3 √k−−√3k√