Day01_LInked

Day01_Linked

1, 概述

// 学习流程
//      javase基础
//      数据结构 集合类
//      前端
//      数据库
//      EE:  javaee服务器开发
//      Spring 以及spring的衍生框架
//      分布式

框架: 简化开发

//能不能找到工作, 看se
//找到好工作, 框架和项目

// 服务器: 什么是服务器?
//     1, 云服务器:  一个在远端/远程的物理电脑
//     2, 运行在物理服务器上的程序:  

// 物联网的产生: W3C的成立   
// 网络三要素: 在网络上获取资源
//     HTTP:  资源在网络中传输的方式  --> 网络模型
//     HTML: 资源的格式
//     URL:  指示资源路径/地址


//http://cskaoyan.com/forum.php  --> 80
//https://www.taobao.com/  --> 443
   
    
    
// 前端 后端  pc  安卓 ios  小程序 游戏(游戏引擎)  
// 前端: 攒页面
// 后端: 攒数据
    

2, 学习方法和要求

// 学习流程
//      javase基础
//      数据结构 集合类
//      前端
//      数据库
// ------------------------------------------------
//      EE:  javaee服务器开发
//      Spring 以及spring的衍生框架
//      分布式
//
// se学习, 是死的知识点, 练习和记忆
// ee之后, 掌握思想脉络 ---> 前端
//  
//  一些要注意避免的学习习惯
//    1, 下课看视频-->"恍然大悟" --> 错觉
//    2, 晚上脑海一片空白 -->  课上记笔记的方式要注意(核心脉络), 课间扩充这个脉络
//    3, 预习,  -->  10-30分钟之间预习时间. 解决一个问题: 明天讲这个东西是什么? 宏观层面可以干啥?
//    4, 下课立即写作业 -->  建议先整理今天的知识笔记或者敲今天上课代码

//  晚自习: 整理笔记,  敲上课代码,  写作业   , 扩展一下
//  
//  补充:
//    1, 视频--> "翻" --> 
//    2, 笔记问题. 必须要有,  
//    3, 作业, "攒"作业.
//    4, 敲代码.  


//规则要求
//  1, 上课不允许睡觉
//  2, 教室不允许娱乐相关的视频/游戏.... -->  2km/4次
//  3, 上课玩手机


3, 数据结构和集合类相关问题

//数据结构: 实现
//集合类
//前端


// 数据结构学习的前提目的要求:
//      1, 前提: if else     值,引用
//      2, 目的: 知道数据结构, 集合类用到了数据结构, 
//               多写一些代码(要求大家上课代码, 要写)
//      3, 要求: 认真听课, 认真写代码
// 
//
// 算法题: 刷题  --> 面试要用
// 大公司,算法硬性要求
// 小公司,
// 
// 算法题要不要刷: 
// 
// 


// 集合类: 数据容器, 实际上就是对数组和链表的'包装'
// 注意, 对于我们java代码来讲, 写一个服务, 更多的角色是作为一个数据的"中转站", 处在用户和数据库之间
//  所以在处理数据的时候, 我们需要一个在内存中临时存储数据的对象
//  这个临时存储数据的对象, 可以直接用数组, 但是使用数组, 会有一些问题(扩容不确定, 类型, 元素删除和移动的问题,  效率问题)


// 集合类和数据结构的关系?
// 集合类有时候要解决数据存储/删除/查找的效率问题, 所以我们有些集合类要按照特定的数据结构组织数据.


// 什么是数据结构:  数据+结构, 数据的组织方式
// 常见的数据结构: 
//          集合: 一堆无序的数据
//          线性表: 有序序列, 除了头和尾以外, 每一个元素都有唯一的前驱和后继
//          树: 描述的是一种一对多的层级关系
//          图: 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2K1oAEhr-1641383013486)(.\img\java的集合类.jpg)]

4, 数组和链表

4.1, 数组

Q1: 数组我们都很熟悉,那你理解的数组是什么样的呢?它的最主要特点是什么呢?
// 数组在内存上是连续存储(内存开辟一份连续的内存空间存储数组) --> 随机访问
// 数组起始地址 + 下标 * 数组单个存储单元的大小

Q2: 为什么数组的索引是一般都是从0开始的呢?
// 易语言:
// 下标为0开始, 是一个历史遗留问题.
// 如果从1开始: 数组起始地址 + (下标-1) * 数组单个存储单元的大小

Q3: 为什么数组的效率比链表高?
// 数组是连续存储,  链表是非连续存储

数组的操作效率

时间复杂度:

空间复杂度:

数组的基本操作
添加 (保证元素的顺序)
      最好情况:O(1)
      最坏情况:移动n个元素,O(n)
      平均情况:移动 n/2 个元素,O(n)
删除 (保证元素的顺序)
     最好情况:O(1)
     最坏情况:移动n-1个元素,O(n)
     平均情况:移动(n-1)/2个元素,O(n)
查找
     a. 根据索引/下标查找元素:O(1)
     b. 查找数组中与特定值相等的元素
           ①大小无序:O(n)
           ②大小有序:O(log2n)
    
    
// 数组, 添加和删除是o(n),  查找是o(1)

4.2, 链表

什么是链表: 在java中链表, 就是通过对象间相互持有和引用构建出的链式结构

形象地说,链表就是用一串链子将结点串联起来。

结点:包含数据域和指针域。
数据域:数据
指针域:下一个结点的地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gELInUbP-1641383013491)(.\img\链表.jpg)]

链表的分类

单链表: 除了尾结点, 每一个结点都有一个后继结点

循环链表: 是单链表的改进, 尾结点的下一个结点指向头结点

双线链表: 是单链表的改进, 双向链表的结点, 不仅有后继结点还有前驱结点

双向循环链表: 是双向链表改进, 尾结点的下一个指向头, 头结点之前指向尾结点

链表的分类

慎用递归

单链表的时间复杂度

// 单链表的时间复杂度
// 添加: o(1)
// 删除: o(1)
// 查找:根据下标,根据内容/有序和无序: o(n)

双向链表的时间复杂度

// 双向链表的时间复杂度
// 添加: o(1)
// 删除: o(1)
// 查找:根据内容/有序和无序: o(n)
//      根据下标查找: o(n),  但是实际消耗的平均时间是n/4 (单链表是n/2)

// 结论: 根据下标的查找, 双向链表和单链表虽然都是o(n), 但是实际双向链表的时间是更少的

// 那为什么在工程上,我们用的一般是双向链表而不是单链表呢 (比如JDK中的 LinkedList & LinkedHashMap)? ---> 隐含了一个点, 如果我们使用集合类(数据容器)存储数据的时候, 相比较添加和删除,查找操作要更频繁

使用链表实现一个线性表–> 手动实现一个集合类

// 实现一个数据容器: 使用者

// 底层用链表: 单链表 or 双链表

// 隐含表现的数据结构: 线性表

什么是集合类?

/**
 * 一个集合类有三个角度
 * 1, 是一个集合类/数据容器--> 使用者的角度 --> 使用
 * 2, 底层实现角度  -->  数组, 链表,  数组+链表
 * 3, 隐含的数据结构角度 --> 线性表, 树, 集合...
 */

注意: java程序员注意

实现功能: 最重要的

代码可读性: 其次

底层用链表: 单链表 or 双链表

// 隐含表现的数据结构: 线性表

什么是集合类?

/**
 * 一个集合类有三个角度
 * 1, 是一个集合类/数据容器--> 使用者的角度 --> 使用
 * 2, 底层实现角度  -->  数组, 链表,  数组+链表
 * 3, 隐含的数据结构角度 --> 线性表, 树, 集合...
 */

注意: java程序员注意

实现功能: 最重要的

代码可读性: 其次

代码效率: 再其次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值