数据结构第一章 绪论——走进数据的世界

名人说:唯一可以确定的是,明天会使我们所有人大吃一惊。——阿尔文·托夫勒
本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
✔ 课件资料及视频课程学习:王道 数据结构(B站/MOOC 咸鱼学长主讲)

目录

  • 第1章 走进计算机网络
    • 思维导图
    • 1.0 数据结构学什么?
    • 1.1 数据结构的基本概念
      • 1.1.1 基本概念和术语
      • 1.1.2 数据结构三要素
        • ①数据的逻辑结构
        • ②数据的存储结构
        • ③数据的运算
    • 1.2 算法和算法评价
      • 1.2.1 算法的基本概念
        • ①什么是算法?
        • ②算法的五个特性
        • ③“好”算法的特质
      • 1.2.2 算法的时间复杂度
        • ①如何计算
        • ②常用技巧
      • 1.2.3 算法的空间复杂度
        • ①如何计算
        • ②常用技巧
      • 扩展:计算机求解问题的步骤

以下笔记内容,仅供学习交流,且仅在CSDN平台发布,未经授权禁止二次转发。

第1章 走进计算机网络

思维导图

在这里插入图片描述

1.0 数据结构学什么?

  • 如何用程序代码把现实世界的问题信息化

    比如:现实世界中的“排队”,对应数据结构中队列。

  • 如何用计算机高效地处理这些信息从而创造价值

    例如:计算机处理时,效率并不总是很高的,所以如何用计算机进行高效地处理数据进而创造出有益的价值,也成为了值得研究的一门学问。

在这里插入图片描述

在信息化的世界当中,我们其实可以发现,我们所学的计组也好,操作系统、计算机网络也好,数据结构也好,其实它们之间都有联系

这些知识(可能更多),我们将它们具现化,为我们带来了计算机、手机、以及网络,而这些也恰恰是构成信息化世界的重要部分。

在这里插入图片描述
在人类文明的发展史上,经历了农业革命,人类学会了农耕,这是人类文明的第一次转型,让人与其它动物有了比较具体的区分。

经历了工业革命,这是人类文明的第二次转型,由于工业革命和科技进步,人类开始利用机器和化石能源进行大规模的生产和交通,但也带来了环境污染、资源消耗、社会不平等等问题。

人类文明的第三次转型则是信息革命,由于信息技术和网络通讯的革新,人类开始进入一个数字化、智能化、全球化的时代,出现了互联网、人工智能、生物技术等新兴领域,也面临着信息安全、隐私保护、伦理道德等挑战。

信息化、数字化、智能化的当下,科技每天日新月异,因此学好数据结构,可以帮助我们更好地理解数据、处理数据,也可帮助我们走进数据世界、探索数据,以及发掘数据的潜力!

下面就随我的笔记一起去了解数据结构吧!

1.1 数据结构的基本概念

1.1.1 基本概念和术语

0️⃣数据

数据信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理(二进制0、1)的符号的集合。数据也是计算机程序加工的原料。

在这里插入图片描述

1️⃣早期计算机处理的数据

在这里插入图片描述

2️⃣现代计算机处理的数据

在这里插入图片描述

现代计算机,经常处理非数值型问题。

对于非数值型的问题:

  1. 我们关心每个个体的具体信息
  2. 我们还关心个体之间的关系

那该如何表示每个个体的具体信息呢?
关于这个问题,前辈们引入了 “数据元素” 的概念,可以帮助我们描述一个个体。

3️⃣数据元素
数据元素数据的基本单位,通常作为一个整体进行考虑和处理。

4️⃣数据项
一个数据元素可由若干数据项组成。数据项构成数据元素的不可分割的最小单位

在这里插入图片描述

如果把数据元素弄成一个集合,那什么是数据对象呢?

5️⃣数据对象
数据对象是具有相同性质数据元素的集合,是数据的一个子集。

在这里插入图片描述

知道了如何表示每个个体的具体信息(数据对象),刚才我们还提到了个体之间的关系,关于这一点,我们采用了数据结构来进行描述。
在这里插入图片描述

6️⃣数据结构

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。在任何问题中,数据元素都不是孤立存在的,它们之间存在某种关系,这种数据元素相互之间的关系称为结构(Structure)。

7️⃣扩展

数据对象和数据结构之间的区别在于:

  • 数据对象强调的是数据元素的性质相同
  • 数据结构强调的是数据元素之间的特定关系

数据结构包括三方面的内容逻辑结构、存储结构 和 数据的运算。

数据的逻辑结构和存储结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依濑于所采用的存储结构。

那么接下来就让我们一起了解一下数据结构的三要素。

1.1.2 数据结构三要素

①数据的逻辑结构

逻辑结构是指数据元素之间的逻辑关系。其分为线性结构和非线性结构。具体如下图所示
在这里插入图片描述

关于具体逻辑结构的介绍,我们在后面几章会进行详细阐述。

在这里插入图片描述

②数据的存储结构

存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构。其是用计算机语言实现的逻辑结构。

数据的存储结构主要有顺序存储、链式存储、索引存储和散列存储。

1️⃣顺序存储

逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

  • 优点:可以实现随机存取,每个元素占用最少的存储空间。
  • 缺点:只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。

在这里插入图片描述

2️⃣链式存储

不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。

  • 优点:不会出现碎片现象,能充分利用所有存储单元。
  • 缺点:每个元素因存储指针而占用额外的存储空间,且只能顺序存取。

在这里插入图片描述

3️⃣索引存储

在存储元素信息的同时,还建立附加的索引表。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。

  • 优点:检索速度快;
  • 缺点:附加的索引表额外占用存储空间。另外,增加和删除数据时也要修改索引表,因而会花费较多的时间。
    在这里插入图片描述

4️⃣散列存储

根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储

  • 优点:检索、增加和删除结点的操作都很快。
  • 缺点:若散列函数不好,则可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销。
    在这里插入图片描述
    (本图片来源网络,此处仅做帮助理解使用,侵删)

补充一点

关于数据类型,可以分为以下三类:

1️⃣原子类型
其值不可再分的数据类型。

2️⃣结构类型
其值可以再分解为若干成分(分量)的数据类型。

3️⃣抽象数据类型(Abstract Data Type,ADT)
抽象数据组织及与之相关的操作。

③数据的运算

施加在数据上的运算包括运算的定义和实现。

  • 运算的定义是针对逻辑结构的,指出运算的功能
  • 运算的实现是针对存储结构的,指出运算的具体操作步骤

例如下图,逻辑结构是线性表,存储结构采用顺序存储,实现信息的插入操作。

在这里插入图片描述

1.2 算法和算法评价

1.2.1 算法的基本概念

在介绍算法之前,我们先来了解一个人。

尼古拉斯·沃斯(Niklaus Wirth,1934年2月15日—),生于瑞士温特图尔,是瑞士计算机科学家。他有一句在计算机领域人尽皆知的名言“算法+数据结构=程序”(Algorithm + Data Structures = Programs)。这个公式对计算机科学的影响程度很大,用一个公式就展示出了程序的本质

提出这一公式并以此作为其一本专著书名的瑞士计算机科学家尼古拉斯·沃斯(Niklaus Wirth)于1984 年获得了图灵奖

程序=数据结构+算法,数据结构跟算法都是程序中非常重要的一部分。

  • 数据结构要处理的信息
  • 算法处理信息的步骤

在这里插入图片描述

经过前面的了解我们已经简要了解了数据结构。那么什么是算法呢?

①什么是算法?

算法(Algorithm)对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。

我个人对这句话的理解是,算法是处理信息、求解问题的步骤(也就是你怎么处理、怎么求解的)。以番茄炒蛋为例:
在这里插入图片描述
要解决的问题是,要做出一份番茄炒蛋来,怎么做?这里就要用到算法了,至于求解问题时,个人感觉没有定论,一个问题可以有多个算法来实现。比如开门,我可以通过门把手直接打开,也可以通过钥匙旋转打开,这就是两种不同的算法。

②算法的五个特性

1️⃣有穷性
有穷时间内能执行完。

  • 算法有穷
  • 程序无穷

2️⃣确定性
相同输入只会产生相同输出。

3️⃣可行性
可以用已有的基本操作实现算法。

4️⃣输入
丢给算法处理的数据。

5️⃣输出
算法处理的结果。

③“好”算法的特质

1️⃣正确性

  • 能正确解决问题

2️⃣可读性

  • 对算法的描述要让其他人也看得懂

3️⃣健壮性

  • 算法能处理一些异常状况

4️⃣高效率与低存储量需求

  • 即算法执行省时、省内存
  • 时间复杂度低、空间复杂度低

1.2.2 算法的时间复杂度

①如何计算

  1. 找到一个基本操作(最深层循环)
  2. 分析执行次数x与问题规模n的关系 n=f(n)
  3. x的数量级O(x)就是算法时间复杂度 T(n)

②常用技巧

  • 加法规则:O(f(n))+O(g(n)) = O(max(f(n),g(n))
  • 乘法规则:O(f(n))×O(g(n)) = O(f(n)×g(n))
  • O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2^n) < O(n!) < O(n^n)

在这里插入图片描述

1️⃣举例

在这里插入图片描述

2️⃣扩展

三种复杂度

a.最坏时间复杂度

  • 最坏情况

b.平均时间复杂度

  • 等概率

c.最好时间复杂度

  • 最好情况

3️⃣扩展举例
在这里插入图片描述

1.2.3 算法的空间复杂度

①如何计算

1️⃣普通程序

  • 所占空间大小
    在这里插入图片描述

2️⃣递归程序

  • 递归调用的深度

在这里插入图片描述

②常用技巧

  • 加法规则:O(f(n))+O(g(n)) = O(max(f(n),g(n))

  • 乘法规则:O(f(n))×O(g(n)) = O(f(n)×g(n))

  • O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2^n) < O(n!) < O(n^n)

    O(nlog2n):常对幂指阶

扩展:计算机求解问题的步骤

在这里插入图片描述

计算机解决问题的步骤有多种说法,但一般都包括以下几个方面:

  • 分析问题:明确问题的背景、目标、条件和限制,理解问题的本质和难点,找出问题的已知和未知信息。
  • 设计算法:根据问题的特点,选择合适的数学模型和数据结构,设计一个有效的解决方案,用伪代码或流程图等方式描述算法的逻辑和步骤。
  • 编写程序:根据算法和编程语言的规则,将算法转换为可执行的程序代码,注意代码的规范和注释。
  • 调试运行:在计算机上运行程序,检查程序是否有语法错误或逻辑错误,使用调试工具或打印语句等方式定位和修改错误。
  • 检测结果:使用测试数据或实际数据输入程序,观察程序的输出结果是否符合预期,评估程序的正确性、效率和可靠性。
  • 优化改进:根据测试结果和用户反馈,对程序进行优化和改进,提高程序的性能、功能和可维护性。

一个问题往往有多种解决方案,因此我们可能需要通过不断尝试才能找到最好的方案,如果熟练掌握了基本的数据结构和算法,对于在设计高效算法中是有很大益处的,高效的算法能帮助我们更有效地解决问题。

以上就是个人关于第一章绪论部分的一些笔记与个人理解,欢迎大家评论交流学习!

本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
参考教材:王道《数据结构复习指导书》、严蔚敏《数据结构》
如果对大家有帮助的话,希望大家能多多点赞+关注!这样我动力会更足哦! ღ( ´・ᴗ・` )比心

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 网络延迟排查方法详解

概要 在 Linux 服务器中&#xff0c;可以通过内核调优、DPDK 以及 XDP 等多种方式提高服务器的抗攻击能力&#xff0c;降低 DDoS 对正常服务的影响。在应用程序中&#xff0c;可以使用各级缓存、WAF、CDN 等来缓解 DDoS 对应用程序的影响。 但是需要注意的是&#xff0c;如果 …

Lingo优化软件初步

一、Lingo软件介绍 1、lingo软件的简单介绍 美国芝加哥大学的Linus Schrage教授于1980年左右开发的专门用于求解最优化问题的软件包&#xff0c;后经多年完善与扩充&#xff0c;并成立了LINDO系统公司进行商业运作取得巨大成功。根据 LINDO公司主页&#xff08;http://www.li…

六、HAL_Timer的PWM功能

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407XGT6 2、PWM简介 2.1、什么是PWM (1)PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用&#xff0c;方波的占空比被调制用来对一个具体模拟信号的电平进行编码。 (2)P…

蓝奥声开发高性价比智能wifi插座进军智能家居

关键词&#xff1a;智能家居、家用插座、WiFi插座、高性价比插座 智能硬件的大潮袭来让智能家居这一并不新鲜的概念再次火热起来&#xff0c;关于智能家居的各种场景的描述给了我们很大的想象空间&#xff0c;然而落到实处真正开始走进生活时却又显得那么骨感&#xff0c;一时间…

(30)精准降落和悬停(IRLock)

文章目录 30.1 概述 30.2 哪里可以买到 30.3 连接到自动驾驶仪 30.4 安装到框架上 30.5 通过任务规划器进行设置 30.6 飞行和测试 30.1 概述 Copter 支持使用 IR-LOCK 传感器(IR-LOCK sensor)和声纳或激光雷达(sonar or lidar)进行精确着陆。使用该系统&#xff0c;当飞行…

基于深度学习的目标检测的介绍(Introduction to object detection with deep learning)

物体检测的应用已经深入到我们的日常生活中&#xff0c;包括安全、自动车辆系统等。对象检测模型输入视觉效果(图像或视频)&#xff0c;并在每个相应对象周围输出带有标记的版本。这说起来容易做起来难&#xff0c;因为目标检测模型需要考虑复杂的算法和数据集&#xff0c;这些…

内存的五大分区

一些套话 一个由C/C编译的程序占用的内存分为以下几个部分&#xff1a;栈区&#xff0c;堆区&#xff0c;全局区&#xff08;静态区&#xff09;&#xff0c;文字常量区&#xff0c;代码区 在执行一个C/C 程序时&#xff0c;此程序拥有唯一的“内存四区”&#xff08;栈区&…

00-C++-ccache使用

ccache使用 前言ccache是什么ccache使用 前言 在编译大型C项目代码时编译时间比较长&#xff0c;那么可以使用ccache来加速代码的编译&#xff0c;一起来学习吧。 ccache是什么 ccache是一个编译器缓存。它通过缓存以前编译的结果并检测何时再次进行相同的编译来加快重新编译…

聊聊不同集群的微服务如何通过feign调用

前言 之前业务部门的某项目微服务调用关系如下图 后因业务改造需要&#xff0c;该项目需要将服务A部署到另外一个集群&#xff0c;但服务A仍然需要能调用到服务B&#xff0c;调用关系如下图 之前调用方式是负责服务B的开发团队提供相应的feign客户端包给到服务A开发团队&…

k8s 第一篇 基础知识

一 k8s 1.1 概念 k8s 是一个能让应用部署到容器中&#xff0c;实现自动部署和管理更加高效 自能化的平台。 也就是说通过k8s&#xff0c;能够进行应用的自动化部署和扩容。 1.2 集群的架构流程 1.3 k8s的核心概念 1.4 k8s 集群规划 从第6集开始看

基于OpenCV 实现车牌号码识别--附免费源码

在本教程中,您将学习如何使用 OpenCV 和 EasyOCR 包自动执行车牌/车牌识别 (LPR/NPR)。 EasyOCR是一个开源 Python 包,用于执行光学字符识别 - OCR(从图像中提取文本)。 该软件包非常易于使用,在撰写本文时,它支持 80 多种语言,包括中文、阿拉伯语、法语、英语、西里尔…

MySQL-SQL全部锁详解(上)

​♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#x…

金山企业版杀毒软件平台“终端安全系统V9”linux客户端不能注册的问题解决方法。

金山企业版杀毒软件平台“终端安全系统V9”&#xff0c;出现部分Linux客户端安装后无法注册到服务器的问题&#xff0c;本文提供了一种问题解决方法。 一、平台版本 平台为金山企业版杀毒软件平台“终端安全系统V9”&#xff1a; 平台端版本为V9.SP2.E1004 客户端安装包&…

50从零开始学Java之万类之王Object是怎么回事?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前面的文章中&#xff0c;壹哥跟大家说过&#xff0c;Java是面向对象的编程语言&#xff0c;而在面…

langchain调用chatGLM2纪实

一、科学上网要注意&#xff1a; 域名全代和全局代理&#xff08;网卡&#xff09;&#xff0c;都要打开。这样conda install特别快。 二、安装langchain 1、 conda install langchain 2、 conda install openai 注意&#xff1a; 使用pip install和conda install 是不同…

SpringBoot使用EasyExcel批量导出500万数据

SpringBoot使用EasyExcel批量导出500万数据 说明excel版本比较EasyExcel介绍项目目录mysql对应表建表语句pom.xmlapplication.yml配置类启动类代码OrderInfo 实体类OrderInfoExcel excel模版标题类(EasyExcel需要使用这个)TestController控制层接口层TestServiceTestServiceImp…

十五、docker学习-docker核心docker数据卷

什么是数据卷 当我们在使用docker容器的时候&#xff0c;会产生一系列的数据文件&#xff0c;这些数据文件在我们删除docker容器时是会消失的&#xff0c;但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的&#xff0c;Docker将应用与运行环境打包成容器发布&…

创建启动前端vue与后端python/flask,前后端分离,相互传递参数

创建启动vue 确保你已经安装了Node.js和npm 安装vue npm install -g vue/cli创建vue项目&#xff1a; vue create my-project cd my-project启动vue npm run serve如果安装vue报错&#xff1a;管理员权限模式打开powershell Windows PowerShell 版权所有&#xff08;C&#…

斐波那契数列

目录 斐波那契数列 斐波那契数列和黄金分割率的关联 解析表达式 练习 斐波那契数列 一个人将一对兔子放到一个封闭的围墙内&#xff0c;并假设每对兔子每个月都繁殖出一对兔子&#xff0c;且新生兔子从第二个月开始有繁殖能力&#xff0c;那么一年以后这个封闭的围墙内有多…

kotlin Flow系列之 - 冷流SafeFlow源码解析之 - Safe在那里?

本文涉及源码基于kotlinx-coroutines-core-jvm:1.7.1 kotlin 协成系列文章: 你真的了解kotlin中协程的suspendCoroutine原理吗? Kotlin Channel系列&#xff08;一&#xff09;之读懂Channel每一行源码 kotlin Flow系列之-冷流SafeFlow源码解析之 - Safe在那里&#xff1f; ko…