【数据结构入门精讲 | 第一篇】打开数据结构之门

在这里插入图片描述

数据结构与算法是计算机科学中的核心概念,也与现实生活如算法岗息息相关。鉴于全网数据结构文章良莠不齐且集成度不高,故开设本专栏,为初学者提供指引。

目录

    • 基本概念
    • 数据结构为何面世
    • 算法
    • 基本数据类型
      • 抽象数据类型
      • 使用抽象数据类型的好处
    • 数据结构
    • 常见的数据结构
    • 常用算法

基本概念

数据结构(data structure)是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。

不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。例如,计算机网络依赖于路由表运作,B 树高度适用于数据库的封装。

数据结构为何面世

随着应用程序变得越来越复杂和数据越来越丰富,几百万、几十亿甚至几百亿的数据就会出现,而对这么大对数据进行搜索、插入或者排序等的操作就越来越慢,数据结构就是用来解决这些问题的。

算法

算法是在一类特定的数据模型上定义所有运算并以解决一类特定问题为目标的一个有限的运算序列,它与数据结构是息息相关的。

算法实现的三要素数据:算法需要处理的数据是算法的输入,也是算法的输出。数据包括各种数据类型(如整数、浮点数、字符串、数组、链表、树等),以及数据结构(如栈、队列、堆、图等)。运算:算法的核心是运算,包括各种基本运算(如加、减、乘、除、取模等)、比较运算(如大于、小于、等于等)、逻辑运算(如与、或、非等)等。此外,算法还可以包括一些高级运算(如快速幂、快速排序、动态规划等),以及各种库函数的调用。控制:算法的执行流程需要通过控制来实现。控制包括顺序结构、选择结构、循环结构和函数调用等。顺序结构表示按照代码的书写顺序依次执行各个语句;选择结构包括if语句和switch语句,用于根据条件选择不同的分支;循环结构包括for循环、while循环和do-while循环,用于重复执行某个代码块;函数调用用于将代码分解成多个可重用的模块,提高代码的可读性和可维护性。

算法的描述载体:自然语言、数据流图、程序语言或者伪代码

算法的五大特征

输入:具有零个或多个输入,这些输入取自特定的数据对象集合

输出:至少具有一个或多个输出,这些输出同输入之间存在某种特定的关系

确定性(双重含义):组成算法的每条指令是清晰的、无歧义的;无二义性,对应相同的输入仅有唯一的一条算法执行路径

有限性:序列项数有限且每一项运算时间有限

可行性:∀合法输入 ∃正确输出

注意:程序可以不满足有限性,即程序可以无限循环执行,而算法必须是有限的

基本数据类型

数据类型是指高级程序设计语言中,用以刻划程序中操作对象的特性。类型显式地或隐含地规定了在程序执行期间变量或表达式所有可能的取值范围,以及在这些值上允许进行的操作。

抽象数据类型

抽象数据类型是基本数据类型概念的引伸和发展,指操作对象的一个数据模型以及定义在该模型上的一组操作。 也就是说,对于抽象数据类型的描述,除了必须描述它的数据结构外,还必须描述定义在它上面的运算(过程或函数)。

抽象数据类型的定义取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。

抽象数据类型的内容需要:约定抽象数据类型的名字 、约定在该类型上定义的一组运算的各个运算的名字 、明确各个运算分别有多少个参数、这些参数的含义和顺序以及运算的功能

抽象数据类型的目标:

把数据类型的表示和数据类型上运算的实现,与其在程序中的应用分开,相互独立 ;顶层和底层都与抽象数据类型的定义打交道;算法底层的设计就是数据结构的设计和函数的设计

使用抽象数据类型的好处

顶层设计和底层实现分离、算法设计和数据结构设计分离 、数据模型和运算的内在统一于抽象数据类型之中、局部化、模块化、编出来的程序结构清晰,层次分明,便于程序正确性的证明和复杂性的分析

数据结构

数据结构的结构指的是数据之间的逻辑关系以及数据在计算机中的存储方式。数据的逻辑结构是从具体问题抽象出来的数学模型,反映成分数据之间的逻辑关系,它与数据的存储无关。数据的物理结构是在计算机中的存储和实现方法,包括数据结构中元素的表示及元素间关系的表示。

常见的数据结构

栈(Stack): 栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。

队列(Queue): 队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。

数组(Array): 数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。

链表(Linked List): 链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。

树(Tree): 树是典型的非线性结构,它是包括 2 个结点的有穷集合 K。

图(Graph): 图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。

堆(Heap): 堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。

散列表(Hash table): 散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录。

常用算法

数据结构研究的内容就是如何按一定的逻辑结构,把数据组织起来,并选择适当的存储表示方法把逻辑结构组织好的数据存储到计算机的存储器里。算法研究的目的是为了更有效的处理数据,提高数据运算效率。数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行。一般有以下几种常用运算:

  • 检索: 检索就是在数据结构里查找满足一定条件的节点。一般是给定一个某字段的值,找具有该字段值的节点。
  • 插入: 往数据结构中增加新的节点。
  • 删除: 把指定的结点从数据结构中去掉。
  • 更新: 改变指定节点的一个或多个字段的值。
  • 排序: 把节点按某种指定的顺序重新排列。例如递增或递减。

基础性概念介绍完毕,不同数据结构的实现会在后面的文章中阐发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/222079.shtml

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

相关文章

自己动手写数据库: select 查询语句对应查询树的构造和执行

首先我们需要给原来代码打个补丁,在SelectScan 结构体初始化时需要传入 UpdateScan 接口对象,但很多时候我们需要传入的是 Scan 对象,因此我们需要做一个转换,也就是当初始化 SelectScan 时,如果传入的是 Scan 对象&am…

VUE笔试题精讲1

vue专题| ProcessOn免费在线作图,在线流程图,在线思维导图 VUE面试题视频 01-Vue组件之间通信方式有哪些? 1. 组件通信常⽤⽅式有以下8种: props $emit/$on $children/$parent $attrs/$listeners ref $root eventbus vuex 注意vue3中废弃的⼏个API https://v3-mig…

Python学习之——装饰器

Python学习之——装饰器 参考基础闭包概念装饰器系统自带的装饰器propertystaticmethodclassmethod 自定义装饰器函数的装饰器无参数有参数 类的装饰器无参数有参数 functools.wraps装饰器类 装饰器实现单例模式 参考 python装饰器的4种类型:函数装饰函数、函数装饰…

全志V3s之U-Boot

1、安装交叉编译器: ARM交叉编译器的官网:交叉编译器 a、使用wget下载: wget https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xzb、解…

mmseg上手自己的数据集

制作自己的数据集,VOC格式为例。 这三个文件包括数据集的名称。可以使用labelme脚本自动生成。 跟据预测类别修改配置文件 D:\projects\mmsegmentation-main\mmseg\datasets\voc.py 因为是voc格式的数据集,在这个文件里进行配置,修改成自己数…

每日分享,以元旦为题的诗词

元旦佳节即将来临,相信大家都会在朋友圈表达一下自己的情感,不管大家以前是怎么表达的,今天小编给你分享几首以元旦为题的几首诗,喜欢的朋友可以自取,想要更多免费的诗词,请自行百度或小程序搜索&#xff1…

SLAM算法与工程实践——相机篇:传统相机使用(2)

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址: SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

C++共享和保护——(3)静态成员

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 信念,你拿它没办法&#x…

Java 第8章 本章作业

目录 4.通过继承实现员工工资核算打印功能 6.父类和子类中通过this和super都可以调用哪些属性和方法 8.扩展如下的BankAccount类 10.判断测试类中创建的两个对象是否相等 11.向上转型&向下转型 12.equals和的区别 15.什么是多态,多态具体体现有哪些? 16. java的动…

Spring Bean基础

写在最前面: 本文运行的示例在我github项目中的spring-bean模块,源码位置: spring-bean 前言 为什么要先掌握 Spring Bean 的基础知识? 我们知道 Spring 框架提供的一个最重要也是最核心的能力就是管理 Bean 实例。以下是其原因: 核心组件…

新版Spring Security6.2案例 - Authentication用户名密码

前言: 前面有翻译了新版Spring Security6.2架构,包括总体架构,Authentication和Authorization,感兴趣可以直接点链接,这篇翻译官网给出的关于Authentication的Username/Password这页。 首先呢,官网就直接…

前端如何使用express写一个简单的服务

相信不少前端平常在日常工作中肯遇见过后端API接口没开发出来的时候吧 前端提升小技巧 自己使用nodejs——express ,koa,egg开发接口吧(本人比较喜欢egg和express) 今天先分享一下express 下面是一个简单的demo 1、首先咱们可以新建一个文件夹,创建一个app.js 下…

【开源软件】最好的开源软件-2023-第18名 OpenTelemetry

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

Keepalived+Nginx实现高可用(下)

一、背景 上篇文章介绍了基本的Keepalived的简单入门,但是针对预留的问题还有优化的空间。分别是下面3个问题: 1、如果仅仅只提供一个VIP的方式,会存在只有1台服务器处于实际工作,另外1台处于闲置状态。 势必存在成本资源浪费问题&#xff0c…

LLM之RAG实战(四):Self-RAG如何革命工业LLM

论文地址:https://arxiv.org/pdf/2310.11511.pdf Github地址:https://github.com/AkariAsai/self-rag 尽管LLM(大型语言模型)的模型和数据规模不断增加,但它们仍然面临事实错误的问题。现有的Retrieval-Augmented Gen…

一文讲清 QWidget 大小位置

一文讲清 QWidget 大小位置 前言 ​ QWidget 的位置基于桌面坐标系,以左上角为原点,向右x轴增加,向下y轴增加。 一、图解 ​ ​ 如上图所示,当窗口为顶层窗口时(即没有任何父窗口),系统会自…

JVM的五大分区

1.方法区 方法区主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 2.虚拟机栈 虚拟机栈也就是我们平时说的栈内存,它是为java方法服务的。每个方法在执行的 时候都会创建一个栈帧,用于存…

数据结构学习 12字母迷宫

dfs 回溯 剪枝 这个题和dfs有关,但是我之前没有接触过,我看了这一篇很好的文章,看完之后写的答案。 我觉得很好的总结: dfs模板 int check(参数) {if(满足条件)return 1;return 0; }void dfs(int step) {判断边界{相应操作}尝试…

【JUC】二十九、synchronized锁升级之轻量锁与重量锁

文章目录 1、轻量锁2、轻量锁的作用3、轻量锁的加锁和释放4、轻量级锁的代码演示5、重量级锁6、重量级锁的原理7、锁升级和hashcode的关系8、锁升级和hashcode关系的代码证明9、synchronized锁升级的总结10、JIT编译器对锁的优化:锁消除和锁粗化11、结语 &#x1f4…

基士得耶速印机印件故障解决方法和印刷机使用注意事项

基士得耶和理光两个品牌的一体化速印机同属于理光公司的两个不同品牌。基士得耶速印机的每个机型,都有和它通用的理光速印机的机型相对应。(油墨版纸通用,外观一样,配件全部通用。)速印机在印刷的时候,经常…