带你了解学习数据结构和算法(说人话版本)

2024-01-06 05:40

本文主要是介绍带你了解学习数据结构和算法(说人话版本),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.数据结构

1.1.基本概念

数据结构是来进行装数据以及数据之间关系的一种集合,就是计算机来进行存储,组织数据的方式,好比装东西的不同的盒子,不同的东西拿不同的盒子来装,就会起到事半功倍的效果,

1.2数据结构的分类

根据逻辑结构分为:集合,线性,树形,图形,

逻辑结构:数据与数据之间的联系被称为数据的逻辑结构

 集合结构:数据都放在同一个地方,之间是没有什么联系的,就好比你去做公交车,公交车里面的乘客就是一个集合

线性结构:该结构里面的数据存在一对一的相互的关系,就好比排队做核酸,一个对一个,之间存在先后的关系

树形结构:该结构里面的数据存在一对多的相互的关系,就好比学校的老师,一个老师教一个班的学生

图形结构:该结构里面的数据存在多对多的相互的关系,就好比一个人可以有多个身份,一个身份有多个人同时拥有

1.3物理结构的分类

根据物理结构分为:顺序存储结构,链接存储结构,数据索引存储结构,数据散列存储结构(hash)

物理结构:数据的逻辑结构在计算机的存储方式叫为数据的物理结构

A--顺序存储结构:在计算机上面存储的时候是一段连续的内存空间来对于存储每个放入的数据元素

 优点:可进行随机访问,只有知道内存的地址

不足:插入删除效率低,大小固定

代表:数组

B--链接存储结构:在计算机上面存储的时候每个放入的元素位置相邻在内存上也要相邻

 优点:大小动态扩展,插入删除效率高

不足:随机访问,查询效率不高,容易造成碎片化对内存管理不太友好

代表:链表

C--数据索引存储结构:顾名思义就是给一个索引,你通过索引来放置在对于的索引所指示的位置,好比你去图书馆找书,给你一个书籍的寻找牌(在第几层第几个)。

 此图为稀疏索引(就是一组结点在索引表里面对应一个搜索码项)反之就是稠密索引

优点:检索速度快

不足:因为会增加多余的索引表出来,所以会占用比较多的存储空间

D--数据散列存储结构(hash存储):把数据通过函数转为另一个值,这个值就是这个数据在计算机上面的地址值,这个函数就是hash函数,放转换之后的数据的地方为列表

优点:这种是类似为数组的但是查询的速度是比数组快的

不足:存取随机,不便于顺序查找

2.常见的数据结构

2.1集合结构

Set ,Hashset  TreeSet

2.2线性结构

数组,栈(先进后出),队列(先进先出),串和线性表

2.3树形结构

1. 树是什么?

是由一个或者是以上的节点组成的,会存在一个根节点形式的数据结构

A:为根节点

B,C,D:为A的子节点, 但其相互为兄弟节点 ,同时BCD下面没有子节点也可叫为叶子节点

2.二叉树是什么?

就是树中的每个节点的度都不超过2个,(就是每个都有两个孩子)

 满二叉树(两边都是满的)

 完全二叉树(满足:1.除了最后一层其他的是满二叉树,2.在最后一层的节点为依次从左到右分布)

 非安全二叉树(啥也不是)

 红黑树:

特点:1.根节点为黑色  2.叶子节点为黑色  3.红旁边的一定为黑  4.从跟节点出发任意走两边的线黑色都是一样的

红黑树也是属于二叉树,它是通过旋转和变色来保证平衡的

代表:java里面的TreeSet和TreeMap底层

3.B树和B+树

B树是多叉树(避免树的层次太高,造成磁盘IO,读写频繁),是平衡树,

特点:1.每个节点店铺超过了2个

           2.数据存储在节点上,数据不会重复存储

           3.B树比较矮,IO次数越少,搜索性能越

B+树是B树的增强版,在内部的节点上只记录地址,在叶子节点存储数据。叶子节点有双向链表,把叶子节点连起来。查询效率比较高,并且树的高度只有3层

代表:mysql使用的是B+树

3.算法

3.1算法是什么?

是一种解决问题的步骤,一般可以来进行优化我们的接口的效率,比如步骤少了以后,返回的效率就会对应的高了起来

3.2算法复杂度

说一个算法怎么样是根据时间复杂度空间复杂度

时间复杂度:包括时间频度,常数阶O(1),对数阶O(log2n),线性阶O(n)。。。等

空间复杂度:是算法在进行运行的过程中临时占用存储空间大小的量度 

比如:我们知道的缓存就是空间换时间

3.3常见的算法

A--散列算法:就是你给我一个任意长度的数据,我通过散列算法转换为固定的长度(但可能会出现转换之后的值是一致的产生hash碰撞)

比如:MD5 SHA-1等

B--递归:就是自己去调用自己,当达到一个条件的时候就跳出这个循环,不然一直进行调用

注意:一定要给一个出口,不然你的电脑就GG了

C--排序:有以下的各种排序方式

 下面我说的是java中的排序:

关键字:Arrays.sort (元素<47,使用插入排序,元素<286使用快速排序)

关键字:Arrars.aslist(按照自然顺序进行升序排序)

java当中实际时候的也只是一些函数的使用,和方法的来调用来解决,

详细深入的学习10大经典算法给看看下面的文章

https://www.runoob.com/w3cnote/ten-sorting-algorithm.html

本人对算法只是大致的了解,本章就是浅浅的学习了解算法,当然这些只是算法的冰山一角

欢迎进行学习交流,不足之处请指出,喜欢麻烦点赞+收藏,谢谢各位大佬了

这篇关于带你了解学习数据结构和算法(说人话版本)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/575365

相关文章

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四