cyber, чувак, сделай фикс уже search.indexOf(this[i], i);
|
Цитата:
|
Maxmaxmaximus4, ну тогда в общем replace не нужен:)
|
Цитата:
как ты вообще этот алгоритм придумал????????????????????????? сколько времени заняло? делал ли что-то подобное до этого? не ну, то есть , алгоритм то конечно тупой и брутальный, но РАБОТАЕТ ЖЕ) |
Maxmaxmaximus4, когда курсовую писал, нужно было сравнить 2 массива с изображениями что бы не перезагружать все, а разбираться с готовыми алгоритмами было влом поэтому сделал "в лоб".
|
cyber, не ну, то есть , алгоритм то конечно тупой и брутальный, но РАБОТАЕТ ЖЕ) спасибо огромное
|
Ихих ребят вы чо, сравнение массивов по 2000 элементов из за парочки изменений это тоже не круто.
Цитата:
|
Цитата:
а что если человек через цикл for массив изменял? а что если концатенацией делал? вот и я про то) |
var oldArray = [1, 2, 3, 4, 5];
var newArray = [11, 3, 4, 3, 11, 21];
var changes = compare(oldArray, newArray);
console.log(changes);
// превратим старый аррей в новый используя полученные данные
// удаляем (в обратном порядке чтобы индексы не смещались)
for (var i = changes.remove.length - 1; i >= 0; i--) {
var index = changes.remove[i];
oldArray.splice(index, 1);
}
// добавляем
for (var i = 0; i < changes.insert.length; i++) {
var index = changes.insert[i];
oldArray.splice(index, 0, newArray[index])
}
// изменяем
for (var i = 0; i < changes.replace.length; i++) {
var index = changes.replace[i];
oldArray[index] = newArray[index];
}
// отобразим результат, старый и новый массивы теперь равны
console.log(newArray);
console.log(oldArray);
// наща мега функция
function compare(oArr, arr) {
var search = arr.slice();
var changes = {
insert : [],
remove : [],
replace: []
}
for (var i = 0, index; i < oArr.length; i++) {
index = search.indexOf(oArr[i], i);
if (index < 0) changes.remove.push(i);
else delete search[index];
}
for (var i = 0; i < search.length; i++) if (i in search) {
var index = changes.remove.indexOf(i);
if (index < 0) changes.insert.push(i);
else {
changes.remove.splice(index, 1);
changes.replace.push(i)
}
}
return changes
}
|
Цитата:
|
ахаха суууука, оно не схавало ((
var oldArray = [1, 2, 3, 4, 5]; var newArray = [5, 4, 3, 2, 1]; массивы после преобразования не равны и проблема именно не в преобразовании а в данных которые возвращает функция. ![]() Цитата:
а что если он сделал так arr[1000000] = 100; |
Maxmaxmaximus4, конечно не схавало, потому что ты изменил так что учитывается порядок и мне кажется оптимальнее менять на основе replace
|
cyber, слушай все мои изменения это то что я добавил i в indexOf()
когда я убираю результат тот же, когда я использую твою функцию результат тот же) Цитата:
в принципе есть идейка небольшая как replace так прокачать чтобы вначале он все свои дела делал, чтобы все что можно заменить им, заменялось им. |
Maxmaxmaximus4,
какие данные у тебя в массиве лежат ? дом объекты ? |
Цитата:
<script src='//mychamber.ru/build/ui.js'></script>
<div controller="Ctrl">
Привет {name}, тебе {age} лет!
</div>
<script>
function Ctrl() {
name = 'Ашот'
age = 15
}
</script>
А тут короче надо будет сделать чтобы элемент повторялся столько раз сколько элементов в массиве, и значения элементов массива засовывались в переменную которую мы придумаем, например val
<div controller="Ctrl">
<div repeat="val in arr">{val}</div>
</div>
<script>
function Ctrl() {
arr = [1, 2, 3, 4]
}
</script>
и вот этот вот див внутренний повторится столько раз, сколько ячеек в массиве, и в каждом {val} будет иметь разное значение, суть в том чтобы при изменении массива элементы отражали его состояние. можно удалять каждый раз все созданные элементы и создавать новые и перерисовывать, но я хочу отражать только изменения, а для этого надо их отслеживать. все просто =) |
cyber, блин, и если честно я вообще не понимаю как твой алгоритм работает, ну то есть понимать то понимаю, но не понимаю почему то должно работать и как "учитывать порядок"
|
Цитата:
Чото дикую хреновину максимус ты придумал :) Но в целом любопытно. Хотя поиск оптимального решения будет вероятно медленнее чем работа с dom. Вероятно нужно работать не с одним числом а с группами чисел (группы гораздо больше свидетельствуют о структуре чем отдельные числа). Так как последовательности чисел и групп можно объяснить по разному то мы получим дерево вариантов в котором нам придется искать кратчайший путь. |
С другой стороны Я не уверен что разные объяснения как либо отражаются на структуре. Ну к примеру две последовательности 567 и 567567 можно объяснить как добавлением 567 слева так и добавлением 567 справа, это равнозначные варианты и выбрать можно любой.
окей если так посмотреть 33 2 567 33 4 567 3 567 здесь нам все равно было ли во втором случае 567 добавлено в конец или в середину а вот здесь не все равно. 33 2 567 89 2 90 33 4 89 3 90 567 Вродебы 567 встречается и во втором случае. Но у нас так же встречаются и 89 x 90. если было добавлено 567 в конец то это три изменения а если 89 90 в середину это аж четыре. Вероятно 567 это добавленый элемент а не сохранившийся, так как добавление 567 потребует меньше трансформаций чем его сохранение. Ведь за сохранение трех чисел 567 мы вынуждены заплатить добавление аж 4х (89 x 90). а вот ситуация по интереснее. В отличии от предыдущего примеру выбирать нужно между множеством обьяснений 1) 33 567 890 2 90 60 33 90 3 890 567 2 890 60 совпали 567 890 (6 совпадений) 2) 33 567 890 2 90 60 33 90 3 890 567 2 890 60 совпали 90 2 90 (5 совпадений) 3) 33 567 890 2 90 60 33 90 3 890 567 2 890 60 совпали 890 2 90 (6 совпадений) 4) 33 567 890 2 90 60 33 90 3 890 567 2 890 60 совпали 90 90 (4 совпадения) 5) ..... еще какие то Гипотезы 1 и 3 требуют наименьшего числа изменений или можно сказать имеют наибольшее число совпадений между двумя массивами. Блядь, здесь как раз алгоритм Вагнера Фишера или алгоритм Хиршберга справляется :( http://habrahabr.ru/post/117063/ P.S. 33 60 игнорирую чтобы не отвлекали, а так конечно они тоже участвуют 567 это не пятьсот шисят семь, а 5,6,7. Все числа от 0 до 9 |
Цитата:
|
Цитата:
Цитата:
ntive-controller="true" заменится просто на controller='true', а controller="Ctrl" просто исчезнет из разметки. ну можно не native-, а nt-, не суть. Просто всегда бесило то что по какой-то неведомой причине люди тучу префиксов городят, по этому и начал писать свою либу, это одна из причин. Это куда логичнее чем каждый раз городить тучу префиксов и захламлять код. |
Цитата:
Проверять все это в падлу и так отвлекся. З.Ы. Стоимость это то что вы потратили, ценность это то что вы получили. |
Цитата:
|
А почему бы не использовать бинарный поиск вместо indexOf, он же быстрее на сколько я вижу http://jsperf.com/binarysearch-vs-indexof/4
var BinarySearchBitshift = function (list, val) {
var min = 0
, max = list.length-1
;
for(;;)
{
// fall back to linear search, 11 seems to be a good threshold, but this depends on the uses comparator!! (here: ===)
if ( min + 11 > max ) {
for(var i=min ; i<=max; i++ ) {
if( val === list[i] ) {
return i;
}
}
return -1;
}
var mid = (min + max) >> 1;
var dat = list[ mid ];
if ( val === dat ) {
return mid;
}
if( val > dat ) {
min = mid + 1;
} else {
max = mid - 1;
}
}
};
|
:write:
function compare(f, d) {
var e = {
relocation: [],
insert: [],
length: d.length
}, c = d + ", " + f ,
b = f.slice();
if (c = c.match(/([^,]\S*[^,])(?=,[\s\S]*\s[\s\S]*\1)/g)) {
c.reverse();
for (var a = 0; a < c.length; a++) {
var g = ("" + b).slice(0, ("" + b).lastIndexOf(c[a]) + 1).split(",").length - 1,
h = c[a].split(",").length,
k = b.splice(g, h);
e.relocation.push([g, h]);
b = k.concat(b)
}
}
for (a = 0; a < d.length; a++) d[a] != b[a] && (b.splice(a, 0, d[a]), e.insert.push([a, d[a]]));
return e
};
function conversion(b, c) {
for (var a = 0; a < c.relocation.length; a++) {
var d = c.relocation[a];
b = b.splice(d[0], d[1]).concat(b)
}
for (a = 0; a < c.insert.length; a++) d = c.insert[a], b.splice(d[0], 0, d[1]);
b.length = c.length;
return b
};
var oldArray = [1, 2, 3, 4, 5];
var newArray = [11, 3, 4, 3, 11, 21];
var changes = compare(oldArray, newArray);
var len = changes.relocation.length + changes.insert.length + 1;//кол-во затраченных операций в conversion
alert(newArray +"\n"+conversion(oldArray, changes)+"\n"+len)
var oldArray = [4, 50, 6, 7, 8, 9,1, 2, 3, 50 ];
var newArray = [1, 2, 4, 50, 6, 7, 8, 9,50];
var changes = compare(oldArray, newArray);
var len = changes.relocation.length + changes.insert.length + 1;
alert(newArray +"\n"+conversion(oldArray, changes)+"\n"+len)
var oldArray = [1, 2, 3, 4, 5];
var newArray = [5, 4, 3, 2, 1];
var changes = compare(oldArray, newArray);
var len = changes.relocation.length + changes.insert.length + 1;
alert(newArray +"\n"+conversion(oldArray, changes)+"\n"+len);
var oldArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var newArray = [1, 2, 3, 5, 34, 32, 4, 45];
var changes = compare(oldArray, newArray);
var len = changes.relocation.length + changes.insert.length + 1;
alert(newArray +"\n"+conversion(oldArray, changes)+"\n"+len);
var oldArray = [1, 2, 3, 4, 5];
var newArray = [1, 2, 3, 5, 4, 45];
var changes = compare(oldArray, newArray);
var len = changes.relocation.length + changes.insert.length + 1;
alert(newArray +"\n"+conversion(oldArray, changes)+"\n"+len);
|
Цитата:
|
рони, скорость выполнения ужасная)
http://jsperf.com/compare-arrays-test |
cyber,
сравнение количества операций для преобразования и длины нового массива ...
function rand()
{ var l = Math.round(Math.random() * 100), a = [];
for (var i=0; i<l; i++) {a[i]=Math.round(Math.random() * 100)}
return a
}
function compare_indexOf(fArr,arr) {
var search = arr.slice(),
insert = [],
remove = [],
replace = [];
for(var i = 0, index; i < fArr.length; i++) {
index = search.indexOf(fArr[i]);
if(!~index) {
remove.push(i);
continue;
}
i != index && replace.push({'old': i, 'new': index});
delete search[index];
};
search.forEach(function (elem, i) {
if(elem)
insert.push(i);
});
return {
'remove': remove,
'insert': insert,
'replace': replace
}
}
function compare(f, d) {
var e = {
relocation: [],
insert: [],
length: d.length
}, c = d + ", " + f ,
b = f.slice();
if (c = c.match(/([^,]\S*[^,])(?=,[\s\S]*\s[\s\S]*\1)/g)) {
c.reverse();
for (var a = 0; a < c.length; a++) {
var g = ("" + b).slice(0, ("" + b).lastIndexOf(c[a]) + 1).split(",").length - 1,
h = c[a].split(",").length,
k = b.splice(g, h);
e.relocation.push([g, h]);
b = k.concat(b)
}
}
for (a = 0; a < d.length; a++) d[a] != b[a] && (b.splice(a, 0, d[a]), e.insert.push([a, d[a]]));
return e
};
var oldArray = rand();
var newArray = rand();
var time_indexOf = new Date();
var changes = compare_indexOf(oldArray, newArray);
time_indexOf = (new Date()).getTime() - time_indexOf.getTime()
var len_indexOf = changes.remove.length + changes.insert.length + changes.replace.length;
var time = new Date();
var changes = compare(oldArray, newArray);
time = (new Date()).getTime() - time.getTime()
var len = changes.relocation.length + changes.insert.length + 1;
alert('len_indexOf : ' + len_indexOf + ' time: ' + time_indexOf + '\nlen: ' + len + ' time: ' + time + '\nlength : ' + newArray.length);
|
рони, а почему у тебя нет массива с элементами которые нужно удалить?
П.с я не пытаюсь доказать что моя функция сравнения лучше, если честно мне всеравно, я оба варианта считаю слишком медленными и остойными) |
Цитата:
всё лишнее обрезается строкой Цитата:
|
рони, т.е нечего?
Если элемента нет во втором массиве, но есть в первом то его нужно удалить. |
сделайте кто нибудь чтобы оно порядок учитывало а то я мозг сломал)
cyber, чувак, выручай) ты придумал эту кашу, придумай как сделать чтобы она учитывала порядок и 12345 корректно превращалось в 54321, пожааалуйста ну пожаалуйста)! |
Цитата:
|
Цитата:
|
Maxmaxmaximus4, ок, как только закончу с курсовой , посмотрю что можно придумать)
|
:write:
var changes = {
insert : [[0, 5], [1, 4], [2, 3], [3, 2]],
length : 5,
relocation : []
}
function conversion(b, c) {
for (var a = 0; a < c.relocation.length; a++) {
var d = c.relocation[a];
b = b.splice(d[0], d[1]).concat(b)
}
for (a = 0; a < c.insert.length; a++) d = c.insert[a], b.splice(d[0], 0, d[1]);
b.length = c.length;
return b
};
alert( conversion([1, 2, 3, 4, 5],changes));
alert( conversion([1, 2, 3, 4, 5, 6, 7, 8, 20, 30],changes))
|
Рони
Я подставил значения var oldArray = [3,3,5,6,7,8,9,0,2,9,0,6,0]; var newArray = [3,3,9,0,3,8,9,0,5,6,7,2,8,9,0,6,0]; У тебя 12 операций уходит, хотя достаточно девяти. |
DjDiablo,
да скрипт не ставит найденные одинаковые цепочки сразу на свои места -- цепочки "доползают" до своего места по мере вставки недостающих элементов. |
Цитата:
http://learn.javascript.ru/play/feUHP |
DjDiablo,
3,3,5,6,7,8,9,0,2,9,0,6,0<br> 6,0,3,3,5,6,7,8,9,0,2,9,0<br> 8,9,0,6,0,3,3,5,6,7,2,9,0<br> 5,6,7,8,9,0,6,0,3,3,2,9,0<br> 8,9,0,5,6,7,6,0,3,3,2,9,0<br> 9,0,8,9,0,5,6,7,6,0,3,3,2<br> 3,3,9,0,8,9,0,5,6,7,6,0,2<br> 3,3,9,0,3,8,9,0,5,6,7,6,0,2<br> 3,3,9,0,3,8,9,0,5,6,7,2,6,0,2<br> 3,3,9,0,3,8,9,0,5,6,7,2,8,6,0,2<br> 3,3,9,0,3,8,9,0,5,6,7,2,8,9,6,0,2<br> 3,3,9,0,3,8,9,0,5,6,7,2,8,9,0,6,0,2<br> |
ш...што вы делаете наркоманы О_О
я уже кстати почти допилил рабочую функцию =) при условии что реплейс приоритетнее, удаления и вставки. то есть 10 реплейсов, приоритетнее 10 удалений и вставок. а это как раз то что нужно для ui, потому что перерисовать то что есть в уже готовом элементе мне не составит труда $scope[itemName] = arr[index]; $scope.$digest(); // зарендерить элемент а вот удалить и создать новый это то же самое что и тут тока новый парсинг дом этого элемента) |
| Часовой пояс GMT +3, время: 07:00. |