Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Структура данных "Список с пропусками" / 25 сообщений из 38, страница 1 из 2
26.05.2014, 23:38
    #38652634
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Я так понимаю, что SkipList в java это как раз "Список с пропусками"

http://ru.wikipedia.org/wiki/Список_с_пропусками

Как-то тут посредственно объяснено,а больше ничего я не нашёл.

Помогите понять, что это за структура данных такая, как реализовать ее самому?
...
Рейтинг: 0 / 0
27.05.2014, 00:07
    #38652647
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
нашёл.
Человек красиво всё расписал.


http://habrahabr.ru/post/139870/

Но всё-таки как при вставке(удалении) балансировать скип-лист не совсем понятно. Как выбирать количество уровней.
...
Рейтинг: 0 / 0
27.05.2014, 00:12
    #38652648
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
и идея Lock-Free для ConcurrentSkipListSet не ясна.
...
Рейтинг: 0 / 0
27.05.2014, 01:05
    #38652655
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90Но всё-таки как при вставке(удалении) балансировать скип-лист не совсем понятно. Как выбирать количество уровней. http://ru.wikipedia.org/wiki/Красно-чёрное_дерево redwhite90и идея Lock-Free для ConcurrentSkipListSet не ясна.ConcurrentSkipListSet использует ConcurrentSkipListMap (см. doPut, doGet...)
...
Рейтинг: 0 / 0
27.05.2014, 11:30
    #38652939
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

Usman http://ru.wikipedia.org/wiki/Красно-чёрное_дерево

СкипЛист это ж не то, что красно-черное - вообще не дерево.
...
Рейтинг: 0 / 0
27.05.2014, 11:54
    #38653000
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

UsmanConcurrentSkipListSet использует ConcurrentSkipListMap (см. doPut, doGet...)

doGet то тут вообще не причем.


по doPut: всю логику я не осознал как это работает, но вот что увидел:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
 private V More ...doPut(K kkey, V value, boolean onlyIfAbsent) {
890         Comparable<? super K> key = comparable(kkey);
891         for (;;) {
892             Node<K,V> b = findPredecessor(key);
893             Node<K,V> n = b.next;
894             for (;;) {
895                 if (n != null) {
896                     Node<K,V> f = n.next;
897                     if (n != b.next)               // inconsistent read
898                         break;;
899                     Object v = n.value;
900                     if (v == null) {               // n is deleted
901                         n.helpDelete(b, f);
902                         break;
903                     }
904                     if (v == n || b.value == null) // b is deleted
905                         break;
906                     int c = key.compareTo(n.key);
907                     if (c > 0) {
908                         b = n;
909                         n = f;
910                         continue;
911                     }
912                     if (c == 0) {
913                         if (onlyIfAbsent || n.casValue(v, value))
914                             return (V)v;
915                         else
916                             break; // restart if lost race to replace value
917                     }
918                     // else c < 0; fall through
919                 }
920 
921                 Node<K,V> z = new Node<K,V>(kkey, value, n);
922                 if (!b.casNext(n, z))
923                     break;         // restart if lost race to append to b
924                 int level = randomLevel();
925                 if (level > 0)
926                     insertIndex(z, level);
927                 return null;
928             }
929         }
930     }



Код: java
1.
int level = randomLevel();

похоже реально рандом. Что-то мне кажется в таком случае мы не получим сбалансированного скиплиста
...
Рейтинг: 0 / 0
27.05.2014, 13:10
    #38653165
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90СкипЛист это ж не то, что красно-черное - вообще не дерево.RB-дерево - структура для хранения данных (элементов списка) внутри SkipList'а.redwhite90всю логику я не осознал как это работаетКак я понял, там используется хитро-мутный неблокирующий алгоритм вставки.redwhite90похоже реально рандом. http://en.literateprograms.org/Skip_list_(Java)#Random_Levels redwhite90Что-то мне кажется в таком случае мы не получим сбалансированного скиплистаWiki Красно-чёрное дерево — это одно из самобалансирующихся двоичных деревьев поиска...
...
Рейтинг: 0 / 0
27.05.2014, 14:41
    #38653346
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

по поводу Random_Levels:

wikiThis gives us a 50% chance of the random_level() function returning 0, a 25% chance of returning 1, a 12.5% chance of returning 2 and so on.

Согласен, но не понятно как это влияет на баланcировку.

для меня дерево это


а скиплист это:


непонятно где кто у кого внутри
...
Рейтинг: 0 / 0
27.05.2014, 14:43
    #38653353
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,
на википедии красно-черное дерево тоже дерево
...
Рейтинг: 0 / 0
27.05.2014, 15:39
    #38653474
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90непонятно где кто у кого внутри ConcurrentSkipListSet использует ConcurrentSkipListMap (который хранит данные ввиде дерева)
redwhite90Согласен, но не понятно как это влияет на баланcировку.Вероятность того, что новый элемент будет добавлен на нулевой
уровень в два раза выше, чем на 1-й... и т.д.
Само по себе ничего несбалансируется. Придется
восстанавливать структурное свойство дерева: сравнения,
перемещения... (хорошая визуализация алгоритма вставки: демо-апплет )
...
Рейтинг: 0 / 0
27.05.2014, 16:20
    #38653562
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

UsmanConcurrentSkipListMap (который хранит данные ввиде дерева)

кто Вам это сказал?

java docThis class implements a tree-like two-dimensionally linked skip
list in which the index levels are represented in separate
nodes from the base nodes holding data

только вообще не понимаю что за двумерный скип лист
...
Рейтинг: 0 / 0
27.05.2014, 16:34
    #38653582
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90только вообще не понимаю что за двумерный скип лист ConcurrentSkipListMap реализует интерфейс NavigableMap для того, чтобы
совершать движения по коллекции ключей (в т.ч. и для получения срезов)
...
Рейтинг: 0 / 0
27.05.2014, 16:39
    #38653593
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

Usman чтобы
совершать движения по коллекции ключей (в т.ч. и для получения срезов)

Что вы понимаете под срезом?
...
Рейтинг: 0 / 0
27.05.2014, 16:43
    #38653599
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90кто Вам это сказал?см. Index<K,V>
redwhite90Что вы понимаете под срезом?имел ввиду метод subMap:
Код: java
1.
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive);
...
Рейтинг: 0 / 0
27.05.2014, 16:45
    #38653603
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

авторсм. Index<K,V>

где ?

а как же моя картинка? я неправильно нарисовал?

как связана субМапа и двумерный скиплист ?
...
Рейтинг: 0 / 0
27.05.2014, 17:30
    #38653688
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,
ну и то, что скиплист это не дерево это сто пудов. Я тут читаю сейчас, что его в конкарренси и поместили потому, что если мы что-то удаляем из дерева - ему надо целиком перебалансироваться, соответсвенно на это время мы залочим всё дерево, а скиплисту надо первести пару указателей и всё и блочиться целиком нет нужды.
...
Рейтинг: 0 / 0
28.05.2014, 03:28
    #38653979
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90где ? тынц
...
Рейтинг: 0 / 0
28.05.2014, 03:32
    #38653980
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90а как же моя картинка? я неправильно нарисовал?Дерево нарисовано правильно.
redwhite90как связана субМапа и двумерный скиплист ? тынц
...
Рейтинг: 0 / 0
28.05.2014, 03:41
    #38653981
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90Usman,
ну и то, что скиплист это не дерево это сто пудов. Я тут читаю сейчас, что его в конкарренси и поместили потому, что если мы что-то удаляем из дерева - ему надо целиком перебалансироваться, соответсвенно на это время мы залочим всё дерево, а скиплисту надо первести пару указателей и всё и блочиться целиком нет нужды.Грубо говоря: ConcurrentSkipListSet это обертка над ConcurrentSkipListMap (копайте в сторону ConcurrentSkipListMap ).
...
Рейтинг: 0 / 0
28.05.2014, 11:44
    #38654271
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

UsmanГрубо говоря: ConcurrentSkipListSet это обертка над ConcurrentSkipListMap (копайте в сторону ConcurrentSkipListMap).

В этом я и не сомневался)
Как HashSet и HashMap)
...
Рейтинг: 0 / 0
28.05.2014, 11:47
    #38654278
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

UsmanДерево нарисовано правильно.

а скиплист?

Usmanкак связана субМапа и двумерный скиплист ?


вот честно не понял - объясните пожалуйста на пальцах
...
Рейтинг: 0 / 0
28.05.2014, 15:17
    #38654653
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90а скиплист?Пойдет. (Дуговые стрелки можно сделать другим цветом)redwhite90вот честно не понял - объясните пожалуйста на пальцах subSet вызывает subMap , который возвращает
фрагмент ConcurrentSkipListMap'а в виде ConcurrentNavigableMap
начиная с fromKey по toKey (см. SubMap<K,V> )
...
Рейтинг: 0 / 0
28.05.2014, 16:18
    #38654740
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

UsmansubSet вызывает subMap, который возвращает
фрагмент ConcurrentSkipListMap'а в виде ConcurrentNavigableMap
начиная с fromKey по toKey (см. SubMap<K,V>)

согласен, только не понимаю причём тут двумерность
...
Рейтинг: 0 / 0
28.05.2014, 16:38
    #38654769
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
redwhite90согласен, только не понимаю причём тут двумерностьЕсть узлы и индексы:
Node<K,V>
Код: java
1.
2.
3.
4.
5.
6.
7.
/**
* Nodes hold keys and values, and are singly linked in sorted
* order, possibly with some intervening marker nodes. The list is
* headed by a dummy node accessible as head.node. The value field
* is declared only as Object because it takes special non-V
* values for marker and header nodes.
*/

Index<K,V>
Код: java
1.
2.
3.
4.
5.
6.
7.
/**
* Index nodes represent the levels of the skip list.  Note that
* even though both Nodes and Indexes have forward-pointing
* fields, they have different types and are handled in different
* ways, that can't nicely be captured by placing field in a
* shared abstract class.
*/

java doctree-like two-dimensionally linked skip listНе двумерный, а двусвязный список, т.е. связь узлов (ссылки на соседние узлы)
...
Рейтинг: 0 / 0
29.05.2014, 14:30
    #38655832
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура данных "Список с пропусками"
Usman,

UsmanНе двумерный, а двусвязный список, т.е. связь узлов (ссылки на соседние узлы)

Я наверное что-то не понимаю. Для меня двусвяхный это примерно так:



или тут как-то по другому?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Структура данных "Список с пропусками" / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]