数据结构与算法(适合初学者)

这是我的第一篇博客

未完(开始于2020/7/17- )
大家好! 本人新手一枚。从一个小白,自学两年,到现在开始从事开发工作,一路走过多少艰辛与歧途, 只有自己知道。一路碰撞,请教各路大神,总结了一些自己的学习方法。从初学者的角度特进行整理。(本文不是严肃的科学论文,一些概念未按照教科书严格描述,一些抽象的概念我具体化了,又加上我的理解,所以可能不太准确,欢迎大家批评指正,我经历了学习这些的痛苦,所以我希望能把这个做成一个通俗、易懂、易入门的学习文章)

数据结构

数据元素比作数据元素的集合比作糖盒

数据结构就是形容糖盒的关系(糖放在糖盒里)和运算(怎么放,取,整理)。在数据结构中,之间的相互关系称为数据的 逻辑结构。按照逻辑关系的不同将数据结构分为线性结构(把糖摆成一条线)和非线性结构(把糖摆成平面或立体图形),其中,线性结构包括线性表、栈、队列、串,非线性结构主要包括树和图。数据元素及元素之间关系的存储形式称为存储结构,有顺序存储(把放在什么位置,在什么位置可以拿到)和链接存储(把扔进盒子里,盒子按照自己的规则放置)两种基本方式。
算法对给定问题的求解过程进行描述,设计合理的数据结构可使算法的实现简单而高效。

线性结构

线性结构是元素之间的一种线性关系(一个接一个排列),每个元素与前面和后面的元素有关系
线性结构可以分为三类,线性表、栈和队列、串

线性表

线性表是最基本的一种线性结构,主要的操作是增(插入),删(删除),查(查找),储存方式常采用顺序储存和链式储存

顺序储存:用一组连续的储存单元,依次存储线性表中数据元素,从而使相邻的两个元素物理存储位置也相邻,下图用表格表示物理存储单元(我们都知道是有开关,即0/1存储,就当一个单元格是一个开关),染色的一个格表示元素(一个元素用很多开关存储,每个元素用的开关个数相同),下图可以认为是一个线性表顺序存储的示意图。
在这里插入图片描述
那么我们在来说一说他的增、删、查的过程:

先说一下增的过程,比如要在1后面加个元素,就要先把2-8,从8开始向后挪一位,动了7次,把2的位置空出来,在2的位置上加一个新的值,过程如下图
在这里插入图片描述
我们在来说一下删的过程,比如删除2,先把2删除,在把3-8,从3开始依次向前移动一次,过程如下图
在这里插入图片描述
在来说说查的过程,查比较简单,我就不画图了(我也不知道怎么画),说一下过程,首先找到第一个位置,知道位置和大小,比如想取第4个,就可以计算出4元素的地址(准确说是指针,为了更好理解,后面就说是地址)。可以一次就查到。
所以说线性结构顺序存储的特点是增删慢查询快

链式储存:顺序储存是在内存上开了一块紧密相连的空间,而链式储存就是你可以将元素紧密存放,也可以存放在不相连的位置,通过线(指针/地址)相连在一起。这个线是怎么实现的呢?就上一个元素上存放了两个东西,一个是数据(数据域),一个是地址(指针域)。这个地址不该数据的地址,而是指向其它数据的地址,如下图,数据代表地址,字母代表值。蓝色和红色是地址(指针域)和数据(数据域)上面的无色数字表示数据存放的真实地址,我们看第一个地址是0的,指针域地址指向1,1指向2,2指向4,4指向3,这样就把存放在不同位置的数据串成一条线。
在这里插入图片描述
从上图也可以看两个明显的特征
1 .1,2,3在一起,0,4并没有在一起,说明链式结构可以在内存存在一起,也可以不在在一起
2 .1存放的地址指向2,2指向4,4指向3,地址指向什么并没有限制。

我们在来看看它的增、删、查吧!
看上图,你可以把2删了,也可以在空白的地方在加一个地址用5表示的数据,删除的时候要更改与它相关的数据的指针。1指向2,2指向4,把1的指向改在4,把5加在0后面,把0的指针改向5,5的指针改成1.如果你要查4,你必须从0开始查,0-1-2-4.
所在链表的特点是增删快查询慢

链式储存根据储存和指向又分为单链表、双向链表、循环链表、静态链表。

类型特点优点
单链表:指针域有一个指针,指向下个元素增删快
双向链表指针域有两个指针,一个指向上个元素,一个指向下个元素可以从前往后查,也可以从后往前查
循环链表最后一个元素指向第一个元素从任意一个元素的位置都能查到全部的数据
静态链表所有的元素相邻存放在一起(顺序储存的特点)且有指针(链式储存的特点)增、删、查都快

栈和队列

栈和队列是程序中常用的两种结构,他们的 逻辑结构 与线性表相同,特点在与运算受到了限制。栈,后进先出,队列,先进先出。具体点说呢,你把栈当成杯子,队列当成管子。杯子里放糖,先放的被后放的压在下面,要等上面的拿完在能拿到,管子里放糖,先放的先滑出来,后放的后滑出来。
栈和队列都有顺序结构和链式结构,上线性表的基本一样,顺序结构长度固定,链式结构存储指针实现可增加长度。
队列的顺序结构有个循环队列,就是把管子接成个环,当没有元素时,队头和队尾地址一样,当队列元素满了时,队头和队尾地址也一样,这样可以简化操作。简化判断是不是满队列的操作,两种方式,一种是加一个标识,当队头地址等于队尾地址时可判断是满是空,二,牺牲一个储存单元(这个单元不在储存内容),当队尾的下一个地址是队头,认为队列满。

重点说下栈和队的应用:

栈的典型应用包括表达式求值、括号匹配等,在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈有重要的作用。队列常用于需要排队的,如打印,离散事件的计算机机模拟。后面说算法时会具体说的。

数组

数组(Array)是 有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标()。
数组是用于储存多个相同类型数据的集合。

数组的分类

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值