簡體   English   中英

最大共線點數 - 優化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM