2015-03-22 4 views
1
TreeNode root = new TreeNode(5); 
    ArrayList<TreeNode> arr = new ArrayList<TreeNode>(); 
    for(int i = 0; i < n; i++){ 
     arr.add(root); 
    } 

В приведенном выше коде, один TreeNode объект добавляется в ArrayList<TreeNode> arr для n раз. Я думаю, что arr должен иметь пространственную сложность O(1), потому что он сохраняет ссылки на отдельный блок памяти в куче. Я обсуждаю это с моими друзьями, и у них есть другое мнение, что это может иметь сложности O(n). Ребята, что вы думаете?ArrayList содержит ссылки на TreeNodes, какова пространственная сложность?

+0

Ответ будет зависеть от того, что такое n. – Eran

+0

Вы можете уточнить свой ответ. – Hulk

ответ

0

Вы сохраняете ссылки, но они все еще являются n ссылками. Я думаю, что вы действительно ищете накладные расходы памяти для хранения n объектов в ArrayList. В используемой памяти, вероятно, будут доминировать фактические объекты, но есть еще массив с поддержкой длины n, который ArrayList держит ссылки.

+0

Что делать, если мой объект TreeNode имеет очень большую память (скажем, 500 КБ), выделенную для него, и каждая ссылка (здесь структура данных объекта) не будет иметь места где-то около 500 КБ, поэтому в этих ситуациях я должен сказать, что сложность пространства будет равна O (1)? Потому что память ссылок очень меньше по сравнению с памятью реального объекта. – Hulk

+0

По сравнению с фактической памятью, используемой объектами, память, используемая ссылками, слишком мала, чтобы принимать во внимание. Но вам придется рассматривать это как O (n), потому что в конце дня он все еще является массивом, и если n достаточно велико, он будет учитываться. Подумайте об объекте, помещенном в список примерно в 10 тысяч раз. Существует только 1 объект и 10k ссылок. Вы видите это сейчас? O (n) есть, и в этот момент ссылки, вероятно, будут использовать больше памяти, чем фактический объект. Примечание: 10k - произвольное число. –

1

ArrayList все еще должен хранить ссылку n раз, делая ее O (n).

ArrayList опирается на Object[], если вы посмотрите на исходный код

public boolean add(E e) { 
    ensureCapacity(size + 1); // Increments modCount!! 
    elementData[size++] = e; 
    return true; 
} 

Всякий раз, когда элемент добавляется он добавляется в массив поддержка объектов.

 Смежные вопросы

  • Нет связанных вопросов^_^