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, время: 09:32. |