【问题标题】:LinkedList without dynamic memory allocationLinkedList 没有动态内存分配
【发布时间】:2015-11-18 08:16:29
【问题描述】:

假设我们正在使用没有动态内存的开发环境(只有具有固定边界的静态数组)。如何实现 List(或 ArrayList)。 好吧,我想在尝试将元素添加到完整数组时创建更大尺寸的新数组,但我希望有更有效的方法。 P.S 我不是在要求实施,我是在寻求想法:)

【问题讨论】:

  • 一个常见的技巧是在列表已满时重新创建列表。不只是一个元素,而是很多,预期尺寸增长。这样,如果达到上限,您只会对性能产生很小的影响。 ...哦等等...这就是你的建议:-)
  • 另一种方法是为所有可能的类型创建一个容器,并为该容器(或一对)创建尽可能大的列表。然后,您将能够从该大数组创建子列表,并在该容器中定义类型。有点像旧的 VARIANT (msdn.microsoft.com/en-us/library/windows/desktop/…) 容器。它会让你的速度超过内存,但通常这是不值得的。

标签: arrays algorithm data-structures static


【解决方案1】:

您可以查看 Sedgewick 的有关动态数组的文档并调整它们的大小。您可以在Dynamic Array - Wikipedia 中查看一般概念,在this paper which is written by Sedgewick 中查看更详细的定义 ResizingArrayQueue by Sedgewick也有一个样本

尽管该示例用于队列,但您也可以将此机制用于链表。 在这个样本中,当它达到限制时,他的尺寸会增加一倍。

public void enqueue(Item item) {
        // double size of array if necessary and recopy to front of array
        if (N == q.length) resize(2*q.length);   // double size of array if necessary
        q[last++] = item;                        // add item
        if (last == q.length) last = 0;          // wrap-around
        N++;
    }

当限制减少到数组的四分之一时,他将数组减半。

 public Item dequeue() {
        if (isEmpty()) throw new NoSuchElementException("Queue underflow");
        Item item = q[first];
        q[first] = null;                            // to avoid loitering
        N--;
        first++;
        if (first == q.length) first = 0;           // wrap-around
        // shrink size of array if necessary
        if (N > 0 && N == q.length/4) resize(q.length/2); 
        return item;
    }

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2021-02-15
    • 2013-07-01
    相关资源
    最近更新 更多