Temukan kubus terbesar yang terkandung dalam persatuan kuboid

18

Saya memiliki banyak cuboids dalam ruang 3D, masing-masing memiliki titik awal di (x, y, z) dan memiliki ukuran (Lx, Ly, Lz). Saya bertanya-tanya bagaimana menemukan kubus terbesar di ruang 3D ini yang terkandung dalam penyatuan kuboids. Apakah ada algoritma yang efisien untuk ini?

Misalnya, jika saya memiliki kuboid berikut:

  • berbentuk kubus mulai dari (0,0,0) dengan ukuran (10,10,10),
  • berbentuk kubus di (10,0,0) dengan ukuran (12,13,15),
  • berbentuk kubus di (0,10,0) dengan ukuran (10,10,10),
  • berbentuk kubus pada (0,0,10) dengan ukuran (10,10,10), dan
  • berbentuk kubus di (10,10,10) dengan ukuran (9,9,9).

Kemudian, kubus terbesar yang terkandung dalam persatuan kuboid ini akan menjadi kubus mulai dari (0,0,0) dengan ukuran (19,19,19).

Versi yang lebih umum dari pertanyaan ini:

Diberikan koleksi kotak di , cari hypercube terbesar yang terkandung dalam penyatuan kotak.R dnRd

pantoffski
sumber
8
Saya pikir ada pertanyaan yang lebih baik yang tersembunyi di dalamnya: yaitu, mengingat penyatuan kotak di , menghitung hypercube terbesar yang ada di dalam penyatuan. Rd
Suresh Venkat
1
Bisakah kuboid ini tumpang tindih?
Peter Boothe
@ Suresh, terima kasih telah menjelaskan & menggeneralisasi pertanyaan :) @ Peter, dalam kasus saya ... Itu tidak akan tumpang tindih :)
pantoffski
2
Cara Anda melakukan phesed ini, sepertinya sisi kubus disejajarkan dengan sumbu x, y dan z. Apakah ini masalahnya, atau dapatkah kubus memiliki orientasi yang sewenang-wenang? Ini jelas membuat perbedaan yang signifikan pada efisiensi algoritma.
Joe Fitzsimons
Dalam kasus saya, setiap wajah berbentuk kubus ortogonal hanya untuk sumbu.
pantoffski

Jawaban:

15

Nah, inilah jawaban pertama yang konyol ... Cobalah naik pesawat melewati setiap wajah kotak persegi panjang. Ini membentuk kisi ukuran . Tidak sulit untuk menghitung untuk setiap sel grid seperti apakah itu di dalam serikat atau di luar. Sekarang, dari masing-masing simpul grid, tumbuhkan sebuah kubus (dengan simpul ini sebagai simpul) yang berusaha membuatnya sebesar mungkin. Melakukannya dengan cara yang paling naif, ini membutuhkan waktu O ( n 3 log n ) per titik, tetapi mungkin menggunakan sihir pencarian rentang ortogonal, seseorang harus dapat melakukannya di log O ( 1 ) n per simpul. Jadi O ( n 3O(n3)O(n3logn)logO(1)n harus dimungkinkan ...O(n3logO(1)n)

Percobaan kedua: Hitung serikat pekerja. Dalam kasus khusus ini, ini dapat dilakukan dalam waktu (dengan menyapu pesawat). Sekarang, perhatikan bahwa Anda hanya perlu menghitung diagram L voronoi dari batas serikat. Dengan menggunakan hasilnya: http://vw.stanford.edu/~vladlen/publications/vor-polyhedral.pdf , ini dapat dilakukan dalam waktu O ( n 2 + ε ) , untuk konstanta kecil yang sewenang-wenang ε > 0 .O(nlogn)LO(n2+ε)ε>0

O(n2)

Sariel Har-Peled
sumber
Terima kasih tuan, saya juga berpikir L∞ adalah solusi terbaik untuk masalah ini sejauh ini. Karena saya telah melakukan L∞ untuk kasus 2D sebelumnya (diimplementasikan oleh metode yang disediakan dalam makalah ini inf.usi.ch/faculty/papadopoulou/publications/ijcga01.pdf ). Kasing 3D dengan hanya kotak seharusnya tidak terlalu sulit.
pantoffski
8

Rdd<0>01×1×1×n×n×n...×n hiperkuboid.

2×2×...×21×1×...×1

Joe Fitzsimons
sumber
Saya membayangkan Anda dapat membuktikannya dalam FNP (setidaknya dalam kasus cuboids yang selaras sumbu), dengan menjalankan argumen di atas secara terbalik dan menunjukkan bahwa setiap kuboid merupakan kendala yang dapat diperiksa dalam waktu polinomial.
Joe Fitzsimons