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, защото не проверих дали вече съм преминал през „възел“. Тогава реших, че трябва да имам друга структура от данни (като hashmap за обработка на ключ/стойност), за да обработвам временен списък за сравнение.
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