2014 dxdy logo

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

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




 
 Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 11:34 
Подскажите, где посмотреть, если известно, какое-нибудь представление последовательности элементов с индексированием и конкатенацией желательно за $O(1)$, ну или хотя бы за $O(\log n)$, где $n$ — длина последовательности или сумма длин сцепляемых. Лучше индексирование константное.

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 15:04 
А что, такие бывают? Вроде б, либо индексирование $O(1)$ конкатенация $O(n)$, либо индексирование логарифмическое, конкатенация фиксированная.

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 16:37 
Аватара пользователя
Вроде бы, если к массиву дополнительно выделять память, округлённую до степени двойки (как и делают, если массив должен часто "расти"), то конкатенация будет $\mathcal{O}(\log n)$ средневзвешенно.

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 17:05 
Munin в сообщении #1031262 писал(а):
Вроде бы, если к массиву дополнительно выделять память, округлённую до степени двойки (как и делают, если массив должен часто "расти"), то конкатенация будет $\mathcal{O}(\log n)$ средневзвешенно.
Конкатенация в массиве как минимум $O(n)$ - надо же скопировать добавляемые элементы.
А то, что вы имеете в виду - это добавление одного элемента в массив, тут как раз и получается амортизационное $O(1)$.

-- Пт июн 26, 2015 10:12:33 --

iifat в сообщении #1031210 писал(а):
А что, такие бывают? Вроде б, либо индексирование $O(1)$ конкатенация $O(n)$, либо индексирование логарифмическое, конкатенация фиксированная.
Можно довольно легко сделать обе операции $O(\log n)$ - бинарное дерево с хранением количества элементов.

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 17:17 
Аватара пользователя
venco в сообщении #1031273 писал(а):
Конкатенация в массиве как минимум $O(n)$ - надо же скопировать добавляемые элементы.

А, ну да, точно.

venco в сообщении #1031273 писал(а):
А то, что вы имеете в виду - это добавление одного элемента в массив, тут как раз и получается амортизационное $O(1)$.

Простите, логарифм.

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 17:18 
venco в сообщении #1031273 писал(а):
Можно довольно легко сделать обе операции
А, балансировать при конкатенации?

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 17:37 
Munin в сообщении #1031278 писал(а):
venco в сообщении #1031273 писал(а):
А то, что вы имеете в виду - это добавление одного элемента в массив, тут как раз и получается амортизационное $O(1)$.

Простите, логарифм.
Всё-таки константа.

-- Пт июн 26, 2015 10:38:13 --

iifat в сообщении #1031280 писал(а):
venco в сообщении #1031273 писал(а):
Можно довольно легко сделать обе операции
А, балансировать при конкатенации?
Балансировка - это $O(\log n)$. Хотя, я не уверен, надо подумать.

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 17:44 
venco в сообщении #1031288 писал(а):
Всё-таки константа.


Теперь уже Munin имеет ввиду что под "амортизированным O(1)" в среднем кроется логарифм.

А, стоп... действительно.... не всё так просто...

P.S.

Да, действительно. Контринтуитивно, но получается что при такой стратегии вектор добавляет единичный элемент в среднем как раз за O(1). Хех...

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 19:04 
Аватара пользователя
Покажите, а?

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение26.06.2015, 19:30 
Добавление элемента не требующее увеличения массива - $O(1)$, иначе - $O(e^k)$, где $e$ - коэффициент увеличения размера массива, $k$ - номер увеличения.
Суммарное время $k$-го этапа, на котором добавляются $e^k-e^{k-1}$ элементов состоит из увеличения массива и заполнения выделенной памяти - $O(e^k)+(e^k-e^{k-1})O(1)=O(e^k)$. Соответственно суммарное время всех этапов до $k$ тоже $O(e^k)$, при этом суммарное количество добавленных элементов - $e^k$. Амортизированное время - $O(1)$.
Кстати, коэффициент $e$ лучше брать меньше $\frac{\sqrt 5 +1}2$, тогда не образуются дырки в памяти. (спорно)

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение27.06.2015, 00:48 
Аватара пользователя
venco в сообщении #1031273 писал(а):
Можно довольно легко сделать обе операции $O(\log n)$ - бинарное дерево с хранением количества элементов.

Таки не обычное, а link-cut tree (сплей или декартово, например), обычные не обязательно поддерживают слияние за логарифм.

 
 
 
 Re: Структура данных с индексированием и конкатенацией за O(1)
Сообщение27.06.2015, 02:58 
Аватара пользователя
venco
Спасибо, красиво.

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group