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

news/2024/11/8 1:31:59/

目录

   🍔什么是数据结构?

   🌭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.ppmy.cn/news/11444.html

相关文章

nacos 2.1.0集群生产环境多节点部署

nacos 2.1.0集群生产环境多节点部署 版本 2.1.0版本发布日期 2022-04-29官网 集群部署说明GitHub GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. 下载地址&…

前端优化原理篇(生命周期)

1, 性能评估模型 对于前端的性能的评判 主要是以下四个方面: 2,性能测量工具 1,浏览器的performarce功能 指路可看链接 2,lighthouse工具 3,生命周期 网站 页面的整个生命周期,通俗的讲&a…

《回眸2022·圆满收官||展望2023·砥砺奋发》

系列文章目录 文章目录系列文章目录寄言和CSDN相遇大学生活从小白到千粉博主回眸2022|圆满收官展望2023|砥砺奋发致每一个追梦人寄言 岁月不距,时节如流!站在岁末的门槛前,回望2022这一年,不知你是否已经完美的书写完2022的答卷&…

IndexedDB介绍

文章目录一、参考链接二、概念1、数据库2、对象仓库3、数据记录4、索引5、事务三、IndexedDB 把不同的实体,抽象成一个个对象接口四、注意事项1、event一、参考链接 优秀文章:http://www.ruanyifeng.com/blog/2018/07/indexeddb.html官网:ht…

无桥PFC的家族推演

1. 组合法构建无桥PFC PFC是一种AC-DC变换器,将交流输入电压分成正负半周,输出电压是直流,因此AC-DC变换器可以当做是两个DC-DC变换器的组合。在PFC的拓扑推演中,就是设计两个DC-DC变换器的工作模式。以下内容是基于对陈正格博士发…

centos7:jenkins+nodejs前端自动化部署

系统:centos7 nodejs版本:v16.18.1 npm版本:8.19.2 由于centos7最大只支持16.18.1版本,尽量让前端写代码时使用这个版本,linux系统如果要装高版本的node需要安装glibc库,很危险,尽量不要操作。 jenkin…

【Linux】gcc编译器的使用(程序的翻译过程)

目  录1 程序的翻译1.1预处理(进行宏替换)1.2 编译(生成汇编代码)1.3 汇编(生成机器可识别代码)1.4 链接(生成可执行文件或者库文件)1.5 gcc常用选项总结程序的翻译过程包括&#…

c语言操作符(下)

前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言初阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>: 讲解c语言中有关操作符的知识. 金句分享: ✨✨✨行程…