Thời gianÔ ( d3đăng nhậpd)
bổ đề: Khắc phục mọi . Sau đó, có một tập hợp chứa góc của gần nhất với và sao cho được kết nối (có nghĩa là biểu đồ con của hypercube gây ra bởi được kết nối). S d + 1 { 0 , 1 } d x S Sx ∈ [ 0 , 1 ]dSd+ 1{ 0 , 1 }dxSS
Bằng chứng.
Đầu tiên hãy xem xét trường hợp không có tọa độ bằng .1 / 2x1 / 2
Cho bất kỳ góc trong , lật tọa độ của sẽ không tăng khoảng cách từ đến nếu . S a j a a x | một j - x j | ≥ 1 / 2mộtSmộtjmộtmộtx| mộtj- xj| ≥1 / 2
Xét bất kỳ hai góc trong khác nhau về ít nhất một tọa độ và giả sử WLOG rằng và . Nếu thì lật trong sẽ cho một điểm khác trong (vì nó giảm khoảng cách từ đến ). Hoặc, nếu sau đó lật trong cho một điểm trong . Lặp lại quá trình này cho mỗi tọa độ khác nhau trong và sẽ cho một đường dẫn kết nối vàS j một j = 0 b j = 1 x j < 1 / 2 b j b S b x x j > 1 / 2 một j một S một b một b Sa , bSjmộtj= 0bj= 1xj< 1 / 2bjbSbxxj> 1 / 2mộtjmộtSmộtbmộtb trong .S
Nếu có tọa độ bằng , thì khi chọn , phá vỡ các mối quan hệ giữa các điểm tương đương bằng cách ưu tiên cho các tọa độ có tọa độ bằng 0 hơn. Sau đó, các đối số tương tự sẽ làm việc. QED1 / 2 Sx1 / 2S
Bằng cách bổ đề, bạn có thể sử dụng một Dijkstra giống như thuật toán để tìm . Bắt đầu với một góc gần nhất với ( với nếu ). Sau đó, liên tục thêm vào một góc đó là gần nhất với trong số những người được tiếp giáp với một số điểm trong . Dừng lại khi điểm đã được thêm vào. x một một j = 0 x j ≤ 1 / 2 S x S d + 1Sxmộtmộtj= 0xj≤ 1 / 2SxSd+ 1
Naively (sử dụng một heap nhỏ để tìm điểm gần nhất tiếp theo với trong mỗi lần lặp), tôi đoán có các lần lặp và mỗi lần lặp yêu cầu làm việc để tạo ra hàng xóm của nút được thêm vào ( mỗi cái có đại diện kích thước ), cho thời gian chạy .d + 1 O ( d 2 ) d d O ( d 3 log d )xd+ 1Ô ( d2)ddÔ ( d3đăng nhậpd)
Thời gianÔ ( d2đăng nhậpd)
Biểu diễn mỗi góc cách ngầm định là một cặp , trong đó là hàm băm của tập hợp các chỉ số sao cho và là khoảng cách từ đến . Từ một góc đã cho , các cặp cho tất cả các góc lân cận có thể được tạo trong thời gian (tổng cộng). Điều này mang lại thời gian chạy xuống .( h , d ) h i a i = 1 d x a a O ( d ) O ( d 2 log d )một( h , d)hTôimộtTôi= 1dxmộtmộtÔ ( d)Ô ( d2đăng nhậpd)
Nhanh hơn?
Để làm cho cuộc thảo luận dễ dàng hơn, hãy viết lại vấn đề như sau. Với một chuỗi các số không âm , tìm tập con tối thiểu chi phí của các con số, nơi chi phí của một tập hợp con là tổng các số trong nó. y 1 ≤ y 2 ≤ ⋯ ≤ y d d + 1 dy1≤ y2≤ ⋯ ≤ ydd+ 1 (Để xem kết nối với sự cố trước đó, hãy lấy ; sau đó mỗi tập con của tương ứng với một góc của hypercube, trong đó là 1 nếu ( và ) hoặc ( và ); và chi phí củaY y i một ( y ) một i ( y ) x i ≤ 1 / 2 y i ∈ Y x i > 1 / 2 y i ∉ Y Y x một (yTôi= | xTôi- 1 / 2 |YyTôimột ( y)mộtTôi( y)xTôi≤ 1 / 2yTôi∈ YxTôi> 1 / 2yTôi∉ YY là khoảng cách từ đến .)xmột ( y)
Đây là một ý tưởng chung cho một thuật toán nhanh hơn. Có lẽ ai đó có thể tìm ra cách để làm cho nó hoạt động.
Xác định đồ thị có hướng ngầm định trong đó mỗi nút là tập con của 's. Nút bắt đầu là tập hợp trống. Biểu diễn các nút ngầm định là các cặp trong đó là hàm băm của tập hợp con và là chi phí. Đối với mỗi tập hợp con , hãy xác định các tập hợp con lân cận bằng cách nào đó để (i) nếu là cạnh có hướng thì chi phí cost và (ii) cho bất kỳ tập hợp con , ở đó là cạnh có hướng từ một số tập hợp con trong đó chi phí costy i ( h , c ) h c Y Y → Y ' ( Y ' ) ≥ ( Y ) Y ' Y → Y ' Y ( Y ) ≤ ( Y ' )YyTôi( h , c )hcYY→Y'(Y') ≥(Y)Y'Y→ Y'Y(Y) ≤( Y'). Sau đó chạy Dijkstra trên biểu đồ ẩn này bắt đầu từ nút bắt đầu.
Chọn các cạnh (bằng cách nào đó) sao cho (i) và (ii) đều giữ và tổng số độ của các nút rẻ nhất là . (Ví dụ, điều này luôn luôn có thể, lấy các cạnh là những cây trong một số cây có đường đi ngắn nhất bắt nguồn từ lúc bắt đầu.) Nhưng người ta có thể định nghĩa một biểu đồ như vậy mà không có kiến thức a-prori về cây đường ngắn nhất không? Nếu vậy, điều này có thể dẫn đến thuật toán thời gian (?).O ( d ) O ( d log d )d+ 1O (d)O (dđăng nhậpd)