哈喽哈喽,大家好,屏幕前的你们在嘎嘛捏?(>人<;)哦对 看博客啊
这个栏目的初心是:帮助大家学习数据结构
那么,我们现在开始叭
你为什么要学习数据结构呢?
哦对,别人说是为了为算法打基础,那么为什么学习算法呢?别人说是为了..........无限套娃
自我介绍一下,我是一名大二在读本科生,网名叫兮屿(初中的时候感觉很好听就一直用着了)
闲话不唠了,现在真的开始咯~
如何学好数据结构?
老师告诉我说同时做到: 多画图 多思考 多写代码 那我先替你们试着后续有想法了也会积极迭代分型的。
老师还说当时侯他每天没事的时候 就自己写一遍数据结构,暂时不懂这个写一遍数据结构是什么意思哈哈哈。
前置知识:
泛型 包装类 集合框架
集合框架里面有对应的集合类,集合类背后有数据结构,所以我们先学习数据结构,然后再学习集合类,然后再学习集合框架。
一、初识
1.0 什么是数据结构
数据结构=数据+结构 描述或者组织一些数据
数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
2.0 我们要学习哪些数据结构呢?
奉上一张图片~
图片有点模糊(后面我慢慢迭代,第一次写多多见谅呜呜呜)
图片内容瞎写一下(我也不知道内容是什么)
二、 时间和空间复杂度
1.0 如何衡量一个算法的好坏?
算法是解决问题的一种方式 在电脑上解决问题
两个标准 时间和空间 花费时间或占用电脑空间
时间被称为 时间复杂度 空间被称为:________(kjfzd)
2.0时间复杂度
这个不是具体多少分钟多少秒啊,是一个数学函数,它定量描述了该算法的运行时间
从理论上来说,一个程序的运行时间是不能算出来的,你自己想想为什么,和呢个电灯泡的合格率一个道理。
算法中基本操作的执行次数,为算法的时间复杂度。(我用deepseek搜索是有点问题,大家也是试试deepseek,尊嘟很方便 网址:DeepSeek | 深度求索)
a.0 大O渐进表示法
1.用常数1取代运行时间中的所有加法尝数。
2.只保留最高阶。
3.如果最高阶存在且不是1,则去与这个项目相乘的常数,得到的结果就是大O阶。
有最好 最坏 平均情况
总结:常数去了 只保留最高阶 最高阶的常数去了
示例:3N平方+2N+123123-------> N平方
(大家也可以自己探索一下 还有哪些奇葩的 比如常数1 )
最重要的问题:为什么大O渐进表示法要这么规定? 因为取影响最高的,便捷
a.1 常见时间复杂度计算举例 : 大家可以找找刚刚的deepseek
(靠了对不qi将就看吧先 以后我注意)
冒泡排序 ( 最好 最坏 平均) 这个大家要注意,我感觉有点小坑
二分查找
讲解一下:每次砍一半 然后再砍一半 直到找到 所以就是2的n次方 倒过来就是log的那个
递归的时间复杂度
常见复杂度
3.0 空间复杂度
一个算法在运行过程中临时占用存储空间大小的量度。
想想 这个大小量度是什么? 什么占用存储空间
答案:xxxxxxxxxxxxxxxxxxx
空间复杂度是变量的个数
三、包装类
1.0 除了Integer和Character 其余基本类的包装类都是首字母大写。
为什么要有包装类 :
2.0 装箱和拆箱
(突然发现这么写 速度有点慢啊)
装箱
四、泛型
这个比前面要复杂一点
推荐大家去b站上面找课,这么短的时间理解不了泛型
1.0 什么是泛型
一般的类和方法,只能使用具体的类型:要么基本类型,要么自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。
理解:定义了一个A类里面有个数组 这个数组是具体固定的 但是能不能用int数组的时候改为int数组,用String数组的时候改为String数组呢? 可以
泛型:就是适用于许多类型。
泛型类
class 泛型类名称 <类型参数列表>{
}
例如:class className <T1 ,T2 ,T3>{
}
类名后面的<T>表示占位符,表示当前类是一个泛型类。
对 是你想的那样 里面的T也可以换
2.0 泛型类的使用
泛型类<类型实参> 变量名; //定义一个泛型类引用
new 泛型类 <类型实参>(构造方法实参);//实例化一个泛型类型的对象
MyArray <Integer> list = new MyArray<Integer>();
MyArray list = new MyArray(); 大家类比着记,或者直接用几遍就熟悉了
MyArray <Integer> list = new MyArray<>();
// 泛型只能接受类,所有的基本数据类型必须使用包装类!!!
3.0 泛型的优点
数据类型参数化,编译时自动进行类型检查和转换。
3.0 泛型的擦除机制
一句话:编译的时候是泛型 编译之后生成的字节码文件在运行期间并不包含泛型的类型信息。
4.0 泛型的上界
在定义泛型时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。
class 泛型名称 <类型形参 extends 类型边界>
这里的extends不是继承的意思啊 就是扩展的意思
因为你先学的继承所以会认为extends是继承哈哈哈
public class MyArry <E extends Number>{ }
四、泛型方法
自己试着尝试揣测一下哦
哈哈 我没有推倒对
public <T> void fangFaMIng ( ){ }
对 就是修饰符后面加 哈哈哈
有static需要放在static后面
public static <T> void fangFaMing ( ){ }