Re: [LIB] Новые коллекции
От: pekabon  
Дата: 20.03.15 08:09
Оценка: 53 (1)
Здравствуйте, VladD2, Вы писали:

VD>PriorityQueue[T] — название говорит самое за себя —


Есть же Nemerle.Collections.Heap
[LIB] Новые коллекции
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.03.15 18:58
Оценка:
Перенес три наших коллекции в немерловую библиотеку.
https://github.com/rsdn/nemerle/commit/0456362ba25f7e597476ca0329b8d341638fe2e2

HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым.

LightList[T] — аналог SCG.List[T] который имеет смысл использовать когда в списке преимущественно 0 или 1 элемент, но может появляться и больше элементов. Коллекция является структурой и хранит первый элемент в собственном поле. Создан для упрощения алгоритмов в которых происходит накопление элементов, а потом в зависимости от их числа создается коллекция или единичный элемент данных. Пример использования.

PriorityQueue[T] — название говорит самое за себя — очередь с приоритетом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 03.03.2015 19:05 VladD2 . Предыдущая версия . Еще …
Отредактировано 03.03.2015 19:01 VladD2 . Предыдущая версия .
Re: [LIB] Новые коллекции
От: Evgeny.Panasyuk Россия  
Дата: 03.03.15 19:49
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым.


Какой use-case?

VD>LightList[T] — аналог SCG.List[T] который имеет смысл использовать когда в списке преимущественно 0 или 1 элемент, но может появляться и больше элементов. Коллекция является структурой и хранит первый элемент в собственном поле.


Часта возникает ситуация когда есть много динамических массивов, причём размер большинства не превышает некоторый малый Threshold известный в compile-time. В таких случаях применяют small_vector<T, Threshold> (или аналоги), у которого внутри по сути variant<array<T, Threshold>, vector<T>> — это является общением твоего LightList.

VD>Создан для упрощения алгоритмов в которых происходит накопление элементов, а потом в зависимости от их числа создается коллекция или единичный элемент данных. Пример использования.


Насколько я вижу это не упрощение, а просто оптимизация
Re: [LIB] Новые коллекции
От: btn1  
Дата: 03.03.15 23:33
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>PriorityQueue[T] — название говорит самое за себя —


"Худенькая" какая-то у вас очередь! Практически, "SortedList".
Re[2]: [LIB] Новые коллекции
От: hardcase Пират http://nemerle.org
Дата: 04.03.15 17:04
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

VD>>HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым.


EP>Какой use-case?


Она не нужна
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [LIB] Новые коллекции
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.03.15 17:08
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

VD>>HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым.


EP>Какой use-case?


Когда нужно сделать элементы уникальными эта реализация может вернуть первый добавленный элемент. Можно сэмулировать на хэш-таблицы, но удобнее иметь специализированную коллекцию.

EP>Часта возникает ситуация когда есть много динамических массивов, причём размер большинства не превышает некоторый малый Threshold известный в compile-time. В таких случаях применяют small_vector<T, Threshold> (или аналоги), у которого внутри по сути variant<array<T, Threshold>, vector<T>> — это является общением твоего LightList.


Ну, это немного другая задача и на дотнете ее точно так же не решишь, так как дженерики не шаблоны. Разве что на макросах сбацать.

В коде компилятора немерла есть куча мест где LightList сдела бы код чище.

EP>Насколько я вижу это не упрощение, а просто оптимизация


Ну, оптимизация обычно есть уже в коде. Иначе можно было бы просто списки использовать. Обычно в коде присутствует говнокод с локальными переменными и проверками. Все это чтобы не создавать объект (список) для одного элемента. LightList делает это позволяя обойтись без говнокода.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [LIB] Новые коллекции
От: Evgeny.Panasyuk Россия  
Дата: 04.03.15 18:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>>>HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым.

EP>>Какой use-case?
VD>Когда нужно сделать элементы уникальными эта реализация может вернуть первый добавленный элемент. Можно сэмулировать на хэш-таблицы, но удобнее иметь специализированную коллекцию.

А, то есть просто HashSet это АТД Multiset, а HashSetEx это реализация АТД Set, без повторяющихся значений.
Имена получились слишком громоздкие AddOrGetFirstAddedItem, TryGetFirstAddedItem — может лучше позаимствовать лаконичную терминологию из STL, или ещё откуда.

VD>Ну, это немного другая задача и на дотнете ее точно так же не решишь, так как дженерики не шаблоны. Разве что на макросах сбацать.


Тогда интересно как будет выглядеть функция принимающая хотя бы конкретное воплощение small_vector, то есть аналог:
void foo(small_vector<T, 11> &x)
{
    // ...
}
Или даже её придётся описывать макросами?

VD>В коде компилятора немерла есть куча мест где LightList сдела бы код чище.


Это понятно.

VD>Ну, оптимизация обычно есть уже в коде. Иначе можно было бы просто списки использовать. Обычно в коде присутствует говнокод с локальными переменными и проверками. Все это чтобы не создавать объект (список) для одного элемента. LightList делает это позволяя обойтись без говнокода.


Понятно, то есть всё же оптимизация первична, пусть она и была ad-hoc.
Re[4]: [LIB] Новые коллекции
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.15 13:03
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>А, то есть просто HashSet это АТД Multiset, а HashSetEx это реализация АТД Set, без повторяющихся значений.

EP>Имена получились слишком громоздкие AddOrGetFirstAddedItem, TryGetFirstAddedItem — может лучше позаимствовать лаконичную терминологию из STL, или ещё откуда.

Нет. Multiset хранит все "одинаковые" значения. Этот же, как и обычный, Set хранит только одно значение. Но в отличии от обычного Set-а он позволяет его получить обратно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [LIB] Новые коллекции
От: Evgeny.Panasyuk Россия  
Дата: 05.03.15 13:42
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Нет. Multiset хранит все "одинаковые" значения. Этот же, как и обычный, Set хранит только одно значение. Но в отличии от обычного Set-а он позволяет его получить обратно.


А обычный HaseSet разве не позволяет через TryGetValue?
Или суть только в том, чтобы сделать это одним вызовом? Тогда непонятно зачем нужен отдельный класс, достаточно простой функции.
Re[6]: [LIB] Новые коллекции
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.15 20:08
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>А обычный HaseSet разве не позволяет через TryGetValue?


Дык, ты бы открыл доку и попробовал найти там такой метод. Вопросы бы отпали сами собой, так как его не существует.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [LIB] Новые коллекции
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.03.15 14:43
Оценка:
Здравствуйте, pekabon, Вы писали:

VD>>PriorityQueue[T] — название говорит самое за себя —


P>Есть же Nemerle.Collections.Heap


Хм. Действительно. Значит надо будет их слить в один унифицировав сравнение элементов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [LIB] Новые коллекции
От: hardcase Пират http://nemerle.org
Дата: 22.03.15 19:11
Оценка:
Здравствуйте, pekabon, Вы писали:

P>Здравствуйте, VladD2, Вы писали:


VD>>PriorityQueue[T] — название говорит самое за себя —


P>Есть же Nemerle.Collections.Heap


Добавил в Heap возможность указать функцию-сравнивалку, убрал ограничение на IComparable[T].
Выкинул PriorityQueue за ненадобностью.
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.