《数据结构与算法之美》读书笔记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.hqwc.cn/news/144779.html

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

相关文章

某验四代滑块验证码逆向分析

逆向目标 目标:某验四代滑块验证码,w 参数逆向主页:aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v加密算法:RSA、AES 通讯流程 验证码流程分析 进入网页后,打开开发者人员工具进行抓包,点击滑动拼图验证&#xff0c…

App分发的策略和注意事项

当今的数字化时代中,移动应用程序已经成为了人们生活中不可或缺的一部分。随着智能手机的普及和移动互联网的快速发展,应用程序的分发方式也变得越来越多样化。 App分发是指将移动应用程序通过特定的渠道传递给终端用户的过程。在应用程序开发完成后&am…

Jenkins环境部署与任务构建

一、CI/CD 1、CI/CD 概念: CI/CD 是一种软件开发和交付方法,旨在加速应用程序的开发、测试和部署过程,以提高软件交付的质量和效率。 (1) 持续集成 (CI Continuous Integration): 持续集成是开发团队频繁集成其代码更改的过程。开发者将其…

[Golang]多返回值函数、defer关键字、内置函数、变参函数、类成员函数、匿名函数

函数 文章目录 函数多返回值函数按值传递、按引用传递类成员函数改变外部变量变参函数defer和追踪说明一些常见操作实现 使用defer实现代码追踪记录函数的参数和返回值 常见的内置函数将函数作为参数闭包实例闭包将函数作为返回值 计算函数执行时间使用内存缓存来提升性能 参考…

数据结构 MapSet(搜索)

数据结构 Map&Set(搜索) 文章目录 数据结构 Map&Set(搜索)1. 搜索树1.1 概念1.2 初始构建1.3 操作-插入1.4 操作-查找1.5 操作-删除1.6 性能分析 2. 搜索介绍2.1 概念及场景2.2 模型 3. Map的使用3.1 关于Map的说明3.2 关于Map.Entry<K, V>的说明3.3 Map的常用方…

又哭又笑,这份面试宝典要是早遇到就好了

01、算法原理 选择排序(Selection sort)是一种简单直观的排序算法。 第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找到最小&#xff08;大&#xff09;元素&#…

Top 10 数据恢复工具,可从iPhone 和 iPad 恢复数据

您是否正在寻找最好的 iPad 恢复软件&#xff0c;但不知道哪个选项最好&#xff1f;没有什么可担心的。本文将为您提供有关根据文件类型、设备兼容性和数据丢失原因等因素选择合适的 iPad 恢复软件的提示。此外&#xff0c;前 10 名提到的恢复软件是安全可靠的。 第 1 部分、iP…

文档的重要性及接口文档模板

随着工作年限的增长&#xff0c;我们逐渐意识到工作中文档的重要性不可忽视。优质的文档不仅能提高工作效率&#xff0c;还能有效降低沟通成本&#xff0c;因此我们必须注重文档的撰写和格式。最近&#xff0c;由于未能及时更新文档&#xff0c;导致在项目开发中出现了信息冲突…

搭建网站七牛云CDN加速配置

打开七牛云后台&#xff1b;添加域名&#xff1b; 添加需要加速的域名&#xff0c;比如我添加的是motoshare.cn 源站配置&#xff0c;这里要用IP地址&#xff0c;访问的目录下面要有能访问测试的文件&#xff0c;尽量不要用源站域名&#xff0c;这个只能用加速二级域名&#x…

51单片机KeyWard

eg1&#xff1a; 单片机键盘的分类 键盘分为编码键盘和非编码键盘&#xff0c;键盘上闭合键的识别由专用的硬件编码器实现&#xff0c;并产生键编码号或键值得称为编码键盘&#xff0c;如计算机键盘&#xff0c;而靠软件来识别的称为非编码键盘&#xff0c;在单片机组成的各种…

Leetcode-Easy题解1-回文数字

目录 解法1解法2 解法1 自己的想法,直接转成字符串首尾俩下标同时遍历比较 class Solution {public boolean isPalindrome(int x) {if(x<0){return false;}String strString.valueOf(x);int i0;for (;i<str.length()>>1;i){if(str.charAt(i)!str.charAt(str.leng…

AI篇-如何用AI辅助对图片进行鉴赏

前言 目录 前言 一、观众侧鉴赏图片 方法1&#xff1a;直接将图片发给文心一言&#xff0c;让文心一言分析。 方法2&#xff08;正确方法&#xff09;&#xff1a;将图片简单介绍并把图片发给文心一言&#xff0c;让文心一言分析。 二、作者介绍图片 方法&#xff08;正…