Java学习里程-----Java基础_7数据结构

一、何为数据结构

数据结构,用我自己的话来解释,就是数据存放的样子。用专业的解释方式就是:数据结构是计算机存储、组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。(来源百度百科,因为这个专业)

二、为什么要学习数据结构

从编程的角度来说,我们不管怎么去做,最后都是体现在一个地方,那就是数据。存数据、读数据、删数据等等,但是在做这些操作的时候,你会发现,有的操作快,有的操作慢,那这是因为什么?

比如说我们现在有十个数字(1~10),如何存放到计算机中?

第一种:随便丢

1 9 3 5 2 4 8 6 7 10

但是这样存放在计算机中,你到时候想要读取5的时候,你得一个一个去找,可能命好,找到第一个的时候你就找到了,命不好,最后一个才找到。

第二种:按照大小排序

1 2 3 4 5 6 7 8 9 10

这样能肯定的是,当我们第5次寻找之后,肯定能找到5,但是,这样还不行,你要是这个一直排,一直排,排到什么时候是个头?到时候如果有很多很多数字,那你找起来不得累死啊?

当然,这不管咋操作,就这10个数字,但是要是数据量一下上来了,你检索起来,那就慢到家了。

之所以我们学习数据结构,是因为我们想要在某种程度上学会用适当的方式去存储数据,这些数据结构,都给我们带来了一定的收益,比如说读的速度更快。但是,也会带来一些负面作用,比如需要更复杂的写来支持(检查排列的过程)。选择合适的数据结构,往往可以让我们要做的事情,事半功倍,当然了,一定要根据业务场景,在读、写之间,取一个平衡,在空间和时间之间,取一个平衡。

三、数据结构有那些

1.逻辑结构与物理结构

说到这个还得说一下另外一个东西,叫做数据的逻辑结构。

逻辑结构指,反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后间关系,而与他们在计算机中的存储位置无关。

而逻辑结构可以分为这几样:

1.集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;

2.线性结构:数据结构中的元素存在一对一的相互关系;

3.树形结构:数据结构中的元素存在一对多的相互关系;

4.图形结构:数据结构中的元素存在多对多的相互关系。

除去逻辑结构之外,还有一个是物理结构,这个可能比较好理解,它是指数据的逻辑机构在计算机存储空间的存放形式。

2.线性结构与非线性结构

简单了解这些之后,我们再来说这个分类,按照数据的逻辑结构对其进行简单的分类,包括线性结构和非线性结构两类。

线性结构:

我用自己理解的来说,线性结构就相当于一个线上串的一堆红辣椒,每一个辣椒都是一个数据。

具体线性结构的特点:

1.它只有一个开始点,而且也只有一个结束点。

2.并且只有线上有辣椒才叫结构,不能是空的一个线。

3.每一个红辣椒只知道前面的一个辣椒,不会说有前面有俩辣椒。后面也相同,后面只会跟一个辣椒,不会出现后面多跟了一个辣椒。

线性表就是典型的线性结构,还有栈、队列和串等都属于线性结构。

 

非线性结构:

简单地说,非线性结构就是表中各个结点之间具有多个对应关系。

这个我们也找一个比如,比如说上地铁排队,可能大家正在排队中,忽然同时来了两个人,但是两个人谁也不愿意站在另一个人的后面,紧接着又来俩,又又来俩,慢慢的,队伍呢就变成了一个人字形状,分叉了。

这样的结构我们可以称为非线性结构,因为第一队那两个人前面只有一个人,而那个人后面却有俩人。

我们再来总结一下特点:

1.不能是空的,要是一个人都没有,别说结构了,屁也看不出来。

2.非线性结构的一个结点可能有多个直接前趋结点和多个直接后继结点。

像数组、广义表、树结构和图结构等数据结构都属于非线性结构。(ps:数组中有一维数组、二维数组,一维数组是属于线性结构,但是二维以上的这些个不属于,所以划分到非线性里面去了,具体内容我们后面说)

3.常用的数据结构

以上的那些都是作为铺垫、引子,我们下面来说这个:

我们平时常用的数据结构有很多,我们来说一下:

数组(Array)、栈( Stack)、队列(Queue)、链表( Linked List)、树( Tree)、图(Graph)、堆(Heap)、散列表(Hash)

这八个我们不可能都说了,一是有的我也没有怎么接触过,二是太复杂,我只能师傅带进门,修行在个人了,哈哈哈哈哈

数组:

数组是我们Java中常用的数据结构之一,经常都可以见到他们的影子。它是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。

如何去定义一个数组呢,我们是这样的

类型 []name; 或者 类型 name[]; 这俩不同的地方在于简括号放的地方不一样,下面上代码:

这样我们就定义了两个数组,但是这两个虽然是数组,其实里面是空的,屁也没有,我们给它进行初始化。

name1 = new 类型[]{element1,element2,element3...},下面看代码

上面这样的是静态初始化,也就是在创建这个数组的时候,就给这个数组值了。下面我们来看动态的

在给了长度之后,你就可以随意往里面放值了,但是是有长度限制的,int类型的那个数组里面最多放三个int类型的值,放不了第四个!!!

这里还要说一点,比如说你定义了一个int类型的数组,你不能在里面存放char类型的数据,因为这样你的这个数组就不符合要求了,人家是把一些有序的,类型相同的放在一起,不是随便弄个东西就能放的。

链表:

链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。链表由一系列数据结点构成,每个数据结点包括数据域和指针域两部分。其中,指针域保存了数据结构中下一个元素存放的地址。链表结构中数据元素的逻辑顺序是通过链表中的指针链接次序来实现的。

我给大家画一个图就明白了。(链表分为好多种,单链表、双链表啥的,我们呢说的是单链表)

看这个图,然后去理解上面说的那个话。每一个数据都只知道下一个是谁,但是隔一个就不知道了,也就是说,a1也就能找到a2,但是想要找到a3是不可能滴,因为a1里面只有下一个节点也就是a2的地址,并没有a3的。

树:

这个是一个抽象的概念,并不是我们认识的那种大树,也不是小树!而是这样的:

这个就是树!

这也是一种数据结构的提现,虽然有点丑,但这个东西却非常有研究。

我们简单介绍一下,就用上面的这个图来说。

A啊、B啊、什么的都叫节点。A是一个特殊的节点,它是这个树的根节点,也是起始节点,一个树只有一个根,也就是一个根节点。每个节点下面会有字节点,A有B和C两个字节点。B呢又有D和#这俩节点。A节点相对B和C来说,叫B和C的父节点,B、C是A的子节点。

但是一个树如何去寻找根节点呢,我们是这样去定义的,没有父结点的节点就是根节点。

这里还得说一个名词:度

度是指什么呢,简单说就是一个节点的子节点的个数就是度。比如A这个节点,它的度就是2。

下面我们来说树中的一种树:二叉树(其他的可以自行去学习)

二叉树有如下几个特征:

1.每个结点最多有2个子结点的树(就是不存在大于2的结点)

2.左右子树有一定顺序(比如升序或降序,如下图中8的右子结点大于左子节点,结点27的子节点也是如此关系);

但是二叉树中还会去细化,比如完全二叉树。满二叉树等(有兴趣的同学可以去学习学习)。

 

由于这个数据结构太多了,一个小小的博客根本说不完,所以我推荐大家可以从网上买一些数去读一读,慢慢学习。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他 他 = new 他()

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值