Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #41 (permalink)  
Старый 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 ??
Ответить с цитированием
  #42 (permalink)  
Старый 12.01.2012, 21:47
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

рони, ого. спасибо, что нашли. мой алгоритм не представляет нормального решения для этого. только, если ввести числа вхождений в массив. но это уже ваш код.
Ответить с цитированием
  #43 (permalink)  
Старый 12.01.2012, 22:34
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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.
Ответить с цитированием
  #44 (permalink)  
Старый 12.01.2012, 23:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от nerv_
рони, я мож чего не понимаю, но почему эти два массива равны? ['a','b','c','c'] и ['b','c','a','a']
Потому что функция melky не учитывала число вхождений одинаковых элементов и смотрите ответ его выше
Ответить с цитированием
  #45 (permalink)  
Старый 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)]);
Ответить с цитированием
  #46 (permalink)  
Старый 12.01.2012, 23:13
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от nerv_ Посмотреть сообщение
Gozar, я не говорил, что она меня не устроила. Я сказал, что в IE работать не будет.
Что же ей помешает работать в IE? Может быть прилетят инопланетяне и похитят мозг пользователя?

Будет всё работать в IE.

Прочитай внимательно моё первое сообщение!
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #47 (permalink)  
Старый 12.01.2012, 23:43
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Что-то мою функцию еще ни кто не переплюнул я смотрю))
Что, неужели ни чего лучше моего брутфорса у вас не получается?
ЛИЧНО у меня больше идей - нет! По этому так и сделал)
Ответить с цитированием
  #48 (permalink)  
Старый 12.01.2012, 23:52
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от Livaanderiamarum Посмотреть сообщение
Что-то мою функцию еще ни кто не переплюнул я смотрю))
А нафига? У меня даже функции нет, а три строчки кода делающие то, что нужно в общепонятном виде.

Велосипеды изобретать весело только изобретателям велосипедов.

Для сравнения массива из пяти элементов брутфорсы не нужны. Там где есть родной indexOf будет работать весело, там где нет родного, чуть медленнее. Вопрос в том: - заметит ли пользователь эту разницу в мс?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #49 (permalink)  
Старый 13.01.2012, 01:02
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Сообщение от Gozar Посмотреть сообщение
А нафига? У меня даже функции нет, а три строчки кода делающие то, что нужно в общепонятном виде.

Велосипеды изобретать весело только изобретателям велосипедов.

Для сравнения массива из пяти элементов брутфорсы не нужны. Там где есть родной indexOf будет работать весело, там где нет родного, чуть медленнее. Вопрос в том: - заметит ли пользователь эту разницу в мс?
Вопрос в том кто как оправдается...
Ответить с цитированием
  #50 (permalink)  
Старый 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)]);
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать два массива в один 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