Я бы предложил просто перетасовать массивы вместо того, чтобы пытаться распространить это на коллекции в целом:
extension Array {
mutating func shuffle () {
for i in (0..<self.count).reversed() {
let ix1 = i
let ix2 = Int(arc4random_uniform(UInt32(i+1)))
(self[ix1], self[ix2]) = (self[ix2], self[ix1])
}
}
}
Да - их рабочие характеристики существенно различаются. Вероятно, было бы лучше называть их SortedList
и SortedTree
, поскольку это более точно отражает реализацию.
Просмотрите документы MSDN для каждого из них ( SortedList
], SortedDictionary
) для получения подробной информации о производительности для различных операций в разных ситуациях. Вот хорошее резюме (из документации SortedDictionary
):
Общий
SortedDictionary
класс - это двоичное дерево поиска с O (log n) поиск, где n - количество элементов в словаре. В этом он похож наSortedList
общий класс. У двух классов похожие объектные модели, и обе имеют O (log n) поиск. Где два класса отличается использованием памяти и скоростью вставка и удаление:
SortedList
использует меньше память, чемSortedDictionary
.
SortedDictionary
имеет более быстрая установка и удаление операции с несортированными данными, O (log n) в отличие от O (n) дляSortedList
.Если список заполняется сразу из отсортированных данных,
SortedList
быстрее, чемSortedDictionary
.
( SortedList
фактически поддерживает отсортированный массив, а не использует дерево. Он по-прежнему использует двоичный поиск для поиска элементов.)
Посетите страницу MSDN для SortedList :
Из раздела примечаний:
SortedList <(Of <(TKey, TValue>)> )
универсальный класс - это двоичное дерево поиска с извлечениемO (log n)
, гдеn
- количество элементов в словаре. В этом он аналогичен универсальному классуSortedDictionary <(Of <(TKey, TValue>)>)
. У этих двух классов похожие объектные модели, и у обоих естьO (log n)
извлечение. Эти два класса отличаются использованием памяти и скоростью вставки и удаления:
SortedList <(Of <(TKey, TValue>)>)
использует меньше памяти, чемSortedDictionary <(Of <(TKey, TValue>)>)
.
SortedDictionary <(Of <(TKey, TValue>)> )
имеет более быстрые операции вставки и удаления для несортированных данных,O (log n)
в отличие отO (n)
дляSortedList <(Of <(TKey, TValue>)>)
.Если список заполняется сразу из отсортированных данных,
SortedList <(Of <(TKey, TValue>)>)
быстрее, чемSortedDictionary <(Of <(TKey, TValue>)>)
.