2015-11-18 36 views
1

让我们假设我们正在使用没有动态内存的开发环境(只有固定边界的静态数组)。如何实现List(或ArrayList)。 那么,我想创建一个更大的新阵列,当我试图添加元素到一个完整的数组,但我希望有更有效的方法。 P.S我没有要求执行,我想要的想法:)LinkedList没有动态内存分配

+3

一个常见的技巧是重新创建列表,如果它已满。不是只有一个元素,但很多,预计的规模增长。以这种方式,如果达到上限,你将只有很小的性能影响。 ...哦等等...这就是你建议的:-) – Stefan

+1

另一种方法是为所有可能的类型创建一个容器,并为该容器(或一对)创建最大可能的列表。然后,您将能够从该大数组中创建子列表,并且该类型在该容器中定义。有点像旧的'VARIANT'(https://msdn.microsoft.com/en-us/library/windows/desktop/ms221627%28v=vs.85%29.aspx)容器。它会给你速度超过记忆,但通常这是不值得的。 – Stefan

回答

2

您可以检查Sedgewick的关于动态数组的文档并调整它们的大小。你可以看到在Dynamic Array - Wikipedia和总体思路更详细的定义this paper which is written by Sedgewick 还存在ResizingArrayQueue by Sedgewick

样本虽然示例中使用你可以使用这种机制也为linkedlists队列。 在这个示例中,当它达到极限时,他将其大小加倍。

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; 
    }