Tương đương:
Bài toán vectơ không trực giao (như được định nghĩa ở trên) cho một tập hợp gồm vectơ Boolean mỗi chiều dài và một số nguyên dương tương đương như sau:Sndk
Tìm một bởi submatrix trong tổng số 1 trong một trao do ma trận Boolean.2knd
Tìm một sơ đồ con hoàn chỉnh trong một đồ thị lưỡng cực cho trước trong đó tập đỉnh đầu tiên có kích thước và tập đỉnh thứ hai có kích thước .K2 , knd
Thuật toán ngây thơ:
Cách tiếp cận ngây thơ cho bài toán vectơ không trực giao chạy trong thời gian Ô ( d⋅ n2) vì phải mất thời gian để tính toán một cách ngây thơ sản phẩm chấm của mỗi cặp vectơ.Ô ( d⋅ n2)
Trả lời các câu hỏi (2) & (3):
Vâng, có một số thuật toán hiệu quả hơn trong các trường hợp khác nhau.
Cách tiếp cận đầu tiên:
Chúng ta có thể giải bài toán vectơ không trực giao trong thời gian Ô ( d⋅ n + k ⋅ n2) .
Lưu ý: Vì sản phẩm chấm có hai chiều dài vectơ Boolean phải được giới hạn bởi , nên vấn đề chỉ có ý nghĩa khi .ddk ≤ d
Bằng chứng. Đặt một tập hợp gồm vectơ Boolean mỗi chiều dài và một số nguyên dương được cho. Hãy xem xét một đếm của các phần tử của .Sndk{ sTôi}tôi ∈ [ n ]S
Tạo một hashmap từ các cặp đến . Ban đầu, ánh xạ mỗi đầu vào thành giá trị 0.m( a , b ) ∈ [ n ] × [ n ]Nm
Đối với mỗi , chúng tôi thực hiện như sau. Enumerate qua cặp vectơ , như vậy mà , các th chút là 1, và th chút là 1. Đối với mỗi ví dụ và nếu , sau đó và là không trực giao tức là . Mặt khác, tăng và tiếp tục.i ∈ [ d]SmộtSbmột < bTôiSmộtTôiSbSmộtsbm(a,b)=k−1sasbsa⋅sb≥km(a,b)
Nếu chúng ta kết thúc phép liệt kê, thì không có cặp vectơ nào không trực giao.
Phải mất để quét qua mọi bit của mọi vectơ. Sau đó, phải mất thêm thời gian để liệt kê các cặp vectơ. Bởi vì có nhiều nhất cặp vectơ và mỗi cặp có thể xuất hiện tối đa lần trước khi chúng được chứng minh là không trực giao, nên việc liệt kê các cặp mất tối đa thời gian. Do đó, tổng thời gian chạy là .O(n⋅d)(n2)k−1O(k⋅n2)O(d⋅n+k⋅n2)
Lưu ý: Khi , chúng ta có thể cải thiện phương pháp này theo thời gian . Điều này là do khi , chúng ta có thể giảm việc tìm một cặp vectơ không trực giao trong số vectơ Boolean có độ dài để tìm một cặp vectơ không trực giao trong sốk=2O(n⋅d)k=2ndd vectơ Boolean có độ dài n .
Cách tiếp cận thứ hai:
Chúng ta có thể giải bài toán vectơ không trực giao trong O(k⋅(dk)⋅n)thời gian.
Bằng chứng. Đặt một tập hợp S gồm n vectơ Boolean mỗi chiều dài d và một số nguyên dương k được cho.
Liệt kê thông qua các bộ P⊆[d] sao cho P có kích thước k . Đối với mỗi vector v∈S , kiểm tra xem v có tất cả 1 tại các vị trí trong P . Có hai vectơ có tất cả 1 tại các vị trí trong P , sau đó chúng tôi đã tìm thấy hai vectơ không trực giao.
Tổng cộng, có (dk) lựa chọn có thể choP. Và, đối với mỗi sự lựa chọn, chúng tôi quét quak⋅nbit từ các vectơ. Do đó, trong tổng số, thời gian chạy làO(k⋅(dk)⋅n).
Cách tiếp cận thứ ba:
Khi d≤n , chúng ta có thể giải quyết vấn đề vectơ không orthongal trong O(dω−2⋅n2) thời gian nơi ω là số mũ cho phép nhân ma trận số nguyên. Khi d>n , chúng ta có thể giải bài toán vectơ không trực giao trong thời gian O(d⋅nω−1) .
Lưu ý: Như được chỉ ra bởi @Rasmus Pagh, chúng ta có thể cải thiện thuật toán này thành thời gian O(n2+o(1)) khi d≤n0.3 . Xem tại đây để biết thêm: https://arxiv.org/abs/1204.1111
Bằng chứng. Đặt một tập hợp S gồm n vectơ Boolean mỗi chiều dài d và một số nguyên dương k được cho.
Hãy xem xét các ma trận A và B . Ma trận đầu tiên A có kích thước n của d trong đó mỗi hàng A là một vector từ S . Ma trận thứ hai B có kích thước d bởi n trong đó mỗi cột B là một vector từ S .
Chúng ta có thể tính tích của chấm của mọi cặp vectơ trong S bằng cách tính A⋅B bằng thuật toán để nhân ma trận số nguyên nhanh.
Khi d≤n , một cách tiếp cận là để chuyển đổi các nhân ma trận chữ nhật vào (nd)2phép nhân vuôngdvớima trậnd. Bằng cách sử dụng phép nhân ma trận vuông nhanh, chúng ta có thể tính toán tất cả các phép nhân trongO((nd)2⋅dω)=O(dω−2⋅n2)thời gian.
Khi d>n , một cách tiếp cận là chuyển đổi phép nhân ma trận hình chữ nhật thành dn phép nhân củanvuôngbằngnma trận. Bằng cách sử dụng phép nhân ma trận vuông nhanh, chúng ta có thể tính toán tất cả các phép nhân trongO((dn)⋅nω)=O(d⋅nω−1)thời gian.