Мне нужен способ вычисления числа элементов меньше X в TreeSet
целых чисел очень быстро.TreeSet: количество элементов меньше эффективного значения
я могу использовать
- подмножество()
- ШЛЕМОФОНА()
- постав хвоста()
методу, но они очень медленно (я просто нужно количество, а не номера самих). Есть ли способ?
спасибо.
EDIT:
Я нашел обходной путь, который делает вещи намного быстрее! Я использую BitSet и его метод cardinality(). Сначала я создаю BitSet, и для каждого элемента, добавленного в TreeSet, я устанавливаю соответствующий индекс в BitSet. Теперь, чтобы подсчитать количество элементов меньше, чем использование XI:
bitset.get (0, X + 1) .cardinality()
Это намного быстрее по сравнению с treeset.subSet (0, правда, X , true) .size().
Кто-нибудь знает почему? Я предполагаю, что BitSet.cardinality() не использует линейный поиск.
Вы можете попробовать Guava 'TreeMultiset', который поддерживает' headMultiset (element) .size() 'в O (log n), а не O (n). Однако это не то же самое, что и «TreeSet». Но 'headMultiset (element) .elementSet(). Size()' также будет O (log n). –
Зачем вам нужно дерево? Вы часто обновляете структуру данных? Если вы не обновляете структуру данных, просто сохраните количество элементов меньше X в хэш-карте! Если вы обновляете его не часто, сохраните отсортированный список номеров. В insert/remove добавьте/удалите из списка в O (1) и обновите hashmap (O (n)). –
Спасибо за ваш комментарий @Masood_mj. Проблема в том, что X не является конкретным значением, оно изменяется каждый раз, когда я вызываю функцию cardinality(). Поэтому, если я хочу использовать hashmap, тогда я должен обновлять все элементы с помощью ключа> Y каждый раз, когда я добавляю или удаляю Y в хэш-карту (+1 или -1 все). Я что-то упускаю? – mnmp