本课链接:计算机科学速成课第十三课
本课主要内容:简单介绍算法
一、算法中重要概念
算法:是解决问题的具体步骤(如排序算法等)
算法复杂度:算法的输入大小和运行步骤之间的关系
大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;
}
时间复杂度求解:
假设是删除第i个元素的概率,则在长度为n的线性表中删除一个元素时所需要移动元素的次数的期望值(平均次数)为,若假设在线性表任何位置上插入或删除元素都是等概率的,即,则可简化为。
所以,在长度为n的线性表中,算法ListDelete_Sq的时间复杂度为O(n),即时间复杂度与表长成正比。
五、算法的五大特性
总结:
1、排序算法:冒泡排序、选择排序、归并排序
2、图搜索:蛮力搜索、离散数学方法
3、时间复杂度的计算
4、算法的五大特性
以上均为个人学习所得见解,若有错误或不足欢迎补充和指正