【问题标题】:Data structure for fast retrieval of middle element用于快速检索中间元素的数据结构
【发布时间】:2019-03-04 10:10:59
【问题描述】:

我需要解决一个可以左右插入的问题。然后从数组中间的数据中提取出来。

我已经尝试使用链表来解决这个问题。然而,这种方法太慢而无法被接受为解决方案。

如果我需要在列表的开头和结尾快速插入以及快速检索中间元素,你会建议我使用什么数据结构?

这是我已经尝试过的代码:

private static void middleQueue(int loopLength, String[] commandsArray) {

    LinkedList<String> linkedList = new LinkedList<>();

    int counterSize = 0;

    for (int i = 0; i < commandsArray.length; i++) {
        if(commandsArray[i].equals("R")){
            linkedList.add(commandsArray[i+1]);
            i++;
            counterSize++;
        }
        else if(commandsArray[i].equals("L")){
            linkedList.addFirst(commandsArray[i+1]);
            i++;
            counterSize++;
        }
        else if(commandsArray[i].equals("E")){
            if((linkedList.size() & 1) == 0)
                System.out.println(linkedList.remove((counterSize / 2)-1));
            else
                System.out.println(linkedList.remove((counterSize / 2)));

            counterSize--;
        }
    }
}

【问题讨论】:

  • 你可以保留3个指针(第一个、中间和最后一个元素)和列表的长度。
  • 什么是“中间元素”?恰好位于当前列表中间的元素,还是原始结构开始的元素?如果您的列表是0,并且您在右侧添加1, 2, 3,在左侧添加-1,即有-1, 0, 1, 2, 3,那么01 会成为您的中间元素吗?
  • 中间指针的记账非常简单:每次在列表的开头(rest.end)发生2个连续插入时,将中间指针设置为其前任(resp.successor)
  • 根据您的需要,您可能只使用两个链表,或者可能是一个自平衡二叉树(根是中间元素)。
  • @tobias_k 如果列表长度相等,则中间元素的索引大小为/2-1,否则为索引大小/2

标签: algorithm data-structures


【解决方案1】:

先取3个指针,中间,最后一个指针。 那么有2种情况:

  1. 如果您从第一个添加 安。您需要将中间指针移到左侧,然后移到当前位置。

  2. 如果您从最后添加 安。您只需将中间指针增加到其下一个。

【讨论】:

  • 我认为这个想法很清楚,但是您如何在 Java 中实现它呢?您是否可以访问并保存对 LinkedList 的内部节点的引用,或者您是否会构建一个自定义数据结构,其中包含两个用于两端的链表或类似的?
  • 是的,您需要创建一个自定义 LinkedList。使用 Node 类和 LinkedList 类以及插入方法等,您将在其中维护头、最后和中间指针。
【解决方案2】:

正如其他人所指出的,您需要一个具有 3 个指针的数据结构。

doubly linked list 会很好。但是,如果您将使用singly list list(仅在一个方向上使用指针),那么您将只能向右或向左移动(不能同时移动两者)。 SLL 不会达到目的。

看到这个实现一个非常相似的问题:https://www.geeksforgeeks.org/design-a-stack-with-find-middle-operation/

【讨论】:

    【解决方案3】:

    在Java 中,您应该使用两个ArrayDeques,一个用于列表的前半部分,一个用于后半部分。将元素从一个移到另一个以保持它们的大小相同,因此您始终可以访问中间。

    这将比使用LinkedList 更快、更节省内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      相关资源
      最近更新 更多