亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 6746 | 回復(fù): 4
打印 上一主題 下一主題

[算法] 距離最近的點(diǎn)對(duì)問題算法 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-07-11 09:43 |只看該作者 |倒序?yàn)g覽
最近在看Sedgewick的那本Algorithms in C++,里面在28章有一個(gè)關(guān)于最近距離的點(diǎn)隊(duì)的問題求解的算法,分析研究了2天還是有所疑惑,有幾個(gè)點(diǎn)比較以后,拿出來請(qǐng)教大家,希望能給以一些分析。
主要算法:
算法的主要思想是先比較x坐標(biāo),然后比較y坐標(biāo),然后用合并排序來選擇距離最小的點(diǎn)對(duì):
主要的數(shù)據(jù)結(jié)構(gòu),點(diǎn)和鏈表節(jié)點(diǎn):
struct point
{
    int x;
    int y;
};

struct node
{
    struct point p;
    struct node *next;
};
//全局變量
/* global */
int pass; // 表明比較x還是y坐標(biāo)
struct node *z; // 尾節(jié)電,無限大
float min; // 最短距離
struct point cp1, cp2; // 最短距離點(diǎn)對(duì)

//坐標(biāo)比較函數(shù),pass為一比較x坐標(biāo),否則(2)比較y坐標(biāo):

int comp(struct node *t)
  { return (pass == 1) ? t->p.x : t->p.y; }
//合并排序函數(shù)
struct node *merge(struct node *a, struct node *b)
  {
    struct node *c;
    c = z;
    do
      if (comp(a) < comp(b))
        { c->next = a; c = a; a = a->next; }
      else
        { c->next = b; c = b; b = b->next; }
    while (c != z);
    c = z->next; z->next = z;
    return c;
  }
//距離比較函數(shù)

void check(struct point p1, struct point p2)
{
    float dist;
    if ((p1.y != z->p.y) && (p2.y != z->p.y))
    {
        dist = sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y));
        if (dist < min)
        {
            min = dist; cp1 = p1; cp2 = p2;
        }
    }
}


// 主要核心比較函數(shù)
struct node *sort(struct node *c, int number)
{
    static int sort_i = 0;
    int i;
    struct node *a, *b, *tt;
    float middle;
    struct point p1, p2, p3, p4;
    if (c->next == z)
        return c;
    a = c;
    for (i = 2; i <= number/2; i++)
        c = c->next;
    b = c->next;
    c->next = z;
    if (pass == 2)
    {
        middle = b->p.x;
    }
    //按照Sedgewick的說法,在調(diào)用這個(gè)merge之前,鏈表是以x坐標(biāo)排好序的.
    c = merge(sort(a, number/2), sort(b, number - (number/2)));
    //按照Sedgewick的說法,在這個(gè)merge之后, midlle的左右兩半的內(nèi)部點(diǎn)之間的距離,都大于min
    // 這是為什么?
    //為什么這里要比較四個(gè)點(diǎn),為什么四個(gè)點(diǎn)足夠了,這又是為什么?
    if (pass == 2)
    {
        p1 = z->p; p2 = z->p; p3 = z->p; p4 = z->p;
        for (a = c; a != z; a = a->next)
            if (fabs(a->p.x - middle) < min)
            {
                check(a->p, p1);
                check(a->p, p2);
                check(a->p, p3);
                check(a->p, p4);
                p1 = p2; p2 = p3; p3 = p4; p4 = a->p;
            }
    }
    return c;
}


//主函數(shù)

int main()
{
z = new node; z->p.x = max;
              z->p.y = max; z->next = z;
h = new node; h->next = readlist();
min = max;
//第一次pass為1,對(duì)x坐標(biāo)排序
pass = 1; h->next = sort(h->next, N);
//第二次pass為2,對(duì)y坐標(biāo)排序
pass = 2; h->next = sort(h->next, N);
}

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2007-07-11 09:44 |只看該作者
以前看過一個(gè)實(shí)現(xiàn)這個(gè)問題的算法,也是用的分而治之的算法,但是很復(fù)雜,這個(gè)算法很簡單,可是里面sort函數(shù)的實(shí)現(xiàn),確實(shí)有些疑惑,不知道怎么實(shí)現(xiàn)的左右兩個(gè)半?yún)^(qū)的點(diǎn)對(duì)的距離都比全局的min大,又怎么實(shí)現(xiàn)通過比較四個(gè)點(diǎn)就能確保一定找到最近點(diǎn)對(duì)的原因?

謝謝!

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2007-07-11 23:08 |只看該作者
自己頂一下 這個(gè)算法有什么問題么

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2007-07-12 16:59 |只看該作者
繼續(xù)關(guān)注

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2007-07-13 11:23 |只看該作者
readlist只是一個(gè)簡單的建立鏈表的偽函數(shù),沒有什么特別的意義,這個(gè)算法的實(shí)現(xiàn)我是
第一次看到,我以前看到過一個(gè)實(shí)現(xiàn),但是非常復(fù)雜。
這本書我看的是一本原版書,從別人手上借的,所以也沒有電子版。
我是有些迷迷糊糊,關(guān)于這個(gè)算法,尤其是比較四個(gè)點(diǎn)的那個(gè)地方,謝謝回復(fù),我也在查找別的
資料,目前還沒有什么發(fā)現(xiàn)。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP