Полные рассуждения таковы:
Пусть n
будет длиной массива.
1) Есть три вложенных цикла.
2) Самый внутренний цикл выполняет ровно j-i
итераций (k
, начиная с i+1
до j
включительно). Нет преждевременного выхода из этого цикла.
3) Средний цикл выполняет ровно n-j
итераций (j
от i
до n-1
включительно), каждая из которых включает j-i
самых внутренних итераций, всего (i-i)+(i+1-i)+(i+2-i)+... (n-1-i) = 0+1+2... + (n-1-i)
. Нет преждевременного выхода из этого цикла.
4) Самый внешний цикл выполняет ровно n
итераций (i
работает от 0
до n-1
включительно), каждая из которых включает 0+1+2+ ... (n-1-i)
внутренних итераций. Всего (0+1+2... n-1) + (0+1+2+... n-2) + (0+1+2+... n-3) + ... (0)
. Нет преждевременного выхода из этого цикла.
Теперь, как справиться с этим беспорядком? Вам нужно немного узнать о формуле Фолхабера ( http://en.wikipedia.org/wiki/Faulhaber%27s_formula ). В двух словах, он говорит, что сумма целых чисел до n
равна O(n^2)
; и сумма суммы целых чисел до n
равна O(n^3)
и т. д.
Если вы помните из исчисления, примитив X
является X^2/2
; и примитивом X^2
является X^3/3
. Каждый раз, когда степень увеличивается. Это не случайно.
Ваш код работает в O(n^3)
.
Попытка:
См. Демонстрацию: http://jsbin.com/oxeki
Код:
var prettyPrint = (function(){
var htmlObj = function(obj){
if (Object.prototype.toString.call(obj) === '[object RegExp]') {
return obj.toSource ? obj.toSource() : '/' + obj.source + '/';
}
if (typeof obj === 'object') {
return prettyPrint(obj);
}
if (typeof obj === 'function') {
return document.createTextNode('function(){...}');
}
return obj.toString();
},
row = function(cells, type){
type = type || 'td';
var r = document.createElement('tr');
for (var i = 0, l = cells.length; i < l; i++) {
var td = document.createElement(type);
td.appendChild(typeof cells[i] === 'string' ? document.createTextNode(cells[i]) : cells[i]);
r.appendChild(td);
}
return r;
},
heading = function() {
var thead = document.createElement('thead');
thead.appendChild(row(['Name','Value'], 'th'));
return thead;
};
return function(obj) {
var tbl = document.createElement('table'),
tbody = document.createElement('tbody');
for (var i in obj) {
var objCellContent = obj[i] === obj ? document.createTextNode('CIRCULAR REFERENCE') : htmlObj(obj[i]);
tbody.appendChild( row([document.createTextNode(i), objCellContent]) );
}
tbl.appendChild(heading());
tbl.appendChild(tbody);
return tbl;
};
})();
Я не встречал такого отладчика, хотя не похоже, что этот конкретный стиль было бы слишком сложно написать самостоятельно. Просто базовая рекурсивная функция, передающая текущий объект и ячейку таблицы, чтобы тоже начать писать, а затем просто строить по ходу.
Что касается комментария с круговой ссылкой выше, его можно легко обойти, сохранив массив объектов, которые вы уже обработаны. Перед обработкой объекта проверьте, есть ли он уже в списке. если это так, обозначьте это в поле значения вашего вывода как что-то вроде «круговой ссылки на» ... однако вы хотите обозначить объект вверх по иерархии.
prettyprint(object, processedObjects)
{
if (processedObjects.contains(object))
return 'circular refernece';
processedObjects.push(object);
create newTable;
for (var in object)
{
row = newTable.addRow();
row.cell1.value = var;
if (typeof object[var] is object)
row.cell2.value = prettyprint(object[var], processedObjects);
else if (typeof object[var] is function)
row.cell2.value = '[function]';
else
row.cell2.value = object[var].toString();
}
return newTable;
}
Я думаю, что вы ищете это, http://www.netgrow.com.au/files/javascript_dump.cfm это javascript-эквивалент дампа coldfusion. тег
I just saw this today, maybe this is what you're looking for?