Belajar segitiga di pesawat


13

Saya ditugaskan siswa saya masalah menemukan sebuah segitiga yang konsisten dengan koleksi poin di R 2 , diberi label dengan ± 1 . (A segitiga T adalah konsisten dengan sampel berlabel jika T berisi semua positif dan tidak ada poin negatif, oleh asumsi, mengakui sampel minimal 1 segitiga konsisten).mR2±1TT

Yang terbaik yang mereka (atau saya) bisa lakukan adalah algoritma yang berjalan dalam waktu , di mana m adalah ukuran sampel. Adakah yang bisa berbuat lebih baik?O(m6)m


Untuk memperjelas: simpul segitiga tidak perlu menjadi titik koleksi, bukan? Dan dapat diterima untuk memiliki poin negatif di perbatasan?
ex0du5

(1) Saya memilih untuk menutup pertanyaan karena saya salah paham masalah. Sistem tidak memungkinkan saya untuk membatalkan suara saya, tetapi saya benar-benar membatalkannya. (2) Saya pikir ada algoritma waktu O (m log m), tetapi tidak punya waktu untuk memverifikasinya sekarang. Idenya adalah untuk menghitung lambung cembung dari contoh-contoh positif dan menyapu lambung cembung ini untuk menemukan tiga garis yang membentuk segitiga yang diinginkan.
Tsuyoshi Ito

@ ex0du5 - memang, simpul segitiga tidak harus terdiri dari titik sampel. Adapun masalah batas, ini dapat diabaikan di sini karena mereka tidak penting. [Jika batas dihitung sebagai bagian dari segitiga, maka Anda tidak akan memiliki poin negatif pada batas.]
Aryeh

@ TsuyoshiIto: Saya berpikiran sama, tetapi ada beberapa kasus di mana Anda tidak bisa membuat tepi segitiga menjadi collinear ke tepi cembung cembung, tetapi sebuah segitiga masih ada. Segitiga masih mengandung lambung cembung, tetapi tidak hanya memperpanjang garis lambung dan menemukan segitiga. Anda mungkin perlu garis yang diputar di sekitar beberapa simpul untuk menghindari titik negatif. Itu sebabnya saya bertanya tentang negatif pada batas, untuk memungkinkan algoritma pencarian yang memilih garis dari simpul lambung ke negatif untuk tetap membuat pencarian terpisah.
ex0du5

@ ex0du5: Yah, saya tidak berasumsi bahwa tepi segitiga sejajar dengan beberapa tepi cembung lambung dari contoh positif.
Tsuyoshi Ito

Jawaban:


14

Seperti @TsuyoshiIto sarankan, ada algoritma -waktu untuk masalah ini, karena Edelsbrunner dan Preparata. Bahkan, algoritma mereka menemukan poligon cembung dengan jumlah tepi minimum yang memungkinkan yang memisahkan dua set titik. Mereka juga membuktikan Ω ( n log n ) batas bawah untuk masalah yang lebih umum dalam model pohon keputusan aljabar; Namun, tidak jelas apakah batas bawah ini berlaku untuk kasus segitiga.O(nlogn)Ω(ncatatann)

Penjelasan lengkap tentang algoritme terlalu panjang untuk dikirim di sini, tetapi inilah ide dasarnya. Biarkan menjadi cembung lambung dari poin positif. Untuk setiap titik negatif q , mempertimbangkan garis melalui q yang bersinggungan dengan C . Garis-garis ini membagi pesawat menjadi empat irisan, salah satunya berisi CCqqCC ; biarkan menjadi irisan berlawanan salah satu yang berisi C . Akhirnya, misalkan F ("wilayah terlarang") menjadi penyatuan semua irisan W ( q ) . Segitiga pemisah harus memisahkan C dari FW(q)CFW(q)CF. Baik dan F dapat dibangun dalam waktu O ( n log n ) .CFO(nlogn)

example of $C$ and $F$

Beri label pada tepi searah jarum jam dan berlawanan arah jarum jam. Edelsbrunner dan Preparata lanjut membuktikan bahwa jika sebuah segitiga memisahkan ada, maka ada segitiga yang memisahkan yang ujung-ujungnya adalah collinear dengan tepi searah jarum jam dari F . Dalam O ( n ) waktu tambahan, kita dapat menemukan tepi (harus searah jarum jam) dari F yang pertama kali terkena sinar dari setiap tepi searah jarum jam e ; sebut tepi ini sebagai "penerus" dari e . Pointer penerus membagi tepi searah jarum jam menjadi siklus; jika ada segitiga pemisah, salah satu siklus penerus ini memiliki panjang 3 (dan tidak ada yang memiliki panjang lebih dari 4).FFO(n)Fee

Lihat kertas asli untuk lebih jelasnya:


3

Bagi saya tampaknya cukup untuk mempertimbangkan garis singgung dari titik '-1' ke cembung lambung poin '+1' sebagai kandidat untuk sisi (katakanlah bahwa '+1' poin akan menjadi bagian dalam ke T ).TT

Sayang sekali, saya tidak bisa menerbitkan gambar di sini. Tapi bayangkan ini: adalah garis singgung ke cembung cembung yang melewati beberapa titik '-1'. A adalah titik singgung. BtAB adalah titik ekstrim (lihat di bawah) pada , dan B C adalah garis singgung dari titik B ( C adalah titik singgung).tBCBC

Jadi, algoritmanya adalah sebagai berikut. Untuk setiap baris dari garis singgung kita dapat mencoba membangun segitiga berdasarkan itu:t

  1. Hitung titik persimpangan dengan semua garis lainnya;t
  2. Temukan ekstrim (terjauh dari ) titik B dan garis yang sesuai t ke kanan (atau kiri) dari A , sedemikian rupa sehingga psuedotriangle A B C (= A B , B C dan bagian lambung cembung antara A dan C ) tidak mengandung poin '-1' (yaitu tidak mengandung poin apa pun).ABtAABCABBCAC
  3. Lakukan hal yang sama dengan garis dan lihat apakah kita dapat 'menutup' segitiga.t

Sepertinya ini akan menjadi waktu berjalan. Mungkin ini bisa diperbaiki dengan menggunakan beberapa struktur data?O(m2)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.