码迷,mamicode.com
首页 > 编程语言 > 详细

《算法:C语言实现》阅读笔记

时间:2015-06-26 14:58:45      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

//从今天起准备认真看完这本书。本渣虽然笨,但是窝懒啊。。。。

//今天开始看第一章。希望坚持下去。

 

第一章 引言

通过讨论连通问题的几种算法,来引出算法的重要性。 

1.1 连通问题的快速查找算法

感觉就是把每个点染色,每个颜色代表一堆,互相连通。每次输入两个点,把两个点所属那个颜色改为相同,这样他们代表就都互相连通。

时间复杂度:O(MN), M是输入指令次数,N是点个数

//1.1 连通问题的快速查找算法
#include <stdio.h>
 
#define N 10
 
int id[N];                          // 表示每个点的色
 
int main()
{
    //freopen("in.txt", "r", stdin);
    int i, t, p, q;
 
    for (i = 0; i < N; ++i)
        id[i] = i;                  // 开始每两个点都不连通,所以每个点一个颜色
    while (scanf("%d%d", &p, &q) == 2) {
        if (id[p] != id[q]) {
            for (t = id[p], i = 0; i < N; ++i)
                if (id[i] == t)     // 把所有和p一个颜色的点染成q的颜色
                    id[i] = id[q];
        }
        for (i = 0; i < N; ++i)
            printf("%d ", id[i]);
        printf("\n");
    }
    return 0;
}

1.2 连通问题的快速合并解法

就是两个点相同就把两个点放到同一棵树上,这样两个点根相同代表他们连通。每次找到两个点的根,如果不相同,就把一个跟连到另一个根上。

时间复杂度:O(MN),M是输入指令次数,N是点个数。当M>N时,执行次数为MN/2

//1.2 连通问题的快速合并算法

#include <stdio.h>
 
#define N 10
 
int main()
{
    //freopen("in.txt", "r", stdin);
    int i, j, p, q;
    int id[N];                      // 表示每个点的父节点
    for (i = 0; i < N; ++i)
        id[i] = i;                  // 开始每两个点都不连通,所以每个点的父节点是自己
    while (scanf("%d%d", &p, &q) == 2) {
        for (i = p; i != id[i]; i = id[i])
            /*nothing*/ ;           // 当该节点的父节点与该节点相等时,证明该节点是根
        for (j = q; j != id[j]; j = id[j])
            /*nothing*/ ;
        if (i != j)                 //此时i为p的根,j为q的根
            id[i] = j;
        for (i = 0; i < N; ++i)
            printf("%d ", id[i]);
        printf("\n");
    }
    return 0;
}

1.3 加权快速合并算法

记录每棵树的节点个数,把节点少的根连到节点多的根。

 

《算法:C语言实现》阅读笔记

标签:

原文地址:http://www.cnblogs.com/wenruo/p/4602222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!