2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Нахождение предыдущего вхождения в массив.
Сообщение07.08.2012, 17:26 


03/05/09
45
Минск, Беларусь
Добрый день.

Хочется найти быстрое решение задачи: дан массив $A$ длины $n$ символов, требуется построить массив чисел $B$ , такой что на $i$-ой позиции массива $B$ стоит число $x$ тогда и только тогда, когда $A[x] = A[i]$ или $x = -1$ и число x максимальное с таким свойством из тех, что $< i$, притом для одинаковых символов из массива A должна быть ровно одна позиция $B$, где стоит единица (т.е. при первом появлении символа в массиве A). Пример: массив $A : a, b, c, d, c, c, a$; массив $B: -1, -1, -1, -1, 2, 4, 0$.

Решение есть и даже за $O(n)$, но хочется попроще.
Составить хэш таблицу $H$ символов, изначально в каждой ячейке которой поместить $-1$. После поочерёдно пробежаться по массиву $A$ и выполнить операцию: на $i$-ом шаге в $B[i]$ вписать $H[A[i]]$ и заменить $H[A[i]]$ на $i$.

Меня именно не устраивает в этом решении использование хэш функции. Задача очень естесственная и уже несколько раз встречалась на практике. Понятно, за ассимптотикой некуда гнаться, хочется за константой.

Заранее спасибо за Ваши советы.

P.S.: Понятно, что тут можно под каждый символ создать массив, там всего будет 24 ячейки - не велика потеря, но изначально задача стоит так, что и в первом массиве - числа.

 Профиль  
                  
 
 Re: Нахождение предыдущего вхождения в массив.
Сообщение07.08.2012, 19:17 
Заслуженный участник
Аватара пользователя


13/08/08
14469
А нельзя ли узнать, насколько велика длина массива и количество различных чисел, его составляющих?
Мне это напомнило некоторые задачи, где массив мог быть величиной несколько гигабайт, и требовалось строить второй массив несколько сотен раз подряд, меняя длину символа в битах и сдвиг. Тогда время выполнения весьма существенно.

 Профиль  
                  
 
 Re: Нахождение предыдущего вхождения в массив.
Сообщение07.08.2012, 21:15 


03/05/09
45
Минск, Беларусь
Размер массива может быть очень большим, $4 000 000 000$ может быть легко. Количество же различных чисел где-то $10000$. Однако хотелось бы полегче что-нибудь концептуально.

Одно из применений связано с поиском подстроки во многих документах и вывод всех документов, содержащих подстроку (алг. работает за $k + l$, где $k$ - количество документов, в которых слово лежит, $l$ - длина слова), другое применение - c алгоритмом кэширования furthest-in-future [CLRS страница 449 в 3-ем издании].

 Профиль  
                  
 
 Re: Нахождение предыдущего вхождения в массив.
Сообщение08.08.2012, 06:18 
Аватара пользователя


31/10/08
1244
Диапазон значений чисел А[i] известен?
Если памяти хватает то просто массив заводим вместо хэша используем само число.
О(n). Хэши это естественно и ими легко пользоваться, да и быстрее не будет. Можно деревья использовать будет O(n*log (m)) m - число различных цифр. Более медленно это делать просто массив и добавлять в него новые числа. O(n*m) Можно и медленнее вот только обычно все ищут как быстрее а вы почемуто как медленнее.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group