• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 183,  comments - 10,  trackbacks - 0

            來(lái)自于《算法:C 語(yǔ)言實(shí)現(xiàn)》

            在邊長(zhǎng)為 1 的正方形中隨機(jī)產(chǎn)生 N 個(gè)點(diǎn),計(jì)算有多少個(gè)點(diǎn)對(duì)之間的距離小于 d。

            一種直觀的解法就是對(duì)每個(gè)點(diǎn),檢查其余其他點(diǎn)的距離。

            另一種改進(jìn)的方法是,考慮到距離小于 d 才符合要求,對(duì)于許多一開始就能知道距離大于 d 的點(diǎn)對(duì)沒(méi)有必要檢查。這里借助一個(gè)二維的鏈表數(shù)組進(jìn)行操作。

            由 d 得到 G = 1 / d,把正方形劃分成一個(gè) (G + 2) * (G + 2) 的格子。對(duì)于要檢查的點(diǎn),只需要檢查其所在格子以及周圍的 8 個(gè)格子中的其他點(diǎn)與它的距離。這樣效率得到很大的提升。

            解法一:

             1 #include <stdio.h>
             2 #include <stdlib.h>
             3 #include <math.h>
             4 #include <time.h>
             5 
             6 typedef struct
             7 {
             8     float x;
             9     float y;
            10 } point;
            11 
            12 float distance(point a, point b)
            13 {
            14     float dx = a.x - b.x, dy = a.y - b.y;
            15     return sqrt(dx * dx + dy * dy);
            16 }
            17 
            18 float randFloat()
            19 {
            20     return 1.0 * rand() / RAND_MAX;
            21 }
            22 
            23 int main()
            24 {
            25     float d = 0.1;
            26     int i, j, cnt = 0, N = 100;
            27 
            28     point* a = (point*)malloc(N * sizeof (*a));
            29     srand(time(0));
            30     for (i = 0; i < N; ++i)
            31     {
            32         a[i].x = randFloat();
            33         a[i].y = randFloat();
            34     }
            35     for (i = 0; i < N; ++i)
            36     {
            37         for (j = i + 1; j < N; ++j)
            38         {
            39             if (distance(a[i], a[j]) < d)
            40             {
            41                 ++cnt;
            42             }
            43         }
            44     }
            45     printf("%d edges shorter than %f\n", cnt, d);
            46 }

            改進(jìn)的解法:
             1 // 二維鏈表數(shù)組
             2 
             3 #include <stdio.h>
             4 #include <stdlib.h>
             5 #include <math.h>
             6 #include <time.h>
             7 
             8 typedef struct
             9 {
            10     float x;
            11     float y;
            12 } point;
            13 
            14 typedef struct node* link;
            15 struct node
            16 {
            17     point p;
            18     link next;
            19 };
            20 
            21 link** grid;
            22 int G;
            23 float d;
            24 int cnt;
            25 
            26 float distance(point a, point b)
            27 {
            28     float dx = a.x - b.x, dy = a.y - b.y;
            29     return sqrt(dx * dx + dy * dy);
            30 }
            31 
            32 float randFloat()
            33 {
            34     return 1.0 * rand() / RAND_MAX;
            35 }
            36 
            37 void gridinsert(float x, float y)
            38 {
            39     int i, j;
            40     link s;
            41     int X = x * G + 1;
            42     int Y = y * G + 1;
            43     link t = (link)malloc(sizeof (*t));
            44     t->p.x = x;
            45     t->p.y = y;
            46 
            47     for (i = X - 1; i <= X + 1++i)
            48     {
            49         for (j = Y - 1; j <= Y + 1++j)
            50         {
            51             for (s = grid[i][j]; s != 0; s = s->next)
            52             {
            53                 if (distance(s->p, t->p) < d)
            54                 {
            55                     ++cnt;
            56                 }
            57             }
            58         }
            59     }
            60     t->next = grid[X][Y];
            61     grid[X][Y] = t;
            62 }
            63 
            64 int** malloc2d(int r, int c)
            65 {
            66     int i;
            67     int **= (int**)malloc(r * sizeof (int*));
            68     for (i = 0; i < r; ++i)
            69     {
            70         t[i] = (int*)malloc(c * sizeof (int));
            71     }
            72     return t;
            73 }
            74 
            75 int main()
            76 {
            77     int i, j, N = 100;
            78     d = 0.1;
            79     G = 1 / d;
            80 
            81     grid = (link**)malloc2d(G + 2, G + 2);
            82 
            83     for (i = 0; i < G + 2++i)
            84     {
            85         for (j = 0; j < G + 2++j)
            86         {
            87             grid[i][j] = 0;
            88         }
            89     }
            90 
            91     srand(time(0));
            92     for (i = 0; i < N; ++i)
            93     {
            94         gridinsert(randFloat(), randFloat());
            95     }
            96 
            97     printf("%d edges shorter than %f\n", cnt, d);
            98     return 0;
            99 }
            posted on 2011-05-16 14:12 unixfy 閱讀(127) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久久久久久综合狠狠综合| 色综合久久中文综合网| 日日狠狠久久偷偷色综合免费| 久久综合久久伊人| 一本一本久久A久久综合精品| 69国产成人综合久久精品| 91精品观看91久久久久久| 麻豆久久| 日韩亚洲欧美久久久www综合网| 亚洲Av无码国产情品久久| 久久香综合精品久久伊人| 开心久久婷婷综合中文字幕| 久久夜色精品国产噜噜亚洲AV| 国产综合成人久久大片91| 久久精品水蜜桃av综合天堂| 办公室久久精品| 国产午夜精品久久久久免费视| 狠狠色丁香婷婷久久综合| 久久久精品免费国产四虎| 天天躁日日躁狠狠久久| 久久久久亚洲精品中文字幕| 9久久9久久精品| 老色鬼久久亚洲AV综合| 香蕉99久久国产综合精品宅男自 | 99久久精品免费看国产一区二区三区 | 久久久久久亚洲精品成人| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久精品国产清自在天天线 | 色老头网站久久网| 久久久久97国产精华液好用吗| 国产精品久久久久AV福利动漫 | 国产成人久久777777| 久久青青草原精品国产| 久久无码AV一区二区三区| 久久久噜噜噜久久| 久久久精品久久久久久 | 囯产精品久久久久久久久蜜桃| 一级a性色生活片久久无少妇一级婬片免费放 | 久久中文字幕人妻丝袜| 久久人人爽人人爽人人爽| 久久免费看黄a级毛片|