Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 12.01.2012, 19:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Livaanderiamarum,
Дока :
function duplicat(b, c) {
    for (var d = [], e = {},a = 0; a < b.length; a++) e[b[a]]? e[b[a]]++:e[b[a]]=1 ;
    // создаём обьект c, где ключами являются значения первого массива
    // e[b[a]]? -> ключ есть ? это на тот случай если значения повторятся в массиве
    // увеличиваем значение ключа на 1
    // иначе если ещё ключа нет с таким значением
    // создаём ключ со значением 1
    for (a = 0; a < c.length; a++) e[c[a]] && d.push(c[a]) && e[c[a]]--;
    //пробегаемся по второму массиву
    // смотрим если значение элемента массива  среди ключей
    // нами созданного обьекта  и его значение ещё не ноль -> e[c[a]]
    // если ключ есть, заносим ключ в промежуточный массив d -> d.push(c[a])
    // значение самого ключа уменьшаем
    return d.length == b.length && c.length == b.length
    // проверяем длину промежуточного массива d c длиной массива b
    // они должны совпадать ->  d.length == b.length
    // плюс  должна совпадать  размерность исходных массивов -> c.length == b.length
    // последнюю проверку можно поставить в начало
};

Ок?
Ответить с цитированием
  #32 (permalink)  
Старый 12.01.2012, 19:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Livaanderiamarum,
Итого )))
function duplicat(b, c) {
    if(b.length != c.length) return !1;
    // должна совпадать  размерность исходных массивов -> c.length == b.length
    for (var d = 0, e = {},a = 0; a < b.length; a++) e[b[a]]? e[b[a]]++:e[b[a]]=1 ;
    // создаём обьект e где ключами являются значения первого массива
    // e[b[a]]? -> ключ есть ? это на тот случай если значения повторятся в массиве
    // увеличиваем значение ключа на 1
    // иначе если ещё ключа нет с таким значением
    // создаём ключ со значением 1
    for (a = 0; a < c.length; a++) e[c[a]] && d++ && e[c[a]]--;
    // пробегаемся по второму массиву
    // смотрим если значение элемента массива  среди ключей
    // нами созданного обьекта  и его значение ещё не ноль -> e[c[a]]
    // если ключ есть, увеличиваем счётчик d -> d++
    // значение самого ключа уменьшаем
    return d == b.length;
    // проверяем счётчик d c длиной массива b
    // они должны совпадать ->  d == b.length
    };
Ответить с цитированием
  #33 (permalink)  
Старый 12.01.2012, 19:54
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

написано без учёта повторений одинаковых значений в массивах.

function compare(arr1, arr2){
    if(arr1.length !== arr2.length) return false;

    var i = 0, a = {};
    // заносим в хеш значения первого массива.
    while(i in arr1) {
        // если на одинаковых позициях стоят одинаковые элементы, то зачем их проверять дальше?
        if(arr1[i] !== arr2[i])
            a[arr1[i]] = undefined;    
        i += 1;
    }
    // проходимся по элементам второго массива
    // если значения нет в хеше (т.е. нет в первом массиве, то сразу возвращается false
    while(i--) if(!(arr2[i] in a)) return false;
    // массивы похожи
    return true;
};

var a = ['a','b','c'], b = ['a','b','СТУЛ'], c = ['b','c','a'];
alert([compare(a,c), compare(b,c)]);


почему я использовал хеши и in ? на хабре увидел статью про то, что время на проверку существования через in во всех браузерах всегда равно нулю
хотя вместо хеша можно было бы использовать массив первый и indexOf... но это не для IE.

Последний раз редактировалось melky, 12.01.2012 в 21:49.
Ответить с цитированием
  #34 (permalink)  
Старый 12.01.2012, 20:20
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ]
__________________
29375, 35
Ответить с цитированием
  #35 (permalink)  
Старый 12.01.2012, 20:29
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Aetae Посмотреть сообщение
Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ]
условия :
Сообщение от bohdantheone Посмотреть сообщение
1) размеры массивов могут отличаться - да
2) у тя в них только строки будут - да
3) строки могут быть одинаковые -да
4) что в твоем понимании ПОХОЖИЕ - id1=id1
Ответить с цитированием
  #36 (permalink)  
Старый 12.01.2012, 20:52
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Сообщение от Aetae Посмотреть сообщение
Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ]
ПО этому я и не использовал метод зансения ЗНАЧЕНИЙ в ИМЕНА свойств обьекта, хотя это была первая мысль. Да и делал функцию не для Опа, а для развлечения скорее.
Ответить с цитированием
  #37 (permalink)  
Старый 12.01.2012, 20:55
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Сообщение от melky Посмотреть сообщение
я сделал так :

function compare(arr1, arr2){
    if(arr1.length !== arr2.length) return false;

    var i = 0, a = {};
    // заносим в хеш значения первого массива.
    while(i in arr1) {
        a[arr1[i++]] = undefined;    
    }
    // проходимся по элементам второго массива
    // если значения нет в хеше (т.е. нет в первом массиве, то сразу возвращается false
    while(i--) if(!(arr2[i] in a)) return false;
    // массивы похожи
    return true;
};

var a = ['a','b','c'], b = ['a','b','СТУЛ'], c = ['b','c','a'];
alert([compare(a,c), compare(b,c)]);
Метод пузырька )) только в методе пузырька итераций меньше и можно сравнивать НЕ ТОЛЬКО строки))
Ответить с цитированием
  #38 (permalink)  
Старый 12.01.2012, 21:08
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Напишите ка умельцы наши функцию быстрее чем моя для ПРОСТО СРАВНЕНИЯ двух массивов, при условии что в них лежат примитивные значения) и при условии что массивы раной длинны не равны. иными словами сравнить массивы игнорируя порядок элементов)
Ответить с цитированием
  #39 (permalink)  
Старый 12.01.2012, 21:21
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от nerv_ Посмотреть сообщение
Могу ошибаться, но этот вариант в IE работать не будет.
Чем тебя не устроила реализация:
Цитата:
indexOf is a recent addition to the ECMA-262 standard
данная по ссылке?

Вопрос ко всем - А где выполняется условие:
Сообщение от bohdantheone Посмотреть сообщение
итоговый вариант - выбранные сообщения будут удалятся
true false насколько я понял вообще не нужны ТС.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #40 (permalink)  
Старый 12.01.2012, 21:30
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Livaanderiamarum Посмотреть сообщение
Метод пузырька )) только в методе пузырька итераций меньше и можно сравнивать НЕ ТОЛЬКО строки))
специально для тебя апнул ту функцию. если на одинаковых позициях будут стоять одинаковые элементы, то количество итераций во втором цикле уменьшится.

ты вообще знаешь этот алгоритм? в чём он заключается и как работает?

Сообщение от Gozar Посмотреть сообщение
true false насколько я понял вообще не нужны ТС.
верно.. но данная тема уже страницу назад переросла из совета в очередное испытание меряние.

Последний раз редактировалось melky, 12.01.2012 в 21:36.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать два массива в один HackerSniper Общие вопросы Javascript 2 21.10.2011 04:33
Два блока div разъезжаются при скроллинге окна браузера. call007 jQuery 0 03.04.2011 16:21
Блок переключения меню на JS, два скрипта в одном файле Dizeloid Элементы интерфейса 0 30.07.2009 12:03
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53
вставка элементов массива в текстовую форму по клику olezyk Общие вопросы Javascript 3 21.03.2009 22:01