Java版数据结构和算法+AI算法和技能

143 阅读5分钟

Java版数据结构和算法+AI算法和技能

xia讠果☛ukoou.com/resource/1647

数据结构和算法

「算法」就是解决问题的方法或者过程。如果我们把问题看成是函数,那么算法就是将输入转换为输出的过程。「数据结构」是数据的计算机表示和相应的一组操作「程序」则是算法和数据结构的具体实现

如果我们把「程序设计」比作是做菜的话,那么「数据结构」就是食材和调料,「算法」则是不同的烹饪方式,或者可以看作是菜谱。不同的食材和调料,不同的烹饪方式,有着不同的排列组合。同样的东西,由不同的人做出来,味道自然也是千差万别。

Java版数据结构和算法+AI算法和技能 - 链表

我们先来简单介绍一下链表结构的优缺点:

  • 优点:存储空间不必事先分配,在需要存储空间的时候可以临时申请,不会造成空间的浪费;一些操作的时间效率远比数组高(插入、移动、删除元素等)。
  • 缺点:不仅数据元素本身的数据信息要占用存储空间,指针也需要占用存储空间,链表结构比数组结构的空间开销大。

接下来我们来介绍一下除了单链表之外,链表的其他几种类型。

#1.2 双向链表

双向链表(Doubly Linked List) :链表的一种,也叫做双链表。它的每个链节点中有两个指针,分别指向直接后继和直接前驱。

  • 双向链表特点:从双链表的任意一个节点开始,都可以很方便的访问它的前驱节点和后继节点。

#1.3 循环链表

循环链表(Circular linked list) :链表的一种。它的最后一个链节点指向头节点,形成一个环。

  • 循环链表特点:从循环链表的任何一个节点出发都能找到任何其他节点。

接下来我们以最基本的「单链表」为例,介绍一下链表的基本操作。

#2. 链表的基本操作

数据结构的操作一般涉及到增、删、改、查 4 种情况,链表的操作也基本上是这 4 种情况。我们一起来看一下链表的基本操作。

#2.1 链表的结构定义

链表是由链节点通过 ����next 链接而构成的,我们可以先定义一个简单的「链节点类」,再来定义完整的「链表类」。

  • 链节点类(即 ListNode 类) :使用成员变量 ���val 表示数据元素的值,使用指针变量 ����next 表示后继指针。
  • 链表类(即 LinkedList 类) :使用一个链节点变量 ℎ���head 来表示链表的头节点

Java版数据结构和算法+AI算法和技能 - 队列

和线性表类似,队列有两种存储表示方法:「顺序存储的队列」 和 「链式存储的队列」

  • 「顺序存储的队列」:利用一组地址连续的存储单元依次存放队列中从队头到队尾的元素,同时使用指针 �����front 指向队头元素在队列中的位置,使用指针 ����rear 指示队尾元素在队列中的位置。
  • 「链式存储的队列」:利用单链表的方式来实现队列。队列中元素按照插入顺序依次插入到链表的第一个节点之后,并使用队头指针 �����front 指向链表头节点位置,也就是队头元素,����rear 指向链表尾部位置,也就是队尾元素。

注意:�����front 和 ����rear 的指向位置并不完全固定。有时候算法设计上的方便以及代码简洁,也会使 �����front 指向队头元素所在位置的前一个位置。����rear 也可能指向队尾元素在队列位置的下一个位置。具体还是要看算法是如何实现的。

在描述队列的顺序存储与链式存储具体实现之前,我们先来看看队列具有哪些基本操作。

#2.1 队列的基本操作

  • 初始化空队列:创建一个空队列,定义队列的大小 ����size,以及队头元素指针 �����front,队尾指针 ����rear。
  • 判断队列是否为空:当队列为空时,返回 ����True。当队列不为空时,返回 �����False。一般只用于「出队操作」和「获取队头元素操作」中。
  • 判断队列是否已满:当队列已满时,返回 ����True,当队列未满时,返回 �����False。一般只用于顺序队列中插入元素操作中。
  • 插入元素(入队) :相当于在线性表最后一个数据元素后面插入一个新的数据元素。并改变队尾指针 ����rear 的指向位置。
  • 删除元素(出队) :相当于在线性表中删除第一个数据元素。并改变队头指针 �����front 的指向位置。
  • 获取队头元素:相当于获取线性表中第一个数据元素。与插入元素(入队)、删除元素(出队)不同的是,该操作并不改变队头指针 �����front 的指向位置。
  • 获取队尾元素:相当于获取线性表中最后一个数据元素。与插入元素(入队)、删除元素(出队)不同的是,该操作并不改变队尾指针 ����rear 的指向位置。

接下来我们来看一下队列的顺序存储与链式存储两种不同的实现方式。