21.02.2011, 05:57
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Еще одна задачка.
Есть два массива, которые генерируете вы (не суть из каких данных, главное, что вы имеете возможность создать свою структуру и тип элементов Number или String). В первом массиве содержится элемент, равный одному из элементов из второго массива. Пример:
arr1 = ['a', 'b', 'c', 'd'];
arr2 = ['e','f','g','b','h','i'];
Повторюсь, структура массива произвольная, задаваемая вами. Количество элементов массивов велико, вплоть до 1 миллиона.
Задача
Найти индексы совпадающих элементов, написав максимально оптимизированный для этой цели код и предложить структуру массива (если она отличается от указанной выше).
|
|
21.02.2011, 06:21
|
Профессор
|
|
Регистрация: 07.01.2011
Сообщений: 582
|
|
function find(A, B) {
R = [-1, -1];
outer: for (var i = 0; i < A.length; i++) {
for (var j = 0; j < B.length; j++) {
if (A[i] == B[j]) {
R = [i, j];
break outer;
break;
}
}
}
return R;
}
(R[0] + 1) * (R[1] + 1) итераций.
function find(A, B) {
var C = {}, R = [-1, -1];
for (var i = A.length - 1; i >= 0; i--)
C[A[i]] = i;
for (var i = 0; i < B.length; i++) {
if (B[i] in C) {
R = [C[B[i]], i];
break;
}
}
return R;
}
A.length + R[1] - 1 итераций.
Последний раз редактировалось Matre, 21.02.2011 в 06:36.
|
|
21.02.2011, 10:33
|
|
Профессор
|
|
Регистрация: 25.05.2010
Сообщений: 511
|
|
По первой задаче получилось немного громоздко, но работает вроде как надо:
String.prototype.index = function(sep) {
var l = this.length, sl = sep.length - 1, i = 0, j = 0, w = '';
while (i < l) {
if ((this.charAt(i) == sep.charAt(0) && this.charAt(i + sl) == sep.charAt(sl)) || j != 0){
if (j <= sl) {w += this.charAt(i + j); j++;}
else if (j >= sl) if (w == sep) return i; else {w = ''; j = 0; i++; continue;}} else i++;}
return -1;
}
var s1 = 'aababaO_o',
s2 = 'aababababaO_o';
l1 = 'aba', l2 = 'abac', l3 = 'aa', l4 = 'O_o', l5 = 'abaO', l6 = 'ababaO';
alert([
[s1.index(l1), s1.indexOf(l1)],
[s1.index(l2), s1.indexOf(l2)],
[s1.index(l3), s1.indexOf(l3)],
[s1.index(l4), s1.indexOf(l4)],
[s1.index(l5), s1.indexOf(l5)],
[s2.index(l6), s2.indexOf(l6)]
].join('\n'))
|
|
21.02.2011, 10:35
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
FINoM, если поддерживать отсортированность массивов (грозит вставкой за O(n), лучше использовать списки), то можно найти такую пару за O(n+m), где m и n - длины массивов.
Или использовать вместо массива какое-нибудь сбалансированное дерево. Вставка в среднем O(log n), поиск пары - O(n+m).
|
|
21.02.2011, 10:39
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Vulkan, учитывая то, что i увеличивается не на каждой итерации, этот вариант по алгоритмической сложности ничем не отличается от двух циклов.
|
|
21.02.2011, 10:39
|
Профессор
|
|
Регистрация: 07.01.2011
Сообщений: 582
|
|
***
|
|
21.02.2011, 17:46
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Matre, B@rmaley.e><e, даю подсказку:
Первый массив создаем "традиционно"
arr1 = {1:'a', 2:'b', 3:'c', 4:'d'};
Во втором при создании меняем ключи и значения местами
arr2 = {'e':1,'f':2,'g':3,'b':4,'h':5,'i':6};
|
|
23.02.2011, 11:54
|
|
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,578
|
|
Сообщение от FINoM
|
Первый массив создаем "традиционно"
arr1 = {1:'a', 2:'b', 3:'c', 4:'d'};
|
традиционно - специально в кавычки заключил? Как бы объект создаешь ...
|
|
23.02.2011, 13:05
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от micscr
|
традиционно - специально в кавычки заключил? Как бы объект создаешь ...
|
Это для наглядности. На самом деле это обычный массив.
|
|
|
|