Class Diagnostic {
//Get the size in bytes of an object
static long sizeOf(Object object);
//Get the references for an object (leafs)
static List<Object> getRefs(Object object);
//Implement this with those above
public Long objectSize(Object object);
}
Как бы вы реализовали objectSize для возврата размера объекта в байтах?
Метод objectSize возвращает размер в байтах всех объединенных дочерних узлов (каждого узла в дереве).
Пример:
Object A (19 bytes)
/ \
/ \
B(20) C(37)
/
/
C(15)
Ответ: 19+20+37+15 = 91
У меня был этот вопрос во время интервью, и мне очень любопытно увидеть ответы других. Так как я мало знал об алгоритме обхода дерева.
Я придумал это... (знаю, плохо это или нет ;), просто пытаюсь научиться)
public Long objectSize(Object object) {
List<Object> objectList = new ArrayList<Object>();
Long sum = sizeOf(object);
objectList = getRefs(object);
for(Object object : objectList){
sum += objectSize(object);
}
return sum;
}
Я заметил, что у меня может быть цикл и ошибка stackoverflow, потому что я не проверял, прошел ли я уже через "узел". Затем я решил, что у меня должна быть другая структура данных (например, хэш-карта для обработки ключей/значений) для обработки временного списка для сравнения.
objectSize(Object object);
возвращать размер самого себя и всех дочерних узлов вместе взятых? - person BLuFeNiX   schedule 15.05.2013sum += objectSize(object);
в этом цикле. - person G. Bach   schedule 15.05.201319 + 20 + 37 + 15 = 91
, я прав? - person Rerito   schedule 15.05.2013sum
как переменную экземпляра или переменную класса. Если это так, вам нужно помнить, что всегда нужно сбрасыватьsum
на0
перед вызовом методаobjectSize
. В остальном алгоритм работает нормально. Тот факт, чтоsum
является переменной экземпляра/класса, кажется немного странным... - person Alderath   schedule 15.05.2013sum += objectSize(object);
в цикл, то результат для примера будет: 19 + 20 + 15 + 54 + 108 + 37 + 253 (т.е. 506). В его цикле переменнаяsum
является переменной экземпляра/класса, которая увеличивается при каждом посещении узла. - person Alderath   schedule 15.05.2013sum
локальной переменной. т.е.sum += sizeOf(object)
(переменная экземпляра/класса) заменена наLong sum = sizeOf(object)
(локальная переменная). Если бы он сохранилsum
в качестве переменной класса, переменнаяsum
удваивалась бы при каждом вызовеsum += objectSize(object);
. - person Alderath   schedule 15.05.2013