IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法之美总结笔记 -> 正文阅读

[数据结构与算法]数据结构与算法之美总结笔记

1.时间复杂度分析方式
时间复杂度会因为数据输入的不同,得出来的时间复杂度不同,所以我们先介绍一下常见的时间复杂度的方法
  • 最好情况时间复杂度
  • 最坏情况的时间复杂度
  • 平均情况时间复杂度
  • 平摊时间复杂度
最好、最坏时间复杂度都好理解,我们讲一下平均与平摊复杂度
平均复杂度:先要考虑发生的可能性比如:一个数组数据,我要对数组数据进行查找,可能数值中没有或者有(1/2)概率 ,每次遍历一个对应是n复杂度 n/2 复杂度
平摊复杂度:一般可以用来分析,阶段性前他的复杂度是一样的,达到一个阶段性的阀值后就会是一个更高的复杂度,可以使用平摊来分析,在一般算法中复杂度是取最大复杂度,但是平摊是下下取复杂度,取得就是我们阶段之前出现的连续的复杂度。
2.线性数据结构
第一个线性表:顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。
第二个是 连续的内存空间和相同类型的数据 。正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。 但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。
3.为什么数组下标不从1开始
第一点:从数据结构的角度看,下标是对数据偏移量的体现数据寻址的计算( a[k]_address = base_address + k * type_size )k这代表偏移量 ,如果我们使用1位初始下标,寻址的公示变为( a[k]_address = base_address + (k-1) * type_size )可以看到多了一个减法,数组作为底层的数据结构,一个减法会对性能有所影响的。
第二点:可能是因为语言发展史影响,C语言是较早语言,它的数组是以下标位0开始,后面较晚的语言后面都是使用0位开始可以受影响了,后面还有一些可以支持负数下标的语言python。
4.链表种类
链表是使一组零散的内存块串联在一起,的一种数据结构,第一个节点被称为首节点,最后一个节点被称为尾结点,每个节点都是通过节点直接的后续指针next进行关联上。尾结点的next结点是null,用来标记是尾结点。
单链表:一条分散的内存组成的一条链表,也是链表中最简单的链表。
循环链表:其实就是一种特殊的单链表,就是尾结点和首结点是相连的链表结构。
双向链表:实际开发中双向链表的使用场景比,单链表场景多,双向链表的上在单链表基础上添加了前结点,把他们前后都关联上,单结点只有后结点,只能知道后面数据,前面数据只能遍历进行获得,而双向链表则天生满足,并且在插入和删除性能都优于单链表,比如删除,我知道需要删除那个结点,我又有前后结点地址我只需要把前后结点地址换一下就可以了。
循环双向链表:其他特性都和双向链表一样的,但是首结点和尾结点都是相互关联起来的。
5.轻松写出链表代码的思考思路
技巧一:理解指针和引用的的含义
?? ?将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。
技巧二:谨防指针丢失和内存泄漏
?? ?1.记得插入结点时,对结点处理的顺序导致指针丢失 2.记得删除结点时,对内存手动清理(如:Java 则不需要考虑了,有GC回收)
技巧三:利用哨兵简化实现难度
?? ?没有实现哨兵(不带头链),实现需要考虑插入和删除最尾结点要进行特殊处理(没有带头链会对实现的处理差异化)。使用哨兵头结点(带头链),实现不要考虑插入删除不要特殊处理,应为不会影响的带头链(插入和删除结点不需要特殊处理)。
技巧四:重点留意边界条件处理
?? ?一定要在编写的过程中以及编写完成之后,检查边界条件是否考虑全面(全部场景),以及代码在边界条件下是否能正确运行。
技巧五:举例画图,辅助思考
?? ?举例法:是对数据进行带入然后进行验证,类似于程序dobug调试一样。画图法:画出图形方便理解和思考,直观观察数据的变动方便理解。
技巧六:多写多练,没有途径
?? ?多手写代码与思考,多练代码题。
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章           查看所有文章
加:2021-10-08 12:01:22  更:2021-10-08 12:04:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:55:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码