[英]Maximum number of collinear points - optimization
我偶然發現了這個問題:
“一位游客有一張尺寸為M x N的地圖。在地圖上有k個城市(k <= 2000)。城市的坐標有這樣的形式(lin,col)(lin <= M和col <= N)。我們也知道游客的坐標。旅游者決定朝某個方向走,停在地圖的邊緣。但是他想走的方向讓他走過盡可能多的城市。你必須計算他可以訪問的最大城市數量。“
M,N <= 1000
ķ<= 2000
例如5 10(M和N)
3 2(游客坐標)
7(k =城市數量)
0 0(城市的坐標)
0 8
1 6
2 2
2 4
3 7
4 5
答案:3
我找到了一個O(k ^ 2)的解決方案。
for(i=0; i<k; i++) {
fscanf(fi, "%d%d", &lin[i], &col[i]);
lin[i]-=l; //we consider tourist's coordinates the origin
col[i]-=c;
}
for(i=0; i<k; i++) {
points=1;
for(j=0; j<k; j++) {
...
if(lin[i] * col[j] == lin[j] * col[i]) //verify collinearity
points++;
...
}
但我很確定它可以比O(k ^ 2)做得更好。 我還沒有找到任何優化。
您可以計算由行程坐標和每個點確定的直線斜率。 你現在有一系列的斜坡。 您現在可以訂購此陣列,並查看出現次數最多的斜率。 或者你可以散列斜率(以避免排序數組)。
你可以在O(n)中做到這一點。 將旅游者的坐標定義為原點,如果線(t,k1)和(t,k2)具有相同的斜率,則兩個城市k1和k2是共線的。 如果將k值以斜率存儲在哈希中,則只需要通過所有k一次,然后通過計算的斜率一次以找到具有最多ks的斜率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.