Vấn đề là tìm một đường thẳng đi qua và có tất cả các điểm khác trong ở một bên. Đây là một vấn đề lập trình tuyến tính hai chiều, vì vậy nó có thể được giải quyết trong thời gian bằng thuật toán hình học sách giáo khoa . Nhưng hãy để tôi mô tả một giải pháp khép kín.pSO(n)
Để đơn giản hóa ký hiệu, dịch tất cả các điểm sao cho là gốc và đặt . Sau đó, chúng tôi muốn xác định nếu có một số thực như vậy mà một trong hai (1) cho tất cả hoặc (2) cho tất cả . Trong trường hợp đầu tiên, là một đỉnh của thân trên của ; trong trường hợp thứ hai, là một đỉnh của thân dưới của . Tôi sẽ mô tả một thuật toán cho trường hợp đầu tiên; trường hợp khác là đối xứng.p(0,0)Q=S∖{p}my<mx(x,y)∈Qy>mx(x,y)∈QpSpS
Nếu bất kỳ điểm nào trong nằm ngay trên (nghĩa là, nếu bất kỳ điểm nào trong có tọa độ với một số ), thì không thể nằm trên thân trên. Thật dễ dàng để kiểm tra tình trạng này trong thời gian .QpQ(0,y)y>0pO(n)
Vì vậy, giả sử không có điểm nào trong nằm ngay trên . Các trục chia tách thành hai tập con (trái) và (phải). Các điểm trong có các tọa độ âm và các điểm trong có các tọa độ dương . (Điểm trực tiếp bên dưới không quan trọng; chỉ cần bỏ qua chúng.) Hãy để
Bây giờ có ba trường hợp để xem xét:QpyQLRLxRxp
mL=min(x,y)∈Lyx,MR=max(x,y)∈Ryx,andm=mL+MR2.
Nếu , thì mọi điểm trong nằm ngay dưới đường , vì vậy là một đỉnh của thân trên.mL<MRQy=mxp
Nếu , thì dòng đi qua một điểm trong và một điểm trong , và không có điểm nào trong nằm trên đường thẳng đó. Vì vậy, nằm trên một cạnh của thân trên, nhưng nó không phải là một đỉnh.mL=MRy=mxLRQp
Nếu , thì ít nhất một điểm trong và ít nhất một điểm trong nằm ngay trên đường . Vì vậy, nằm ngay dưới thân trên.mL>MRLRy=mxp
Thật dễ dàng để tính và trong thời gian . Chúng tôi thực sự không cần phải tính .mLMRO(n)m