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

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

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

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


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

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

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

СкипЛист это ж не то, что красно-черное - вообще не дерево.
...
Рейтинг: 0 / 0
Структура данных "Список с пропусками"
    #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
Структура данных "Список с пропусками"
    #38653165
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90СкипЛист это ж не то, что красно-черное - вообще не дерево.RB-дерево - структура для хранения данных (элементов списка) внутри SkipList'а.redwhite90всю логику я не осознал как это работаетКак я понял, там используется хитро-мутный неблокирующий алгоритм вставки.redwhite90похоже реально рандом. http://en.literateprograms.org/Skip_list_(Java)#Random_Levels redwhite90Что-то мне кажется в таком случае мы не получим сбалансированного скиплистаWiki Красно-чёрное дерево — это одно из самобалансирующихся двоичных деревьев поиска...
...
Рейтинг: 0 / 0
Структура данных "Список с пропусками"
    #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
Структура данных "Список с пропусками"
    #38653353
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,
на википедии красно-черное дерево тоже дерево
...
Рейтинг: 0 / 0
Структура данных "Список с пропусками"
    #38653474
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90непонятно где кто у кого внутри ConcurrentSkipListSet использует ConcurrentSkipListMap (который хранит данные ввиде дерева)
redwhite90Согласен, но не понятно как это влияет на баланcировку.Вероятность того, что новый элемент будет добавлен на нулевой
уровень в два раза выше, чем на 1-й... и т.д.
Само по себе ничего несбалансируется. Придется
восстанавливать структурное свойство дерева: сравнения,
перемещения... (хорошая визуализация алгоритма вставки: демо-апплет )
...
Рейтинг: 0 / 0
Структура данных "Список с пропусками"
    #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
Структура данных "Список с пропусками"
    #38653582
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90только вообще не понимаю что за двумерный скип лист ConcurrentSkipListMap реализует интерфейс NavigableMap для того, чтобы
совершать движения по коллекции ключей (в т.ч. и для получения срезов)
...
Рейтинг: 0 / 0
Структура данных "Список с пропусками"
    #38653593
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

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

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

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

где ?

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

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

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

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

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

а скиплист?

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


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

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

согласен, только не понимаю причём тут двумерность
...
Рейтинг: 0 / 0
Структура данных "Список с пропусками"
    #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
Структура данных "Список с пропусками"
    #38655832
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

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

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



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


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