计算机储存数据的时候,我们如果要用它,就需要用其的储存地址,数据结构就是对数据的储存地址来进行有序的记录和整理,便于利用,这是最基本的概念。
第一章-数据结构和算法的概要首先,我们学习数据结构,需要知道一个概念,数据是什么,顾名思义,数据就是信息,它作为一个载体,用来储存我们的银行的存的钱等等,那么在计算机里,数据元素就是数据的基本单位,我们都说过或者听过这些话:这些数据给你,那么这些数据里的每个单位,比如淘宝的购物车就是数据,里面的东西就是数据元素。数据结构是这些互相之间有一定的关系的数据元素的集合,说集合就有点高大上的感觉了了,简单地说就是用来储存管理这些数据元素的储物容器,反正我是这么理解的,举栗子说,数组就是一个大抽屉,数据元素都是规规矩矩的一个挨着一个的摆放,链表就是一条绳子,数据元素一个穿着一个。逻辑结构是指数据元素之间逻辑关系的整体。这个怎么理解呢,举个栗子,比如整理我们的钱,我们一般习惯把最值钱的百元大钞放在最下面,依次50,0,0,5,的摆放,着就是个逻辑结构,这个的一个简单的逻辑结构,其逻辑关系图是:00-50-0-0-5-这个就是四大类中的线性结构了,那么具体的四大类是哪些呢?分别为集合:人类,就是一个集合;线性结构:就是上面的钱排序;树结构:家谱图(谁跟谁结婚,谁生的谁);图结构:国家之间外交关系。储存结构又称为物理结构,是数据及其逻辑结构在计算机中的表示。大白说就是,我们怎么储存到计算机里的,通常来说,如果我们用的程序设计语言不是自己写的,那么储存结构就分为类,一个是用一组连续的存储单元一次存储数据元素,数据元素之间的逻辑关系由元素的储存位置表示;还有一个就是用一组任意的存储单元存储数据元素,数据元素之间的关系用指针来表示。这个是书上原话,简单来说的就是数组和链表,说那么高大上。什么是抽象,抽象就是把一个问题的主要的东西抽离出来而忽略不是主要的细节,比如说我要数很多钱,并且从小到大排序,那么我把它抽象出来,就是一堆整数从小到大排序。这就是抽象问题,其实每个人生来都用,就像知道火烫人,那么我们就用火去弄死那些欺负我们的野兽。计算机里有一个是抽象数据类型,简称ADT,全称自己看书或者百度,ADT是一个数据结构以及定义在该结构上的一组操作的总称,简单来说,就拿我们熟悉的链表来说,链表最基本的添加和删除就是操作,其中的头结点和结点什么的就是数据结构。
算法算法被公认为计算机科学的基石。那么这么牛的东西,是什么呢,刚入大学的时候,我一听算法就感觉好厉害的样子,其实生活中处处都有算法,所谓算法就是解决问题的方法,其有5大特性:.输入:一个算法的输入没有限制,也就是说,输入可以没有,也可由有无限个。.输出:一个算法至少要有一个输出,并且输入和输出具有一定的关系3.有穷性:一个算法必须总是(对任何合法的输入)在执行有穷步之后结束,并且每一步都在有穷时间内完成,就是说必须不能是无限循环那种,不过一般这种的无限循环系统都会提示,有些就需要限定执行步不能超过特定的,比如查询算法等。4.确定性:算法的每一条指令必须有确切的含义,不存在二义性。并且在任何条件下,对于相同的输入只能得到相同的输出,这里的输入并不仅仅指函数的参数。5.可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现,就是说你这个算法必须能实现不能空口胡说,必须有办法能通过已有的能实现的方法来实现这个算法。举个栗子,比如我们去商店买东西,我们买的东西就是输入,输出就是要交出去的钱,有穷性就是你不能无穷无尽的买吧?买到天荒地老?确定性就是你要买辣条,就是为了吃,难道买辣条是为了洗头?而且辣条就是5毛钱固定价,不能第一次去5毛,第二次去就0块钱,可行性就是你必须有钱,而且你买的东西存在,不能去商店买个太阳什么的取暖用吧?再说了,也买不起,这里的买不起就是计算机里的至少现在的配置不够运行你想的算法。这是算法的5大特性,那什么是好算法呢,需要有以下五点:.正确性:算法能满足具体问题的需求,即任何合法的输入,都能独处正确的结果。.鲁棒性(健壮性):算法对非法输入的抵抗能力,即对于错误的输入,算法应能识别并能做出处理么不是产生错误动作或者陷入瘫痪。3.简单性:算法容易理解和实现。就是需要能更简单的地方写的更简单,直到接近完美。4.抽象分级:算法的每一个逻辑步骤可以是简单的一条指令,也可以是一个模块,通过模块完成相应的功能。对于模块的要求,每个模块表示一种抽象,就如之前说的整数排序,模块的内部描述了怎么实现抽象,而模块的名称描述了模块的功能。5.高效性:算法的效率包括时间效率和空间效率,就是花费的时间和所占的空间,他俩一般成反比。我们在这里需要了解的就是算法的描述方法和算法分析。描述方法一般分为:自然语言、流程图、程序设计语言和伪代码,自然语言就是大白话,用我们日常用的语言来描述,流程图就是高中学的那个流程图,但是流程图在现在所具有的局限性太大,所以一般很少用它,程序设计语言就是我们所学的c,java等等,伪代码就是某一种程序设计语言加上自然语言。具体的例子可以上网搜索,有数不胜数的栗子。让我们讲一下算法分析,算法分析分为二种,一种是在算法写完了以后,经过适当的运行,测试其时间和空间消耗,但是这种方法会花费很多时间和经历,第二种是对算法的一种估算方法——渐进复杂度。算法的时间分析,就是执行一次算作一个工作单位,进行估算,用O(大欧)记号来表示时间复杂度。
for(inti=0;in;i++)a++;
这个语句的时间复杂度就是O(n),具体的书上的栗子很多,可以看看,在第5页。不过这些都是次要的,一个精炼的算法,是通过深思熟虑,蕴含一系列的数学逻辑,当然了,有些算法在特定的场合用的话能做到事半功倍的效果,但是同一种算法在另一个场合用就会事倍功半了。
结尾总结一下,数据结构,就是一个管理数据的结构,按需来用;算法就是解决问题的方法,可以借鉴前人的经典算法,也可以自己创造,最好的就是学习前人的,用透用熟,再根据自己的情况来进行改写,修改。好了第一章就结束了,下一次是第二章线性表的相关内容。
白癜风早期好治愈吗北京哪里治疗白癜风比较好