12.01.2012, 21:37
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Сообщение от melky
|
3) строки могут быть одинаковые -да
|
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','c'], c = ['b','c','a','a'];
alert( compare(a,c));//true ??
|
|
12.01.2012, 21:47
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
рони, ого. спасибо, что нашли. мой алгоритм не представляет нормального решения для этого. только, если ввести числа вхождений в массив. но это уже ваш код.
|
|
12.01.2012, 22:34
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
рони, я мож чего не понимаю, но почему эти два массива равны? ['a','b', 'c','c'] и ['b','c', 'a','a']
var a = ['a','b','c','c'], c = ['b','c','a','a'];
Gozar, я не говорил, что она меня не устроила. Я сказал, что в IE работать не будет.
melky, тему с ходу не нашел, но за JSDoc спасибо)
За переделку извиняюсь. Первое, что пришло в голову (мог накосячить, голова к вечеру не варит)
function arrComp(x, z) {
if(x.length !== z.length) return false;
var i = 0, a = {};
while(i in x) {
if(x[i] !== z[i]) x[i] in a ? a[x[i]]++ : a[x[i]] = 1;
i++;
}
while(i--) if(z[i] in a) if(--a[z[i]] < 0) return false;
return true;
};
var a = ['a','b','c','c'], c = ['b','c','a','a'];
alert(arrComp(a,c)); // false
var a = ['c','b','a','d','a'], c = ['a','d','c','a','b'];
alert(arrComp(a,c)); // true
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 12.01.2012 в 23:03.
|
|
12.01.2012, 23:01
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Сообщение от nerv_
|
рони, я мож чего не понимаю, но почему эти два массива равны? ['a','b','c','c'] и ['b','c','a','a']
|
Потому что функция melky не учитывала число вхождений одинаковых элементов и смотрите ответ его выше
|
|
12.01.2012, 23:10
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Оптимальный вариант )))
function compare(arr1, arr2){
if(arr1.length !== arr2.length) return false;
arr1.sort();
arr2.sort();
var i = arr1.length;
while(i--) if(arr1[i] !== arr2[i]) return false;
return true;
};
var a = ['a','b','c','c'], c = ['b','c','a','a'], d = ['b','c','c','a'];
alert([compare(a,c),compare(a,d)]);
|
|
12.01.2012, 23:13
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от nerv_
|
Gozar, я не говорил, что она меня не устроила. Я сказал, что в IE работать не будет.
|
Что же ей помешает работать в IE? Может быть прилетят инопланетяне и похитят мозг пользователя?
Будет всё работать в IE.
Прочитай внимательно моё первое сообщение!
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
12.01.2012, 23:43
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Что-то мою функцию еще ни кто не переплюнул я смотрю))
Что, неужели ни чего лучше моего брутфорса у вас не получается?
ЛИЧНО у меня больше идей - нет! По этому так и сделал)
|
|
12.01.2012, 23:52
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от Livaanderiamarum
|
Что-то мою функцию еще ни кто не переплюнул я смотрю))
|
А нафига? У меня даже функции нет, а три строчки кода делающие то, что нужно в общепонятном виде.
Велосипеды изобретать весело только изобретателям велосипедов.
Для сравнения массива из пяти элементов брутфорсы не нужны. Там где есть родной indexOf будет работать весело, там где нет родного, чуть медленнее. Вопрос в том: - заметит ли пользователь эту разницу в мс?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
13.01.2012, 01:02
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Сообщение от Gozar
|
А нафига? У меня даже функции нет, а три строчки кода делающие то, что нужно в общепонятном виде.
Велосипеды изобретать весело только изобретателям велосипедов.
Для сравнения массива из пяти элементов брутфорсы не нужны. Там где есть родной indexOf будет работать весело, там где нет родного, чуть медленнее. Вопрос в том: - заметит ли пользователь эту разницу в мс?
|
Вопрос в том кто как оправдается...
|
|
13.01.2012, 01:19
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Ещё самокат ))) ...
function compare(arr1, arr2){
if(arr1.length !== arr2.length) return false;
arr1.sort();
arr2.sort();
var i = Math.random();
return arr1.join(i) == arr2.join(i) ;
};
var a = ['a','b','c','c'], c = ['b','c','a','a'], d = ['b','c','c','a'];
alert([compare(a,c),compare(a,d)]);
|
|
|
|