《数据结构与算法之美》读书笔记1

Java的学习

方法参数多态(向上和向下转型)

向上转型:

class Text{public static void main(String[] args) {Animals people1 = new NiuMa();people1.eat1();//调用继承后公共部分的方法,没重写调用没重写的,重写了调用重写后的。}
}

父类引用子类对象:Fu dui1 = new Zi();

可用该对象调用继承后公共部分的方法,若该方法被子类重写,则调用重写后的方法

向下转型:

class Text{public static void main(String[] args) {Animals people2 = new NiuMa();//要先发生一次向上转型NiuMa people3 = (NiuMa) people2; //将people2强制类型转换成NiuMa类,用people3接收people1.eat1();people3.sleep();}
}

要先发生向上转换:Fu dui2 = new Zi();

向下转换:Zi dui3 = (ZI) dui3;

 

 


接下来是读书笔记:

时间复杂度

所有代码的执行时间T(n)与每行代码的执行次数n成正比,在分析一个算法或者一段代码的时间复杂度的时候,只关注循环执行次数最多的那一段代码就好了。

加法法则

总复杂度等于两级最大的那段代码的复杂度

乘法法则

嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

最好、最坏情况时间复杂度

分别对应着最理想的情况下或者最糟糕情况下,执行这段代码的时间复杂度

均摊时间复杂度

平均复杂度只在某些特殊情况下才会用到,而均摊时间复杂度应用的场景比它更加特殊、更加有限。

 

数组

线性表

线性表包括数组,链表、队列、栈等。

如果问到数组和链表的区别?

回答:链表适合插入删除,时间复杂度是O(1);数组适合查找,查找的时间复杂度是O(1)。

但是这个回答不是准确的,数组是适合查找操作,但是查找的时间复杂度不是O(1),即使是排序好的数据,用二分查找,时间复杂度也是O(logn)。正确的表述应该是,数组支持随机访问,根据下标随机访问的时间复杂度为O(1)

注意

1.防止数组越界问题

2.容器不能完全代替数组

        容器的优势:可以将很多数组操作的细节封装起来,支持动态扩容(最好在创建ArrayList的时候指定数据大小)

        数组的优势:

        Java ArayList无法存储基本类型(int、long)需要封装为(Integer、Long)类,就会有一定的性能消耗

        如果对数据操作非常简单,用数组更好

非线性表

非线性表包括二叉树、堆、图等。

 

链表

对于数组来说,需要一块连续的内存空间来存储,对内存的要求比较高,如果我们申请一个100Mb大小的数组,如果有充足的空间,但是没有连续的,足够大的空间,仍然会申请失败。

而链表将一组零散的内存块串联在一起,其中吧内存块称为链表的结点,为了把所有结点串起来,每个链表的结点出来存储数据之外,还需要记录链上下一个结点的地址,把这个记录下一个结点地址的指针称为后继指针next。

f0ae56cbe981456290cd75f9980fc168.png

单链表

第一个结点是头结点,最后一个结点是尾结点,尾结点的后继指针是指向NULL(空地址)的。

在进行数组的插入、删除操作时,为了保持内存数据的连续性,需要做大量的数据搬移,所以时间复杂度是O(n)。而在链表中插入或者删除一个数据,我们并不需要为了保持内存的连续性而搬移结点,因为链表的存储空间本身就不是连续的。所以,在链表中插入和删除一个数据是非常快速的。

f4112a176ee5487392114313af86c982.png

但是对于随机访问第k个元素,就没有数组那么高效,根据指针一个结点一个结点地依次遍历,直到找到相应的结点。

循环列表

521b07739c3d44938fa04bc2bfd5df06.png

和单链表有一个区别:尾结点指向的是头结点,此时首尾相连,循环链表的优点是从链尾到链头比较方便。当要处理的数据具有环型结构特点时,就适合采用循环链表。

双向链表

7f6cd070b59d40a0a3828c4a4799345f.png

单向链表只有一个方向,因为节点只有一个后继指针next指向后面的结点。但是双向链表的结点还有一个前驱指针prev指向前面的结点。

如果存储同样多的数据,双向链表要比单链表占用更多的内存空间。虽然两个指针比较浪费存储空间,但可以支持双向遍历,这样也带来了双向链表操作的灵活性

链表的删除操作

  • 删除结点中“值等于某个给定值”的结点;

  • 删除给定指针指向的结点。

第一种删除的情况,对于单链表和双链表来说,为了找到给定值的结点,都需要从头开始遍历比对,知道找到给定值的结点,然后进行删除。

第二种删除的情况,是知道要删除的结点,但是我们要知道该结点的前驱指针和后继指针,才能连接前一个结点和后一个结点,从而删除结点。对于单链表来说,为了找到前驱结点,需要从头结点开始遍历链表,知道p->next=q,说明p是q的前驱结点,时间复杂度为O(n)。而双向链表直接存在一个前驱指针,可以直接连接要删除结点的前驱结点和后继结点,达到删除的效果,时间复杂度为O(1)。

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Django与深度学习的股票预测系统 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于Django与深度学习的股票预测系统 ** 该项目较为新颖,适合作为竞赛课题方向&#xff…

Ubuntu桌面环境的切换方法

你在找它吗? 国内麒麟、深度等系统虽然界面更炫,但——软件仓库与Ubuntu官方已不兼容。国内系统遇到稳定性问题,还是得拿Ubuntu做参照。今天本来介绍下这款Linux桌面。 为什么在 Ubuntu 上考虑 LXQt? 性能:LXQt设计为…

计算机网络-计算机网络体系结构-传输层

目录 一、UDP 二、TCP 特点 首部格式 连接管理 可靠传输 流量控制(点对点) 拥塞控制(全局) 三、拥塞控制算法 慢开始&拥塞避免 快重传&快恢复 功能一:提供进程与进程之间的逻辑通信 功能二:复用和分用 功能三:对收到的报…

摩尔信使MThings的协议转换(数据网关)功能

摩尔信使MThings可以作为现场总线(RS485)和以太网的数据中枢,并拥有强大的Modbus协议转换功能。 数据网关功能提供协议转换和数据汇聚功能,可实现多维度映射,包括:不同的通道(总线)类型、协议类型&#xff…

PHP yield

概念: Generator:带 yield的function yield:Generator或task的中断关键字,执行到yield时一次调度周期执行完即阻塞,并返回右侧表达式结果,等待下一次调度器运行next()或迭代遍历才会继续往下执行&#xff0…

Axure RP静态站点的发布与内网穿透结合实现远程访问本地原型页面

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

python生成的报告中绘制了多张图,但最后都混合到一起了

问题来源: 用python生成的报告中,存在三张图,第一个张图是正常的, 后面的图都是不正常的,全都是多张图混合而成的,这是为什么呢? 三段代码均是下述调用方式 import matplotlib.pyplot as plt pl…

【Linux】操作系统的认识

操作系统 1. 冯诺依曼体系结构2. 操作系统 1. 冯诺依曼体系结构 冯诺依曼体系结构的介绍 冯.诺依曼结构消除了原始计算机体系中,只能依靠硬件控制程序的状况(程序作为控制器的一部分,作为硬件存在),将程序编码存储在…

JUC并发编程笔记2

省流: 自己笔记,划走~~~~ 缓存更新策略

mybatis-plus自动填充

前言 这是我在这个网站整理的笔记,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 mybatis-plus自动填充 大家做设计数据表的时候,基本上都会有del_flag,create_time, update_time,这三个字段,这也是…

计算机视觉基础(5)——特征点及其描述子

前言 本文我们将学习到特征点及其描述子。在特征点检测中,我们将学习角点检测和SIFT关键点检测器,角点检测以哈里斯角点检测器为例进行说明,SIFT将从高斯拉普拉斯算子和高斯差分算子展开。在描述子部分,我们将分别学习SIFT描述子和…

内置式永磁同步电机复矢量电流调节器设计

导读:本期主要介绍永磁同步电机复矢量电流调节器。针对内置式永磁同步电机d、q轴电流存在动态耦合的问题,在基于有效磁链概念得到IPMSM的复矢量数学模型,设计出相应的复矢量电流调节器,实现了d、q轴电流的动态解耦。通过仿真验证所…

vue集成钉钉单点登录

初始环境判断 判断是否是来自钉钉环境的访问,返回:boolean类型值 window.navigator.userAgent.includes("DingTalk")前端引入vue中钉钉相关的依赖,并获取钉钉的临时授权码 import * as dingtalk from dingtalk-jsapi; let that …

No171.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Linux-git

文章目录 git简介git常用命令配置初始化仓库将文件添加到暂存区将暂存区文件加入版本库对比工作区某文件和暂存区中的区别将暂存区的文件移除但git仍管理将文件移除暂存区并且git不再管理查看版本库切换到之前的版本恢复文件持久化 云端将本地的项目推送到远程仓库将远程仓库的…

深度强化学习 第 5 章 SARSA 算法

上一章介绍了 Q 学习的表格形式和神经网络形式(即 DQN)。 TD 算法是一大类算法的总称。上一章用的 Q 学习是一种 TD 算法, Q 学习的目的是学习最优动作价值函数 Q ⋆ Q_⋆ Q⋆​ 本章介绍 SARSA,它也是一种 TD 算法, S…

车载视频如何转换视频格式

当你收集了多种视频想在车内进行播放,它们可能不会自动播放。你有可能会在屏幕上看到一条消息,显示“文件格式不受支持”,这是因为这些视频可能采用了你的汽车无法识别的格式。 那我们如何才可以转换为车载播放器上运行的最重要且最广泛使用…

网络协议--IP:网际协议

3.1 引言 IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输(见图1-4)。许多刚开始接触TCP/IP的人对IP提供不可靠、无连接的数据报传送服务感到很奇怪。 不可靠(unreliable)的意思是它不能…

安卓富文本部分高亮及点击事件

安卓富文本部分高亮及点击事件 前言一、富文本是什么?二、实现方法1.使用html2.使用SpannableString 总结 前言 富文本其实不是很常用,但有遇到了过后使用很方便的场景,例如免责声明。这时候就很重要了,前段时间遇到了&#xff0…

可视化(Visual) SQL初探

一、背景 在当今数字化时代,数据信息作为企业和组织的宝贵资源之一,如何挖掘其中的价值并帮助企业和组织个体决策,已然成为炙手可热的话题。数据分析作为其具体载体,是从数据中提取信息、洞察机遇、制定战略、做出决策的关键过程…