Перерахування діапазону ImmutableSortedDictionary за ключем


11

Я читав про C # ImmutableSortedDictionaryв System.Collections.Immutableі думав про те, як це застосувати у своїй програмі. Мені дуже подобаються C ++ lower_boundі upper_bound(див. Тут ), і я швидше очікував побачити щось подібне для пошуку діапазону. Однак схожі методи, здається, дивно відсутні в документації . Я щось пропускаю? Або MS справді надає відсортований словник без ефективного доступу до відсортованих діапазонів? Це зовсім не схоже на те, що можна зробити на IEnumerableклавішах, як, наприклад, метод розширення, тому я трохи спантеличений, я не бачу чогось, що надається безпосередньо колекцією.


Ерік Ліпперт поділився незмінною реалізацією дерева AVL ще в 2008 році. З коментарів я не думаю, що він ще не особливо оптимізований для швидкості та ефективності, але реалізація IBinarySearchTree<K,V>цього інструменту виглядає ближче до того, що я очікував. Цікаво, чи він коли-небудь загравав на цьому?
J

ImmutableList<T>Клас також реалізований у вигляді дерева AVL. Із вихідного коду :/// The root node of the AVL tree that stores this set.
Теодор Зуліас

Чи знаєте ви, чи означають вони, що у списку використовується AVL true для реалізації незмінності або якщо саме дерево AVL є незмінним? (можливо, це не має значення, оскільки вони все одно не піддають дерево).
J

Ось переваги ImmutableList<T>(підкріпленого деревом AVL) над ImmutableArray<T>(підтримуваного масивом), згідно з документацією . Причини використання незмінного списку: 1) Оновлення даних є загальним, або кількість елементів не очікується невеликою. 2) Оновлення колекції є більш важливим для продуктивності, ніж повторення вмісту.
Теодор Зуліас

Це тому, що додаючи або видаляючи елемент з великого дерева AVL, ви можете отримати нове дерево, не руйнуючи оригінальне, поділивши більшість вузлів і створивши лише кілька нових вузлів. ( Стійка структура даних - Дерева )
Теодор Зуліас

Відповіді:


9

Це дратує те, що наявні вбудовані колекції не пропонують повний набір функцій (як, наприклад, SortedDictionaryвідсутність BinarySearchметоду), змушуючи нас шукати сторонні рішення (наприклад, бібліотека C5 ).

У вашому випадку замість an ImmutableSortedDictionaryви, ймовірно, можете використовувати a ImmutableSortedSet, вбудовуючи значення в ключі та використовуючи відповідний порівняльник. Принаймні API цього класу містить властивості Minта Max.


2
Як бічна примітка, інший незмінний клас, the ImmutableList<T>, реалізується внутрішньо як дерево . Таким чином, це в 10 разів повільніше і виділяє в 12 разів більше пам'яті, ніж a List<T>. Використовуйте ImmutableArray<T>замість цього.
Теодор Зуліяс

1
Хе-хе, я вже використовую C5, але шукаю, щоб побачити, що було доступно для незмінних колекцій (крім знімків). Дякую! Я буду висловлювати надію, що хтось інший вирішив це якимось чином чи формою, але я маю на увазіImmutableSortedSet
J

@TheodorZoulias, який сенс використовувати метод BinarySearch в SortedDictionary, коли метод TryGetValue працює в журналі (N)? дивіться тут
Giorgi

2
@GiorgiChkhikvadze, BinarySearch може дати вам наступний елемент, більший за предмет, який ви шукаєте, у випадку, якщо точна відповідність не буде знайдена.
Теодор Зуліяс

1
@GiorgiChkhikvadze Напевно, найбільша відмінність тут полягає в тому, що повернене значення - це не просто одне значення в колекції, а швидше спосіб індексації до колекції. Метод BinarySearch є особливим не тільки тим, що він знаходить значення ефективно, але й тому, що він знаходить індекс навіть у випадку пропуску, як зазначив Теодор, - що дозволяє швидко отримати доступ, наприклад, до масиву. У випадку з деревом ціле число не може бути ефективним способом доступу до структури; C ++ вирішує це за допомогою використання об'єкта ітератора (хоча і зі своїми складностями).
J
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.