当前位置: 首页 > 网络应用技术

数据结构的原理 - 线性表(线性列表)和Java实现案例

时间:2023-03-07 18:13:02 网络应用技术

  本文基于Java线性表详细介绍了数组和链接列表的逻辑,并具有带有线性表,单个链接列表和静态链接列表的Java实现案例。

  线性表:零或多个数据元素的序列有限。包括阵列,链接列表,堆栈空间,队列和其他结构是线性表。

  最基本的线性表被描述为:线性表的数据对象为{a1,a2,...... an}。除了最后一个元素,每个元素只有一个直接的后续元素数据,即元素的元素,一个 - 一个 - 一个之间的关系是一个-to -one。数据结构的开发,更复杂的线性桌子在将来出现。它们可能具有其他特征,但是上面观察到了基本特征。

  上面的线性表是指逻辑数据结构,并且该逻辑结构的实现,即物理结构,可以通过订单存储结构和线性存储结构来实现。对于顺序存储结构和线性存储结构的输入,和数据结构,您可以看到此博客:从数据结构和分类简介开始。

  线性表的顺序存储结构是指线性表的数据元素,并带有带有地址一部分的存储单元地址的一部分。

  线性表(A1,A2,......,AN)的顺序存储图如下:

  我们可以使用数组来实现线性表的订单存储结构。将第一个数据元素放在数组中0的位置。该位置称为索引,然后线性表面与阵列中的相邻位置相邻。

  阵列的长度是线性表的存储空间的长度,该数量通常在存储和分布后相同。SO所述的扩展名通常是指新数组的新数组,并复制原始元素到新数组的数组。

  线性表的长度是线性表中的数据元素数量。随着线性表插入和删除操作,此数量已更改。

  阵列存储序列表表示分配具有固定长度的数组空间。因为可以在线性表中执行插入和删除操作,因此分配阵列的阵列空间大于等于当前线性表的长度。

  内存中的每个存储单元都有其自己的编号,称为地址。由于数组的存储单元是连续的,并且每个数组元素的空间相同,我们可以在线性表中的任何位置计算地址任何时候。无论是第一个还是最后一个,同一时间是相同的时间。

  然后,对于每个线性表的位置,我们有一个相等的时间,即计算机的同一时间,即常数。因此,性能为o(1)。我们通常将其特征的存储结构称为随机访问结构。

  基于数组的线性表搜索非常快,但是如果要在任何位置添加或删除数据,它将很慢。

  可以从上述步骤中可以看出,目标位置背后的数据必须一个一个一个向前或向后移动,并且元素的数量为n。

  最好的情况是,如果将元素插入最后一个位置,或者删除了最后一个元素,则目前的时间复杂度为O(1),因为不需要移动元素。

  在最坏的情况下,如果您在数组的头部添加或删除元素,则意味着将所有元素向后移动或向前移动,因此此时间的复杂性为O(n)。

  在平均情况下,最终的运动数量和操作的中间是相等的,即(n-1)/2。

  因此,阵列的添加和删除元素的时间复杂性为o(n)。

  由于存储结构元素的相邻特征,中间必须没有自由记忆空间。因此,为了确保插入和删除时相邻元素,它将涉及大量运动元素,显然需要时间。因此,为了降低添加和删除元素的时间复杂性,我们可以考虑链存储结构。

  线性表的链存储结构的特征是使用线性表的线性仪表存储的数据元素。这组存储单元在内存空间中可能是连续的或不连续的。这意味着这些数据元素可以具有任何尚未被内存所占据的位置。

  但是,为了确保不连续的空间中的元素可以找到他们的前轮驱动器和后继。在链结构元素的组成中,除了沉积数据元素信息外,它还需要存储其后继或前驱动元件存储地址。

  我们称存储数据元素的数据信息的域名,并将存储位置的域直接作为指针域。零件称为节点。

  n节点链接到线性表,也称为链接列表。

  如果链接列表的每个节点仅包含一个指针域,则称为单个链接列表。单连接的列表是通过每个节点的指针域链接线性表中的线性数据元素。

  链接列表解决了不足的数组增加和删除元素,因为当有必要在某个位置添加和删除该元素时,只需要将相邻元素的指针修改为新添加的元素,并且有无需移动元素的位置。

  让我们介绍最简单的单连接列表。

  按照在线存储结构的顺序,我们很容易计算任何元素的存储位置。在单个链接列表中,由于数据是分散的,如果您想访问数据,则只能从首先数据并逐一访问指针(这是订单访问)。因此,获取I-元素的数据操作对于实现数据以获取i-元素是相对麻烦的。

  获取链接列表的III索引数据的算法:

  坦率地说,只需从头开始直到i+1节点。我们将链接列表中的数据量记录为n,因为该算法的时间复杂性取决于i的位置。当i = 0时,您不需要穿越。第一个被取出。它只能在n-1次时遍历。因此,最坏的情况是o(n)。也称为搜索(线性搜索)。

  分析上述单连接列表插入和删除算法。我们发现它们实际上是由两个部分组成的:第一部分是穿越I索引节点;第二部分是插入和删除节点。

  我们将链接列表中的数据量记录为n,插入和删除数据只需要更改两个指针的方向,因此与N的时间无关。如果您已经达到添加数据的位置,则您只需要花费O(1)。删除数据只需要时间o(1)。

  尽管需要早期搜索时间,但我们假设您需要在索引i中插入10个元素,那么这意味着订单存储结构意味着每个插入都需要移动n-i-1 node.n)。列表,我们此时只需要找到第一个位置的指针。目前,是o(n)。接下来,只需将指针从分配中移动。

  2.2.3.1测试一些高级别的语言,例如C,带有指针,Java和C#具有对象引用间接实现指针,因此他们可以使用指针或对象引用。语言,因为没有指针/对象参考,链接的列表结构无法根据我们的方法实现。

  您可以使用对象数组而不是指针来实现链存储结构。我们说,链存储结构的特征是存储位置可以与数据相邻,并且可以描述数据之间的逻辑关系。实现具有阵列的链条存储结构的目的。

  数组中的对象是链接列表中的节点。该节点包含两个部分:数据域和指针域。数据域存储在对象中,并且此“指针域”实际上存储了下一个节点位于位置的数组元素的标签索引。非常聪明。

  为了实现单个链列表和发布节点的应用,可以将该数字分为两个部分,一个用于存储数据,另一部分用作备用空闲链接列表。这是一个“逻辑链接列表”。备用链接列表,即连接每个空闲位置的链接列表。存储数据后,将其从空闲列表的第一个自由位置存储;删除数据后,将删除指定索引处的数据。此后,您只需要修改“指针” - 标签索引,无需移动其他元素即可。

  为了保留“数据链接列表”和“空闲链接列表”的“头指针” - 启动索引,我们需要两个其他变量来存储。

  2.3.2.1测试我们还可以使用单个链接列表背面的指针,并让其指向链接列表的数据,将链接列表变成戒指。这是“圆形链接列表”,也是被称为“圆形链接列表”。没有循环链接列表的头部和尾巴的概念。当您要保存固定的最新数据时,通常使用此链接列表。

  循环链接列表可以解决一个非常麻烦的问题:如何从一个节点开始并访问链接列表的所有节点。

  循环链接列表和单个链接列表之间的主要区别在于周期的判断条件。单个链接列表判断周期结束了:node-> next == null;并且周期链接的列表判断周期结束:(节点 - >下一步)等于头节点。实际上,圆形链接列表中没有头节点。这里的头节点仅是人工,等效于标记。当头部节点开始遍历时,如果返回到“头节点”,则如果遍历的循环列表的循环链接列表,则是遍历的。

  为了使周期列表更加方便,我们可以将指针指向“尾部节点”而不是“ head节点”。

  可以在O(1),链接列表的头部和尾部节点中访问。

  循环链接列表实际上相对简单,并且没有再次给出实施案例。

  在单个链接列表中,使用下一个指针,这使我们找到下一点的时间复杂性是o(1)。每次都必须从头开始搜索。

  为了克服一条路的缺点,我们可以将一个节点拥有的指针设置为两个,并让它们将它们指向前驱动节点和节点的后续节点。这是“两道链接列表”。使用此链接列表不仅可以返回和返回,而且还可以从背后进行遍历数据,这非常方便。

  但是,在两条路链接列表中有两个缺点:一个是,指针数量的增加将导致存储空间需求的增加;另一个是,在添加和删除数据时,您需要更改更多指针的方向。

  我们的Java中的LinkedList集合是一个两条链接列表,因此不是再次获得两条链接列表。此结构也相对简单。查看LinkedList的源代码,以了解如何快速实现它。

  一个 - 道路周期列表用于解决约瑟夫环的问题。两个 - 道路链接列表也可以具有圆形链接列表的变体,但很少使用:头节点的前一个指针指向尾部节点,尾部节点的下一个指针指向头节点。

  这次,它主要解释了线性表的订单存储结构和链存储结构的基本原理,并且都具有相应的情况,例如使用数组来实现线性表,单个链接列表和静态链接列表。由于采用了linkedlist,因此采用了linkedlist,实现了两条路链接列表,因此未给出两道链接列表的实现。可以看到线性表是非常简单的数据结构。此外,本文尚未解释特殊的线性表,例如堆栈和队列,而是下一个解释。

  作者:Liu Java