算法:C语言实现学习笔记-基础知识

算法:C语言实现
作者:Robert Sedgewick
作者网站:https://www.cs.princeton.edu/~rs/

第一部分 基础知识

第一章:引言

  按照作者的说法,这本书主要研究基本算法,即使用的最为广泛的算法。
理解过程

  • 实现并测试程序,包括程序变体
  • 讨论程序在小规模例子上的操作
  • 尝试在较大问题上使用

一般方法:由一个原型例子入手,探索这个例子的性能特征,改进算法。

原型例子
性能特征
改进算法

1.1 算法

  算法即解决特定问题的方法,这与具体的计算机无关,学习的要点在于解决问题的方法,而不是程序。

算法
程序

算法关注的是计算中设计的数据的组织方法,用这种方法建立的对象称为数据结构。

  • 数据结构为算法的最终产物,研究数据结构来理解算法
  • 算法的复杂度和数据结构的复杂度无关
  • 算法研究的目的即节省空间和时间

  开发大规模程序时,需要将问题分解为小问题,分解是为了算法更容易实现。

样本问题——连通性

  给定整数对序列,每个整数表示某种类型对象,p-q表示”p连接到q“,连通关系可传递,p-q,q-r,则p-r。
要求

  • 过滤集合中无关的程序对
    在这里插入图片描述
    这个图如何理解?
  • 左边为给定的表示对象的连接
  • 中间为连通算法输出的表示新连接的对(就是过滤出来的无关的对)
  • 右边是之前存在的连通关系的证明

比如2-9,这个就不需要过滤,因为之前给出的连接中可以表示为2-9是联系的,右边就是证明。
问题设计要求

  • 记录足够多的数对信息的程序
  • 判定一个新对是否连通

此任务称为连通性问题
连通性问题的实际意义
网络连接问题

  • 整数可以表示大规模网络中的计算机
  • 对表示网络中的连接
  • 此程序可以确定是否需要建立已有的连接,还是建立新的连接。

应用:确定是否连通。
在这里插入图片描述
比如能否确定图中的两个黑点是否连通。
当我们得到新对,需要确定此对是否为一个新的连接,然后把看到的连接信息合并到已得到的连通关系中,使其可以检查后续要出现的连接。

  • 用整数表示抽象集合中的元素
  • 查照包含给定数据项的集合
  • 用并集替换包含两个给定数据项的集合

问题已经被转换为定义表示集合的数据结构,并实现对这个数据结构的查找和合并。

1.3 合并-查找算法

  1. 实现问题的简单算法
  2. 存储输入对的方式
  3. 遍历输入对函数
  4. 检查对象连通性

由于实际使用中对的量会很大,则不能将数据全部放在内存中。所以将数据放到数组中。

程序1.1 连通问题的快速查找算法
#include <stdio.h>
#define N 10
int main()
{
    int i, p, q, t, id[N];
    for (i = 0; i < N; i++)      // 给数组赋值
        id[i] = i;

    while (scanf("%d %d", &p, &q) == 2)
    {
        if (id[p] == id[q])
            continue;
        for (t = id[p], i = 0; i < N; i++)
            if (id[i] == t)
                id[i] = id[q];
        printf("*********************************\n%d %d       ", p, q);
        for (int j = 0; j < 10; j++)
        {
            printf("%d ", id[j]);
        }
        printf("\n*********************************\n");
    }
    return 0;
}

在这里插入图片描述
此图为输出结果。
代码解释
  只要数组中两个数的值相等则连通,比如第一次输入3和4,那么3位和4位就都成了4,则表示3-4。

  1. 程序先给数组赋值,然后我们输入连通对,如果id[p]和id[q]的值相等,那就说明p和q这两个位置的值相等,则p-q连通,所以直接continue,进行下一对输入。
  2. 如果不相等,则说明之前没有建立连通关系,那么这时就需要建立连通关系。
  3. 首先把id[p]的值给到中间变量t,然后遍历数组,如果id[i]的值为t,则把id[q]的值赋给id[i]。此时id[p]就和id[q]相等了。遍历数组是为了保存原来的连通关系,应为若之前有连通,则如果直接idp]=id[q]就会破坏之前的连通关系。
  4. 也可以解释为,若有之前的连通关系,则新的连通和之前的也是连通的,所以需要将之前所有的和t相等的值都赋值为id[q]。比如3-4,4-9,则3-9,所以3 4 9的值都是9。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LogosGe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值