文章目录
前言
hello,大家好,这里是阿旭啊。从今天开始我为大家更新数据结构这个体系的知识。这一次一定不会再当鸽子了,希望大家多多支持,评论,批评~~~
本文将为大家带来初识数据结构,包括大家的一些刚开始学这门科目的时候的一些小问题以及复杂度的一些知识,希望能帮到大家。
一、前置知识
1.Java的数据结构与C++的数据结构有什么不同
一样的!!数据结构是一门学科,可以用不同的语言表达出来,不会规定必须使用哪个语言。
2.数据结构和数据库有什么区别
这是两个不同的东西,数据库的底层的组织也是用到了数据结构!
数据结构:是描述和组织数据的方式。不同的数据结构组织和描述数据的方式是不一样的。特定的情况下会使用特定的数据结构!!!
数据库:用来存储我们的数据。
3.数据结构和Java的集合类有什么关系
可以认为Java集合类的背后就是一个数据结构,只不过Java类已经帮我们实现了这个结构,我们无需实现。
4.可以不学具体的实现,直接去实现Java的集合类吗
不可以,著名哲学家贞德式我鸭曾经说过:“学了数据结构的编程员比不学的要强很多。”只有学习了具体的实现才可以在实战中灵活的去使用。
5.数据结构与算法有什么关系呢
一个题要是用算法实现是离不开好的数据结构的!!!数据结构从某种意义上来说是为了支持我们算法的实现的。
二.集合框架:
1.什么是集合结构
多个集合类组成的,并且集合类之间都是有一定关联的。
下面列出的是比较重要的接口和抽象类
2.容器背后的数据结构
该阶段,我们主要学习以下容器,每个容器其实都是对某种特定数据结构的封装,大概了解一下,后序会给大家详细讲解并模拟实现:
Collection:是一个接口,包含了大部分容器常用的一些方法
List:是一个接口,规范了ArrayList和LinkedList中要实现的方法
ArrayList:实现了List接口,底层为动态类型顺序表LinkedList:实现了List接口,底层为双向链表
Stack:底层是栈,栈是一种特殊的顺序表
Queue:底层是队列,队列是一种特殊的顺序表
Deque:是一个接口
Set:集合,是一个接口,里面放置的是K模型HashSet:底层为哈希桶,查询的时间复杂度为O(1)
TreeSet:底层为红黑树,查询的时间复杂度为O(),关于key有序的
Map:映射,里面存储的是K-V模型的键值对HashMap:底层为哈希桶,查询时间复杂度为O(1)
TreeMap:底层为红黑树,查询的时间复杂度为O(),关于key有序
3.相关的Java知识
泛型Generic
自动装箱 autobox 和自动拆箱 autounbox
Object 的 equals 方法
Comparable 和 Comparator 接口
(这些东西之后会给大家讲解,大家也可以自行学习呦~)
4.什么是算法
算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。
5.如何让才能学好数据结构呢
死磕代码;画图多思考;多刷题。
三.复杂度
1.用算法速率来衡量一个算法的好坏。
2.算法效率
算法效率分析分为两种:一种是时间效率,一种是空间效率。时间效率被称为时间复杂度,空间效率被称为空间复杂度。时间复杂度主要衡量的是一个算法的运行速度,空间复杂主要衡量一个算法所需要的额外空间。现阶段大家更关注时间而不是空间。
3.时间复杂度
3.1 时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。由于每个电脑的处理器不同,导致相同的代码在不同的机子上掐表的时间会不一样,于是有了时间复杂度这一概念。一个算法所花费的时间与其中语句的执行次数成正比,算法中的基本操作次数,为算法的时间复杂度。
3.2 时间复杂度的计算:将语句的所有运行次数相加(运行一次的语句可以相加也可以不加)。再使用大O的渐进法表示(去掉了那些对结果影响不大的项)。
大O的渐进法表示:用常数1取代运行时间中的所有加法常数。—>在修改后的运行次数函数中,只保留最高阶项。—>最高阶项系数不是1,则去除系数,最后得到结果。
如:
最后的结果为:
另外有些算法的时间复杂度存在最好、平均和最坏情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
默认情况下都是指最坏情况。
这里引入一片平轮复杂度的计算,大家可以去学习学习:平均时间复杂度计算。
要记住:
1.不管是时间复杂度还是空间复杂度,都要结合思想去看,不要只看代码!
2.递归的时间复杂度=递归的次数*每次递归后执行的次数。
4.空间复杂度
空间复杂度的定义:空间复杂度是对一个算法在运行过程中临时占用储存空间大小的量度。空间复杂的算的是额外变量的个数。也是用大O渐进表示法。
例:
/ / 计算bubbleSort的空间复杂度?
void bubbleSort(int[] array) {
for (int end = array.length; end > 0; end--) {
boolean sorted = true;
for (int i = 1; i < end; i++) {
if (array[i - 1] > array[i]) {
Swap(array, i - 1, i);
sorted = false;
}
}
if (sorted == true) {
break;
}
}
}
额外的变量为end,i,sorted三个,所以空间复杂度为O(1)。要注意参数array是一个必要的变量,必须要有它才可以计算,所以array不能算作额外的变量。
递归的空间复杂度=递归的次数*每次递归的变量个数
总结
本文就到此结束啦,不出意外的以后应该两天会更新一篇博客(可能是java也可能是数据结构),希望能帮到大家,我们一起学习,一起进步,一起成长!!