Tìm góc gần nhất của khối trong


8

Làm thế nào người ta có thể tìm thấy các góc của khối đơn vị trong gần một điểm trong khối? Sử dụng số liệu L1, sao cho trong 4d | - 0000 | = , | - 0001 | = ( ở bên phải), v.v.d+1Rdx
xxixx3+x2+x1+(1x0)
x0

Đối với công thức thay thế, trước tiên hãy lật > 1/2 và sắp xếp, sao cho 1/2; bằng cách đối xứng, một thuật toán cho trường hợp này có thể thực hiện bất kỳ trong khối. Xác định , . Sau đó, chúng tôi muốn các góc với góc nhỏ nhất . 0 x d - 1... x 1x 0x c 1 - 2 x 1 c d - 1... c 1c 00 d + 1 c xi0xd1 x1x0x
c12x1cd1 c1c00
d+1c

Trong 4d chẳng hạn, với giảm 1/2 .. 0 như trên, 5 góc gần nhất có thể làxi

    0 0 0 0
    0 0 0 1
    0 0 1 0

    0 1 0 0  or  0 0 1 1
                 0 1 * *

    1 0 0 0
 or 0 1 0 1

Tuy nhiên, trong 5d, 6d ... những cái cây ngày càng tăng trông (với tôi) ngày càng lộn xộn.
Heuristic cho gần đúng nhất sẽ ổn.


Điều gì phá vỡ trong cách tiếp cận đơn giản? Giả sử rằng mỗi góc của khối lập phương nằm trong và . Vòng từng điều phối số nguyên gần nhất để có được những điểm gần nhất , và tạo ra hơn "điểm gần nhất" bằng cách thêm cho mỗi toạ độ , một cách độc lập. x [ 0 , 1 ] d p d 1{0,1}dx[0,1]dpd1mod2p
Daniel Apon

@Daniel Apon, trong 3d có 0 <= x2 <= x1 <= x0 <= 1/2 hoặc 1> = c2> = c1> = c0> = 0 như trên, 4 góc gần nhất có thể là 000 001 010 100 như bạn đề xuất, nhưng cũng có thể là một mặt 000 001 010 011. (Toàn bộ khối lập phương 3d chia thành 8 + 6 mảnh, 8 góc cộng liền kề và 6 mặt.)
Denis

2
Đây là một cách khác để nêu vấn đề này: đưa ra một tập hợp không âm, tìm tập con chi phí tối thiểu (trong đó chi phí của một tập hợp là tổng của các số trong đó). n + 1nn+1
Neal Young

Vâng, đó là min c. góc trên - tập hợp con chi phí tối thiểu là một tên tốt hơn, thêm nó vào tiêu đề / thẻ?
Denis

Câu trả lời:


8

Thời gianO(d3logd)

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 / 2aSajaax|ajxj|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,bSjaj=0bj=1xj<1/2bjbSbxxj>1/2ajaSabab 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 j1 / 2 S x S d + 1Sxaaj=0xj1/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+1O(d2)ddÔi(d3đăng nhậpd)

Thời gianÔi(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Ôi(d)Ôi(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 1y 2y d d + 1 dy1y2ydd+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 i1 / 2 y iY x i > 1 / 2 y iY Y x một (yTôi= =|xTôi-1/2|YyTôimột(y)mộtTôi(y)xTôi1/2yTôiYxTôi>1/2yTôiYY 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)hcYYY'(Y')(Y)Y'YY'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+1Ôi(d)Ôi(dđăng nhậpd)


Cảm ơn Neal. Người ta có thể cải thiện việc mở rộng góc giống Dijkstra không? Các tập hợp các góc d + 1 gần nhất có thể sau khi chuẩn hóa (lật x thành <= 1/2 và sắp xếp) dường như tăng rất chậm với d.
Denis

Tôi chỉnh sửa câu trả lời để thảo luận về thời gian chạy rõ ràng hơn.
Neal Young

Và câu trả lời của David cho thấy làm thế nào để đưa nó xuống . Ôi(dđăng nhậpd)
Neal Young

8

Nó tương đương với yêu cầu, trong một tập hợp các mục trọng không tiêu cực, cho d + 1 tập con của tổng trọng lượng tối thiểu. Người ta có thể tạo tất cả các tập hợp con của các mục thành một cây, trong đó cha mẹ của tập hợp con được hình thành bằng cách loại bỏ mục nặng nhất của nó (với các mối quan hệ bị phá vỡ tùy ý nhưng nhất quán); các giải pháp d + 1 sẽ tạo thành một cây con của cây này được kết nối ở gốc của nó (tập hợp trống).dd+1d+1

Vì vậy, người ta có thể tìm kiếm cây này cho các mục nhỏ nhất bằng một hình thức thuật toán của Dijkstra, trong đó chúng tôi duy trì hàng đợi ưu tiên của các tập hợp con và loại bỏ chúng theo thứ tự ưu tiên. Chúng tôi bắt đầu với mục được chọn đầu tiên là tập hợp trống. Sau đó, ở mỗi bước, chúng tôi duy trì như một bất biến của thuật toán một hàng đợi ưu tiên chứa con không được chọn tiếp theo cho mỗi tập hợp con đã chọn. Khi chúng tôi chọn một bộ S , chúng tôi xóa nó khỏi hàng ưu tiên và chúng tôi thêm vào hàng ưu tiên hai tập con mới: con đầu tiên của nó (tập hợp được hình thành bằng cách thêm phần tử nặng tiếp theo so với phần tử nặng nhất trong S ) và anh chị em tiếp theo của nó (tập hợp được hình thành bằng cách loại bỏ phần tử nặng nhất trong S và thêm phần tử nặng tiếp theo tương tự).d+1SSS

Sau khi sắp xếp các mục theo trọng số của chúng, thật đơn giản để biểu diễn từng bộ một cách ngầm định (vì phần tử nặng nhất của nó cộng với một con trỏ tới tập hợp mẹ của nó), duy trì tổng trọng lượng của mỗi bộ và tìm ra con đầu tiên và anh chị em tiếp theo cần theo thuật toán trong thời gian không đổi trên mỗi bộ. Do đó, tổng thời gian bị chi phối bởi việc sắp xếp ban đầu và bởi các hoạt động hàng đợi ưu tiên, mất tổng thời gian .Ôi(dđăng nhậpd)

Thậm chí điều này có thể được cải thiện, nếu các mục đã được sắp xếp theo trọng lượng của chúng. Xem mối quan hệ "con đầu lòng" và "anh chị em tiếp theo" từ thuật toán trước đó là con trái và phải trong cây nhị phân của các tập con. Cây này được sắp xếp theo thứ tự heap (tổng trọng lượng tăng từ cha mẹ sang con), vì vậy chúng ta có thể áp dụng thuật toán để tìm các nút có trọng số tối thiểu trong cây nhị phân theo thứ tự heap [GN Frederickson. Một thuật toán tối ưu để lựa chọn trong một đống nhỏ. Thông tin và tính toán, 104: 197 Từ214, 1993]. Tổng thời gian, sau bước sắp xếp, là O ( d ) .d+1Ôi(d)


Tôi đồng ý với giải pháp của David: cây nhị phân mà anh ta mô tả đủ để đạt được tất cả các bộ, cho thời gian . Ôi(dđăng nhậpd)
Neal Young

0

Trên thực tế, trọng lượng thường được phân bố đều, khoảng ~ 1 2 3 Sau đó, để phân tích đơn giản là bắt đầu với:Giáo dục

các bit duy nhất, ví dụ 10000000 01000000 ... 00000001dGiáo dục
kết hợp-bit thấp 00000011 00.000.101 00.000.110 00.000.111tôin2d
kết hợp vài bit tiếp theo , ví dụ: 00.001.001 00001010 00.001.100. D + 1 tốt nhất trong số các ứng cử viên này hoạt động khá tốt trong thực tế, ít nhất là đối với d nhỏ .tôin2d
d+1d

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.