数据结构基础——认识数据结构与算法

news2024/12/26 9:24:22

目录

   🍔什么是数据结构?

   🌭1.数据的逻辑结构

                   🌭NUM 1 : 集合                       🌭NUM 2 : 线性结构

                   🌭NUM 2 : 树形结构                🌭NUM 4 :图结构(网状结构)                  

    🍟2.数据的物理结构

                  🍟顺序存储                                  🍟链式存储

                  🍟索引存储                                  🍟散列存储

    🥞顺序存储

    🥞链式存储

    🥞索引存储

    🥞散列存储

    🍕Tips:

🧀3.数据的运算

    🥪什么是算法?

    🌯算法的特性

    🥩1.有穷性

    🍘2.确定性

    🍙3.可行性

    🍚4.输入

    🍛5.输出

           🍣1.正确性

           🍣2.可读性

           🍣3.健壮性

           🍣4.高效率与低储量需求


   🍕想要学好一门科目,首先得从根本上了解这门科目是做什么的。为了让我们之后数据结构与算法知识学习的更加方便,在我们数据理论与算法课程开始之前,先来了解一下什么是数据结构与算法。本次博客重于理论,对于数据结构与算法有一定基础的伙伴们可以忽略,直接跳到下一篇博客进行阅读。那么闲话少说,就让我们开始本次博客的内容。

   🍔什么是数据结构?

   🍕官方一点的回答是:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么方式构成,以及数据元素之间呈现的结构。但是这样并不容易理解,所以我们只需要阅读过后有大致的印象即可。下面我们来用我们自己的方式解释数据结构。

   🍕通俗一点来说呢,数据结构并不单单是字面上的意思,一个数据的结构?不,数据结构其实指的是三部分。这三部分依次是

                        🍟数据的逻辑结构

                        🍟数据的运算

                        🍟数据的物理结构

    🍕下面我们就通过对这三点进行说明,是我们对数据结构获得初步的了解和认知。

   🌭1.数据的逻辑结构

   🍕数据的逻辑结构通俗来说就是数据元素之间的逻辑关系。主要可以分为一下三类:

                   🌭NUM 1 : 集合                       🌭NUM 2 : 线性结构

                   🌭NUM 2 : 树形结构                🌭NUM 4 :图结构(网状结构)                  

     🍕简单一点来说我们的逻辑结构就是我们对于数据在认知上的结构。据以一个例子:在排队的时候我们自觉排成一队,形状成一条直线的模样,假如把我们每一个人看成是一个数据,那么我们就可以说我们的逻辑结构就是线性结构。或者说:我们在一个学校里面上学,假如学校和学生都看成是不同的数据的话,那么学校和学生的逻辑关系就是集合。我们先对于这部分知识有一个预先的了解,在后面的学习中我们会对这些结构有更加深入的理解。

    🍕接下来我们的在来认识一下数据的物理结构。

    🍟2.数据的物理结构

    🍕数据的物理结构实质上就是数据在内存中真实存储的结构。主要也是四种:

                  🍟顺序存储                                  🍟链式存储

                  🍟索引存储                                  🍟散列存储

    🥞顺序存储

    🍕所谓的顺序存储就是把逻辑上相邻的元素存储在物理位置也相邻的存储单元中。再利用我们上面排队的例子进行分析:我们排队的逻辑结构已经知道了是线性结构了,可是我们要从哪里站到哪里呢?通常情况下我们不同的窗口都会有不同的站队区域就比如:

    🍕像是这样逻辑结构上为线性结构,实际上的存储形式也是连续的相邻的存储形式就叫做顺序存储。(将KFC 门前划定的特定的排队道路类比于在内存中存储的内存位置。)

    🥞链式存储

    🍕在介绍完我们的顺序存储之后我们再来看一看我们的链式存储。所谓的链式存储就是逻辑上相邻的元素存储在物理位置上可以不相邻的,但是借助于我们的指针就可以找到我们的下一个元素的位置的存储形式就就叫做链式存储。通常我们的链式存储可以扩大;零散内存的利用效率。就比如:

    🍕我们可以像图一的形式一样将我们的数据连续保存在空闲的地址上,也可以像是图二的形式一样将我们的数据乱序存储在空闲的地址上,我们都可以很容易的将我们的数据还原成有序的数据列表。这是因为我们在内存中存储的数据这部分中并不只包含了现实生活中的数据还包括了下一个数据的指针。形式如下图所示:

    🍕所以我们就可以通过数据中包含的下一个数据的指针找到下一个数据,进而便于还原。我们的存储形式就形式有一条无形的锁链将我们的数据串联起来,所以这种存储形式就叫做链式存储。

    🥞索引存储

    🍕上面就是我们的链式存储的形式,接下来要介绍的就是我们的索引存储了。要是我们大家学习过计算机网络相关的知识的话我们就会对索引存储比较熟悉。像是我们的路由表就是我们索引存储的一种表现形式。索引存储的主要形式如下: 

    🍕像是上面的表格的形式一样,我们的索引存储就是在存储数据的同时存储一张可以记录各部分数据的表格,那样的话我们对比表格同样可以很快的查找到指定的数据,并将数据按顺序还原。

    🥞散列存储

    🍕最后一点就是我们的散列存储的存储方式了,我们的散列存储表示可以根据关键字直接计算出该元素的存储地址,又称为哈希存储,但是这一类存储并不是简单的三言两语就能解释的所以我们暂时只需要有一个印象即可。到后面我们会进行专题讲解。

    🍕Tips:

    🍕数据的存储结构不同会影响存储空间的分配的方便程度。简单一点来举一个例子:假如我们已经排好的队伍(顺序存储)要是想要插入一个人的话就得然后面的人一次向后移动,这就会很不方便。但是我们要是采用的是链式存储的话就可以随便找一个位置把指针交给指定的元素即可。

    🍕数据的存储结构会影响对数据的运算的速度。就比如我们要是想找到第三个元素我们的顺序存储只需要查找位置为3的元素即可,但是我们要是使用的是索引存储的话我们要想找到第三个元素就要从第一个元素开始查找,先找到第一个元素之后在进行一系列的查找,1->2->3......

    🍕总之顺序存储(物理上是连续的存储方式)和非顺序存储(物理上是离散的存储方式)都各有利弊,我们需要在不同的情况下选择合适的存储方式进行数据的存储以达到最优的效果。

🧀3.数据的运算

    🍕接着我们就来到了我们的数据的运算的理解环节:数据的运算主要包括两部分:1.运算的定义   2.运算的实现   

    🍕运算的定义是针对逻辑结构的,指运算的功能。举一个例子来便于理解:我们一共有十个人进行排队,每一个人都要买一个汉堡,一个汉堡十块钱,每一个顾客买完汉堡店家的收入是多少?这一个例子表达的就是我们运算的定义——我们运算的功能是计算出店家每卖出一个汉堡所获得的钱的数量。

    🍕之后我们来看一下运算的实现:运算的实现是针对数据的存储结构的,指出运算的具体操作。我们依然运用上面的例子来进行理解:我们可以把上面每个顾客给的钱的数量都当作一个数据,我们的存储结构不同那么所要实现的运算也就不一样,比如:我们用的是顺序存储,那么我们就需要按顺序将值进行相加,直接求和。如果我们的链式存储方式我们要做的就是先找到每个元素的位置,然后再将它们相加,得到的才是我们想要的结果。

    🍕以上就是我们的数据结构的具体的三个要素,那么我们对数据结构的初步认识过程也就结束了,接下来就让我们进入我们对算法的初步认识。

    🥪什么是算法?

    🥙相信学计算机的大家经常会听到这个算法怎么怎样,那个算法怎么怎么样的,但是要是被问到算法究竟是一个什么东西呢?也说不出一个所以然来,那么我们现在就来给大家介绍一下到底什么才是算法。

   🥙算法其实值得并不是一个程序的编码,而是一个过程。算法其实指的是我们编写代码将我们数据结构中所转化的信息问题加以解决的过程。我们上面介绍到的数据结构主要的作用就是将具体的场景转化成数据信息并存储在内存中的过程,而我们的算法的作用就是将我们数据结构中所得到的信息按照一定的程序进行解决,所以我们的数据结构才经常和我们的算法联系起来。

    🥙作为我们数据结构与算法专题的第一次博客我们也肯定不能只是简单的介绍一下算法的概念就不了了之,我们再来初步认识一下算法的特性有哪些。

    🌯算法的特性

    🥩1.有穷性

    🍜一个算法必须在执行又穷步骤之后结束,且每一步都可以在有穷的时间内结束。要不然我们也得不到结果,那样我们还要这个算法做什么呢?虽然算法是有穷的但是我们的程序可以是无穷的。我们的程序是由我们的算法组成的,每一个算法对应着解决我们的一个问题,也就是说我们问题的解决时间必须是有限的但是我们问题的数量可以是无限的(程序的运行时长)。

    🍘2.确定性

    🍜在算法中每一条指令必须有确切的含义,相对应的输入只能的到相同的输出。简单的来说就是我们对相同的实践利用同一个算法的得到的结果应该是相同的,只有这样我们的运算步骤才有意义。不知道大家看过三体没有,里面的智子不就是改变我们的实验结果使我们相同的算法实验会的到不同的实验现象,进而干扰我们的经验总结的吗?所以我们要记住,我们的唯一的算法对于相同的输入只能有一组输出与之对应,这就是我们算法中的确定性。

    🍙3.可行性

    🍜这一点的理解和我们上面的有穷性比较像。指的是我们算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。换成我们的编程语言来理解就是说我们使用的内容必须在之前已经实现过了,比如我们要想使用一个Add函数,那么我们就一定要在使用之前就已经将这个函数实现完毕了。这样我们整个程序才能够正常运行。

    🍚4.输入

    🍜一个算法可以有零个或者多个输入,这些输入取自某个特定的条件。这一点很好理解,我们编写的算法程序可以从键盘输入也可以直接printf打印一些值就体现了我们的输入的原理。

    🍛5.输出

    🍜一个算法至少有一个或者多组输出,这些输出是与输入有着某种特定的关系的值。这点我们也很容易理解:我们的程序的编写的价值就是的到一定的答案,假如没有输出我们就不会有答案,我们的程序的运行也就没有意义。

    🦪最后我们来了解一下一个好的算法所应该拥有的特性:

           🍣1.正确性

    🍤我们的算法程序当然是为了解决问题而产生的,所以我们的算法应该能够正确的解决问题才行。

           🍣2.可读性

    🍤一个优秀的算法应该具有良好的可读性,以帮助他人阅读理解代码。

           🍣3.健壮性

    🍤当我们向代码中输入一个非法的数据时,一个好的算法应该具有识别并改正错误数据的能力,即一个好的算法应该具有一定的容错能力,不会产生莫名其妙的结果。

           🍣4.高效率与低储量需求

    🍤这里说的高效率与低存储需求所想表达的意思就是一个好的算法应该具有较小的时间复杂度与空间复杂度。同样能解决问题的程序,运行所花费的时间较少,所占内存的大小较小的算法相对较好。

    🍤经过上面的介绍之后相信大家已经对数据结构与算法具有了一定的理解,我们本次的博客也就到此为止了。希望对你来说有帮助,感谢您的观看,祝您天天开心。

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

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

相关文章

浅谈反弹shell

目录反弹shell总结一、文件描述符二、重定向1、输入重定向2、输出重定向3、错误输出重定向4、exec 绑定重定向三、实现反弹shell的几种方式方法一: find 反弹ubuntu find反弹shell失败的问题任务计划反弹shell失败的问题方法二:使用python反弹&#xff0…

Flink系列-4、Flink运行架构

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址:https://flink.apache.org/ 学习资料:https://flink-learning.org.cn/ 目录Flink基石Fli…

刚当上leader,我让组员去开会,他非说有更重要的会

☆ 职场上经常有那么一种情况就是组长喊组员开会,开周会,开晨会,开各种会,而更有一种常见的情况呢就是组长缺失威严,喊组员开会,组员不听话,说有更重要的会议,不想参加。 ☆ 本文将以…

VIT学习心得

来源:投稿 作者:橡皮 编辑:学姐 小声逼逼 在过去的两年里,Vision Transformer(ViT)是计算机视觉(cv)领域最有影响力的工作之一。「它推翻了2012年在Alex net中提出的CNN在CV领域的统治地位: 当能够获得足够多的预训练…

无接触式磁旋转编码器AS5040介绍

无接触式磁旋转编码器AS5040简介AS5040 是一款无接触式磁旋转编码器,用于精确测量整个360内的角度。此产品是一个片上系统,在单个封装内整合了集成式Hall 元件、模拟前端和数据信号处理功能。测量角度时,只需简单地配备1 个在芯片中心上方旋转…

Spring5的全细节回顾总结

概述: https://cntofu.com/book/95/33-what-new-in-the-spring-framework.md 这个不错。 轻量级javaee框架。 针对于bean的生命周期进行管理。 解决企业应用开发的复杂性。 核心: ​ IOC:控制反转,把创建对象的过程交给sprin…

第一天 Blender操作 | 大帅老猿threejs特训【超详细】

前言 这一天主要是基础理论的学习。 本人学习资料仓库 https://gitee.com/zhang_dezheng_hsr/three-demo.git YCY-TrainingCamp-S2: 在原有的文件上添加本人的学习记录 第一天 Blender操作 | 大帅老猿threejs特训【超详细】【我在掘金的同名文章】 一、大纲 二、THREE 基础概…

Linux查看某个应用的CPU/内存/网卡使用情况

1.查看CPU的使用率 # ps -ef | grep zabbix 进程号是1715 # top -p 1715 可以看到CPU的使用率是0 , 内存的使用率是0 2.查看内存真实使用了多少 #cat /proc/[pid]/status #cat /proc/1715/status VmPeak:进程所使用的虚拟内存的峰值 VmSize: 进程当前使用…

22.字符串初始化方法及赋值,字符串和指针总结

目录 初始化 1.字符数组初始化 2.指针指向文字常量区,初始化 3.指针指向堆区,堆区存放字符串 使用时赋值 1.字符数组,使用scanf或者strcpy 2.指针指向文字常量区 3.指针指向堆区,堆区存放字符串 初始化 1.字符数组初始化 …

各国家语言代码对照表

来源如下 Language Code Tablehttp://www.lingoes.cn/zh/translator/langcode.htm 详情如下 语言代码语言名称af南非语af-ZA南非语ar阿拉伯语ar-AE阿拉伯语(阿联酋)ar-BH阿拉伯语(巴林)ar-DZ阿拉伯语(阿尔及利亚)ar-EG阿拉伯语(埃及)ar-IQ阿拉伯语(伊拉克)ar-JO阿拉伯语(约旦…

万字详解 Linux 网络管理

万字详解 Linux 网络管理1.Linux处理数据包过程2.和网络相关的几个文件说明网卡配置文件ifcfg-*DNS配置文件/etc/resolv.conf(CentOS6环境)/etc/services3.网络接口配置和主机名ifconfigifcfghostname命令4.网关/路由5.网关/路由相关命令route命令配置永…

netty(1):NIO 基础之三大组件

1 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出&…

如何用idea快速的debug本地程序

介绍大家都经常用idea开发, 开发过程中运行程序就会出现各种意料之外的异常, 如果解决这些异常, 尤其是三方jar包抛出的异常,就是一个很关键和棘手的问题.配置环境在第一个选项位置点开后会弹出配置页面,里面可以配置一些启动需要的环境变量.第二个是debug启动按钮第三个是程序…

SQL 优化方案(规范)

SQL优化1、SQL执行顺序2、前置条件2.1、使用explain分析SQL执行计划2.2、开启慢sql日志2.3、慢查询时间设置。默认情况下long_query_time的值为10秒,可以使用命令修改,也可以在my.cnf参数里面修改。3、基础Sql优化3.1、小表驱动大表3.2、高效的分页3.3、…

【linux入门】Linux基础知识学习笔记

文章目录【第一章-宏观知识】1.硬件和软件的关系2.操作系统 是什么、作用是什么3.常见的操作系统4.Linux的诞生5.Linux内核 是什么6.Linux发行版 是什么7.WSL是什么8.虚拟机快照9.FinalShell(Xshell替代品)【第二章-Linux基础命令】1.Linux目录结构2.什么…

Linux下ElasticSearch安装和基本使用

安装 下载安装目录:/home/es-7.12.0 es启动用户:zmsz 出于安全考虑,elasticsearch默认不允许以root账号运行,所有一定要创建一个其他用户执行启动命令,不然一定会报错!! 创建用户:useradd zmsz 设置密码:passwd zmsz下载解压 下载:官网 以最新版8.6为准,执行wget …

MySQL中的limit分页的使用

SQL准备 create table tb_students (id int auto_increment primary key comment 主键ID,studentid char(9) unique not null comment 学生学号,name varchar(10) not null comment 学生姓名,gender char(1) not null comment 学生性别 ) comment 学生表;insert into tb_stude…

【机器学习 - 2】:数据集的处理

文章目录训练集和数据集分离获取最优模型超参数寻找最优模型网格搜索的使用训练集和数据集分离 训练集和数据集分离的原理:当我们获取一个数据集时,我们需要将其一小部分拿出来作为测试集,剩余的作为训练集。例如对于一个训练集,将…

RocketChip RISC-V生成RTL到仿真全流程

一、Scala配置项修改和RTL代码生成可以通过对scala中的配置项修改,来达到定制化配置RISC-V的目的,这里总结几个比较常用的配置项、配置项含义和所在的scala中的位置:1.$rocket-chip/src/main/scala/system/Config.scala1)new With…

机器学习-2-安装Python 3.6和Pytorch 1.1.0

0. 说明: 之前根据GPU版本安装了CUDA 9.0,因此现安装与CUDA 9.0相对应的Pytorch版本,但在安装Pytorch之前要先确认一下Python的版本。 1. 查看 CUDA 9.0 对应的 Pytorch 从https://pytorch.org/get-started/previous-versions/中查找CUDA …