亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
距離最近的點(diǎn)對問題算法
[打印本頁]
作者:
plscareme
時(shí)間:
2007-07-11 09:43
標(biāo)題:
距離最近的點(diǎn)對問題算法
最近在看Sedgewick的那本Algorithms in C++,里面在28章有一個(gè)關(guān)于最近距離的點(diǎn)隊(duì)的問題求解的算法,分析研究了2天還是有所疑惑,有幾個(gè)點(diǎn)比較以后,拿出來請教大家,希望能給以一些分析。
主要算法:
算法的主要思想是先比較x坐標(biāo),然后比較y坐標(biāo),然后用合并排序來選擇距離最小的點(diǎn)對:
主要的數(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)對
//坐標(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,對x坐標(biāo)排序
pass = 1; h->next = sort(h->next, N);
//第二次pass為2,對y坐標(biāo)排序
pass = 2; h->next = sort(h->next, N);
}
作者:
plscareme
時(shí)間:
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)對的距離都比全局的min大,又怎么實(shí)現(xiàn)通過比較四個(gè)點(diǎn)就能確保一定找到最近點(diǎn)對的原因?
謝謝!
作者:
plscareme
時(shí)間:
2007-07-11 23:08
自己頂一下 這個(gè)算法有什么問題么
作者:
plscareme
時(shí)間:
2007-07-12 16:59
繼續(xù)關(guān)注
作者:
plscareme
時(shí)間:
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)。
歡迎光臨 Chinaunix (http://www.72891.cn/)
Powered by Discuz! X3.2