【数据结构与算法面试入门】算法的基础概念

Q1:算法(Algorithm)是什么?

算法

1 一个有限的指令集
2.接受一些输入(有些情况不需要输入)
3.产生输出
4.一定在有限步骤之后终止
不同于程序,操作系统的程序可以一直运行。
5.每一条指令必须
有充分明确的目标不可以有歧义,要在计算机处理范围内,描述不依赖任何一种计算机语言,要抽象。

【考点】伪代码的书写
选择排序算法的伪代码(Pseudocode)描述
伪代码算法中的注释被括在 /* */ 之中,一定要抽象。
在这里插入图片描述

Q2:什么是好的算法?

算法的效率

衡量算法的好坏是与时间复杂度和空间复杂度息息相关的。

在这里插入图片描述计算机中计算加减法的速度是可以忽略不计的,我们衡量这两个函数的快慢可以只关注乘除法的次数。第一个函数幂指数乘法i-1次,外面有一个乘法,一次循环有i次乘法。总共会有n2+n2\frac{n^2+n}{2}个乘法。第二个函数一次循环只有一个乘法,共有n次。所以我们用时间复杂度来描述这两个函数的话,T1(n)=C1n2+C2nT_1(n)=C_1n^2+C_2nT2(n)=CnT_2(n)=Cn

在分析算法的效率时,我们一般会关注两种复杂度,一种是平均复杂度,一种是最坏情况复杂度。“平均”其实是不容易度量的,所以一般我们更喜欢分析最坏情况复杂度。

分析“二分法”

查找算法中的“二分法”是这样定义的:给定N个从小到大排好序的整数序列List[],以及某待查找整数X,我们的目标是找到X在List中的下标。即若有List[i]=X,则返回i;否则返回-1表示没有找到。
二分法是先找到序列的中点List[M],与X进行比较,若相等则返回中点下标;否则,若List[M]>X,则在左边的子系列中查找X;若List[M]<X,则在右边的子系列中查找X。
试写出算法的伪码描述,并分析最坏、最好情况下的时间、空间复杂度。

第一次写的伪代码有点傻兮兮的,呜呜呜。

int binarySearch(int List[],int X,int N)
	middle=searchmiddle(List[],0,N-i);
	/*寻找二分点*/
	if(middle = X)
		return middle
	else
		while(not middle=X)
			if(middle<X) middle = searchmiddle(List[],middle,N-1)
			else middle = searchmiddle(List[],0,middle)

最好的情况一定是在二分点上就是我们要找的数字,复杂度为1.最坏的情况是在两边,复杂度是log(n),对数指数形式。我感觉自己不会正规表达复杂度,不开心(

Q3:复杂度的渐进表示法
我们最关心的无非是随着我们要处理的数据规模增大后,我们的复杂度是怎样变化的。

复杂度的渐进表示法

【考点】复杂度的表示

在这里插入图片描述我们一般要找到最小的上界和最大的下界。上下界虽说有无数个,我们还是希望找到的是最贴近真实情况的那一个。

下图为各种函数的增长性质:
在这里插入图片描述今日写文背景音乐《没那么难》

没那么难
做个选择没那么难
都是温温暖暖的
零零散散的期盼
没那么难
做个决定没那么难
无非日日夜夜的
也平平淡淡的勇敢
人们犹犹豫豫
错过了许多圆满
总是不知所措
匆匆忙忙 却心烦意乱
其实 没那么难
一个微笑 真的 没那么难
不知不觉中
我们终会把眼泪擦干
其实 没那么难
一个承诺 真的 没那么难
曾经的遗憾 又怎么会
代表如今 要和谁相伴
没那么难
每个答案没那么难
不过起起伏伏的
才真真切切的释然
没那么难
做个决定没那么难
无非日日夜夜的
也平平淡淡的勇敢
人们犹犹豫豫
错过了许多圆满
总是不知所措 匆匆忙忙
却心烦意乱
其实 没那么难
一个微笑 真的 没那么难
不知不觉中
我们终会把眼泪擦干
其实 没那么难
一个承诺 真的 没那么难
曾经的遗憾
又怎么会 代表如今
其实 没那么难
一个拥抱 真的 没那么难
我们的时光
原来不值得与孤单纠缠
其实 没那么难
爱一个人 真的 没那么难
即使会受伤 会聚散
都是生命里最好的片段

数据结构核心原理与算法应用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章