【问题标题】:Where is the need for the positional list ADT?位置列表ADT在哪里需要?
【发布时间】:2020-07-21 08:57:08
【问题描述】:

在哪里可以使用(双向链表)位置列表ADT?当开发人员想要O(n) 内存和O(1)(非摊销行为)到列表中的任意位置时?我想看一个使用位置列表的例子。与使用基于数组的序列相比,使用位置列表有什么优势?

【问题讨论】:

    标签: data-structures linked-list abstract doubly-linked-list abstract-data-type


    【解决方案1】:

    如果您的程序经常需要在数据集合中添加新元素或从数据集合中删除元素,那么列表可能是比数组更好的选择。

    删除数组位置N处的元素需要对元素N之后的所有元素进行复制操作。原则上:

    Arr[N] = Arr[N+1]
    Arr[N+1] = Arr[N+2]
    ...
    

    插入新元素时需要类似的副本,即为新元素腾出空间。

    如果您的程序经常添加/删除元素,那么许多复制操作可能会影响性能。

    作为这些操作的一部分,现有元素的位置会发生变化,即在位置 50 删除/添加元素后,位置 1000 的元素将位于位置 999 或 1001。

    如果您的程序的某些部分已搜索特定元素并保存了其位置(例如位置 1000),则可能会出现问题。元素删除/添加操作后,保存的位置不再有效。

    (双向)列表“解决”了所描述的 3 个问题。使用列表,您可以添加/删除元素,而无需将现有元素复制到新位置。因此,特定元素的位置(例如指向元素的指针)在添加/删除操作后仍然有效。

    总结一下:如果您的程序(经常)添加或删除随机定位的元素,并且如果您的程序要求位置信息不受添加/删除操作的影响,那么列表可能比数组更好。

    【讨论】:

      【解决方案2】:

      职位列表

      • 因此,在使用数组时,索引非常适合定位插入和删除的位置。然而,索引对于链接结构(如链表)来说并不是很好,主要是因为即使我们有索引。我们仍然必须遍历喜欢的结构中的所有先前节点。这意味着链表中基于索引的删除或插入将运行O(N) time(no bueno)。一般的经验法则是,对于数据结构操作,我们希望它们运行O(1)O(log n)。此外,索引不擅长描述相对于其他节点的位置。

      职位允许我们做什么?

      • 位置允许我们在我们喜欢的结构中的任意位置实现恒定时间的插入和删除(很酷,对吗??)。
      • 它们还允许我们描述相对于其他元素的元素。
      • 基本上,位置为我们提供了对内存地址的引用,然后我们可以将其用于恒定时间的插入和删除。您的教科书图像没有显示验证方法,但是,我会假设实现会显示。所以请注意,您将需要一个实用方法 validate 来验证该位置是否在链接结构中。

      职位是什么样的?

      • 实际上,Position 是 ADT(抽象数据类型),在 Java 中,我们使用接口形式化 ADT,如下所示:
      public interface Position <E>{
      
          E getElement()throws IllegalStateException;
      }
      
      • 位置只是在链接结构内的节点上实现的抽象。为什么要这样做?嗯,它为我们的代码提供了更大的灵活性和更好的抽象性。
      • 所以要为链表节点实现一个位置,它看起来像这样:
      
      private static class Node<E> implements Position<E> {
      // ALL THE OTHER METHODS WOULD BE HERE
      }
      
      
      • Node 类是私有的和静态的,因为它被假定嵌套在链表类中。然后最终我们在处理位置链接列表中的所有其他方法时使用这个位置作为数据类型。

      现实世界的例子

      • 您可以使用此方法为解析器创建parse tree。你可以有一个二叉树,它实现并使用 Position 接口的所有方法,然后使用树进行解析

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多