2013-06-07 3 views
0

Кто-нибудь знает источник характеристик производительности по методу «содержит» в разных вариантах списков Scala? Документы scala language охватывают основные операции, такие как head, tail, append и т. Д., Но, похоже, не отражают производительность «contains». (Или, по крайней мере, я не нашел ничего такого.)Производительность Scala List

FWIW, мне нужна самая быстрая структура, которая эффективно скажет мне, существует ли элемент в его листинге. Это перечисление, после первоначальной компиляции, не будет проходить никаких дальнейших операций a/m/d.

Это для версии Scala 2.10.0

EDIT: в случае, если бы никакой разницы, это список текстовых сегментов (~ 16 до 48 символов.) И, чтобы уточнить, что документы сделали содержат одну небольшую таблицу, показывающую производительность поиска, но только для небольшого набора реализаций списка/карты.

+2

Он должен был бы быть довольно сумасшедшим своего рода список для содержит не быть O (п). Если вы хотите, чтобы Fast содержал, используйте [Set] (http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Set) – Cubic

+0

Эта таблица находится по всей карте, когда она приходит к поиску. Конечно, большинство из них - хеш (за предыдущее редактирование), но там достаточно дисперсии, что я хотел бы убедиться: http://www.scala-lang.org/docu/files/collections-api/collections_40.html – mjk

+0

Для большинства целей есть только один «аромат» списка в Scala, «List», который является классическим, функциональным (Lisp-like) cons-cell-based list. «Список» Scala - это конкретный тип, тогда как «Список» Java является абстрактным. То, что Java вызывает «List» Scala, вызывает «Seq», абстрактный тип для всех коллекций, которые поддерживают определенный порядок их записей, идентичных или противоположных порядку добавления записей. Как указывали другие, вы хотите «Установить», чья точная цель - поддерживать быстрые тесты на наличие или отсутствие определенного значения. –

ответ

1

Это похоже на правильное задание для дерева, дерева RB в этом случае, где поиск, выполненный contains, выполняет логарифмически количество фрагментов.

Поскольку вам нужно только проверить сдерживание, вы должны использовать набор для дальнейшего уменьшения времени поиска.

Решение TreeSet

+0

Из любопытства я кажусь, что некоторые из реализаций списка scala, по-видимому, сочетают параллельную функциональность между списками, массивами и т. Д. ... какая-либо из базовых конструкций использует дерево для реализации содержит - или это делается с помощью грубой - Итерация? – mjk

+0

Итерация. Во всяком случае, обратите внимание, что деревья RB нуждаются в дополнительной памяти для хранения структуры данных (по крайней мере, цветной бит и два указателя на узел). Выбор одного или другого на самом деле зависит от ситуации: деревья RB более тяжелые, и вы будете воспринимать выгоду только с большим количеством хранимых элементов (я на самом деле не сравнивал это). Также обратите внимание, что списки могут сохранять порядок вставки (например, массивы), а деревья - не по дизайну. –

+1

Почему не 'HashMap'? Он предоставит 'O (1)'/ – Jatin

Смежные вопросы