浅学数据结构(归纳)

这次更新不是补充,只是突然对数据结构有一点新的理解,准备记录下来。

 

计算机思维很重要的一点是抽象,将现实世界中复杂的东西去除枝叶,得到核心的东西。接着如果要把这块核心的东西放到计算机上,就需要有条条框框限制保证规范,并且只是一种工具去帮助抽象。

这边引用刘欣老师的一段话

“而我们用的自然语言则是典型的模糊的,不精确的, 程序员面临的一个重要问题, 或者是我们的主要工作就是怎么把自然语言描述的问题转化为计算机语言的表示。

到底该怎么转化, 《数据结构》已经给出了指引: 设计出数据结构, 在施加以算法就行了, 当然现实问题会更复杂, 需要框架,类库,模式等支撑。

这是一种非常重要的逻辑思维能力的锻炼, 也是程序员入门的条件。”

 

————————————————————

 

数据--你要用的东西

结构--装东西的容器,不同结构有不同框架,以适用不同场合。

数据结构--以特定结构存储一些你要用的东西,以方便贴合你对数据进行操作。

算法--完成对数据的插入,删除等操作的方法为算法。

算法复杂度

数据之间关系:

一对一

一对多

多对多

符合日常生活的一般关系

 

1、线性结构(typedef 和struct组合在一起是难点,关键搞懂这俩)

顺序表(顺序存储)--本质上就是数组,只不过多一个可以随时查看数组元素个数。

 

链表--用指针将不同的内存地址联系起来,更加灵活,不需要一整段存储空间。相较于顺序表,链表的插入,删除操作更方便,而查找不如顺序表。(拓展 多重链表,循环链表,只是在原有的结构体里多加指针域,插入,删除等操作上多照顾一个指针域)。

最后注意区分线性表(包括顺序存储和链式存储)和顺序表。

栈--先入后出

队列--先入先出

 

前两者更偏向于数据存放方式的区别,而后两者偏向于数据取出的区别,但都还是在一对一的数据关系上。还有一点要懂得抽象,不是说链表就一定要用指针完成,只要能通过一个数据找到下一个节点就行,抽象之后就不在是程序本身,更重要是思想。

 

2.树(一对多)

进入到一对多

有很多基本定义要先搞定。

度,层次,高度(深度),节点,父亲孩子兄弟,还有掌握特殊的树,二叉树(搞定二叉树,就能用孩子兄弟表示法搞定一般树),哈夫曼树,平衡树,搜索树(查找树)。ASL平均查找长度。

剩下的就是对树的操作,涉及到的算法,树的前序遍历(dfs--深度优先),层序遍历(bfs--广度优先)。完全二叉树的应用(堆--一种优先队列)并查集(集:可以把这两棵树看成两个集合)--查看某两棵树是否同根,并且能实现把两棵树并成一棵的操作。

 

3、图(多对多)

图也有很多定义

简单图,有向图,无向图,完全图,连通图等等。

 

图的表示

邻接矩阵-- 二维数组

邻接表-- 数组加链表

 

图的遍历(深度,广度)经典例子:走迷宫

leetcode 695 岛屿最大面积

最小生成树--Prim(和哈夫曼树有点像),Kruskal(连线更自由)

 

单源最短路径 

算了。。。就到这了下次再来

----------------------------------------

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值