[刷题思路]北大学子侃算法岗的刷题[一]

# [刷题思路]北大靴子侃算法岗的刷题[一]

@[toc]
## 前言

春招已经过半了、很多小伙伴已经拿到工作OFFER,或者实习OFFER了、还有不少人还在备拿OFFER的路上。都知道大厂面试、一道必选题就是算法题,你要问已经过五关斩六将拿下OFFER的人经验,肯定就是少不了2个字:“刷题”。这个绝对不会错, 有不少同学大一就开始准备ACM之类的,根据一万小时定律,这样3年刷下来,面试那写算法提基本是问题不大的。

这时候不少同学要捶胸顿足,悔不当初学霸在图书馆准备打比赛的时候,他也在大比赛,不过是在宿舍农药上分打比赛,哈哈哈,开个玩笑,大家彼此彼此。确实更多的同学不是搞算法竞赛的,半路出家, 甚至是理工科学了点JAVA、C++跨专业或者被天坑培训班坑了几大万培训转行而来的,所以大部分的我们只需要会解决常规的问题,拿下面试问题也不大。

以下是个人的经验的总结,没有哪本算法书会写这些东⻄,另外本人水平也有限,并不算扎实的计算机学霸,有描述不贴切的问题还请放过,当然如果知识有错误,请严厉指出我学习改正。 


这第一篇文章是让大家对算法、数据结构建1个框架性的认识。 从整体到细节,从上到下下,从抽象到具体的这个学习接受新知识的框架思维应该是通用的。

##  ⼀、数据结构的存储式 

通常认为数据结构的存储式有四种:顺序存储方法、链接存储方法、索引存储方法和散列存储方法这四种。

但从算法刷题框架的角度整理地看,其实就是2种:数组(顺序存储)和链表(链式存储)

散列表、栈、队列、堆、树、图等多样化的数据结构,究其源头,都是在链表或者数组的底层结构上进行的特殊操作。

举例说

## 二、队列、栈

这两种数据结构既可以用链表也可以用数组实现。

⽤数组实现,就要处理扩容缩容的问题;

⽤链表实现,没有这个问题, 但需要更多的内存空间存储节点指针。 

 

## 三、散列表

就是通过散列函数把键映射到1个大数组里,解决散列问题2种方法
1、拉链法
需要链表特性,操作简单,但需要额外的空间存储指针
2、线性探查法
需要数组特性,连续寻址,不需要指针的存储空间、操作复杂些

## 四、树

数组实现就是「堆」,因为「堆」是1个完全二叉树,数组存储不需要节点指针,操作也较简单;
链表实现就是常见的 「树」,因为不一定是完全二叉树,所以不适合用数组存储。

为此,在这种 链表「树」结构之上,衍生出各种巧妙的设计,⽐如二叉搜索树、AVL 树、红黑树、区间树、B 树等,以应对不同的问题。 

## 五、图

图的两种表示方法:

1、邻接表--链表

2、邻接矩阵--二维数组

邻接矩阵判断连通性迅速,并可以进行矩阵运算解决一些问题,但是如果图较稀疏的话很耗费空间

邻接表较节省空间,但是很多操作的效率上肯定不如邻接矩阵

综上

数据结构种类不少,或者你也可以自定义的数据结构,但是底层存储还是数组或者链表。

## 六、数组和链表⼆者的优缺点

### 6.1 数组

1、是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,且相对节约存储空间;
2、因为连续存储,内存空间必须1次性分配够,所以数组如果要扩容,需要重新分配1块更大的空间,再把数据全部copy,时间复杂度 O(N);

3、对数组进插入和删除等操作,其时间复杂度 O(N),因为每次必须搬移后面的所有数据以保持连续,

### 6.2 链表 

1、元素不连续,靠指针指向下1个元素的位置,所以不存在数组的扩容问题;

2、如果知道某个元素的前驱节点或后继节点,操作指针即可删除该元素或者插入新元素,时间复杂度 O(1)。但是因为存储空间不连续,你没法根据某个索引算出对应元素的地址,因此不能随机访问

3、由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间。


## 扫码关注公众号

[刷题思路]北大学子侃算法岗的刷题[一]_第1张图片

并回复:算法刷题
免费获取算法刷题大礼包
 

[刷题思路]北大学子侃算法岗的刷题[一]_第2张图片

 

你可能感兴趣的:(数据结构算法刷题,算法,数据结构)