第十三课_算法入门

本课链接:计算机科学速成课第十三课

本课主要内容:简单介绍算法

一、算法中重要概念

算法:是解决问题的具体步骤(如排序算法等)

算法复杂度:算法的输入大小和运行步骤之间的关系

大O表示法:表示运行速度的量级

经典算法问题:图搜索(蛮力、离散数学等)

二、最常见的算法——排序

最常见的算法是排序算法,常见的排序算法有冒泡排序、选择排序和插入排序。这三种排序的流程见文章:插入排序、选择排序和冒泡排序讲解

三、最经典算法问题——图搜索

常见的图搜索方法有蛮力搜索和离散数学方法。

以“在地图中给出最优路线”问题当作例子,蛮力方法即指走遍所有可能的路,并比较各条路的节点数(以一个节点为计量单位,包含节点数越少的路线即为最优路线);而离散数学方法可使用Dijkstra算法,关于Dijkstra算法具体可见文章:【链接】待补充。

四、算法复杂度——时间复杂度

(1)构建新的集合A=A∪B

使用线性表实现代码如下:

void union(List &La,List &Lb){
    La_len=ListLength(La);
    Lb_len=ListLength(Lb);
    for(i=1;i<=Lb_Len;i++){
        GetElem(Lb,i,e);
        if(!LocateElem(La,e,equal)) ListInsert(La,++La_len,e);
    }
}

时间复杂度为O(ListLength(La)*ListLength(Lb)),即时间复杂度与两表表长成正比

(2)删除第i个元素(并用e返回其值)

使用线性表实现如下:

Status ListDelete_Sq(SqList &L,int i,ElemType &e){
    if((i<1)||(i>L.Length)) return ERROR;
    p=&(L.elem[i-1]);        //p为被删除元素的位置
    e=*p;
    q=L.elem+L.Length-1;     //q为表尾元素的位置
    for(++p,p<=q;++p) *(p-1)=*p;
    --L.Length;
    return OK;
}

时间复杂度求解:

假设p_{i}是删除第i个元素的概率,则在长度为n的线性表中删除一个元素时所需要移动元素的次数的期望值(平均次数)为E=\sum_{i=1}^{n} q_{i}(n-i),若假设在线性表任何位置上插入或删除元素都是等概率的,即q_{i}=\frac{1}{n},则E可简化为E=\frac{1}{n}\sum_{i=1}^{n}=\frac{n-1}{2}

所以,在长度为n的线性表中,算法ListDelete_Sq的时间复杂度为O(n),时间复杂度与表长成正比

五、算法的五大特性

总结

1、排序算法:冒泡排序、选择排序、归并排序

2、图搜索:蛮力搜索、离散数学方法

3、时间复杂度的计算

4、算法的五大特性

以上均为个人学习所得见解,若有错误或不足欢迎补充和指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HePingxxb

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

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

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

打赏作者

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

抵扣说明:

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

余额充值