В Swift 3 Collection
индексы должны соответствовать Comparable
вместо Equatable
.
Полная история может быть прочитана здесь быстрая эволюция /0065.
Здесь соответствующая цитата:
Обычно индекс может быть представлен одним или двумя эффективно кодировать путь к элементу из корня данных состав. Поскольку можно свободно выбирать кодировку "пути", мы думаю, что можно выбрать его таким образом, чтобы индексы дешево сопоставимы. Это имело место для всех индексов требуется для реализации стандартной библиотеки, а некоторые другие мы исследованных при исследовании этого изменения.
В моей реализации пользовательской коллекции связанных списков a node (указывая на преемника) является непрозрачным типом индекса. Однако, учитывая два примера, невозможно определить, предшествует ли другому другому, не рискуя обходить значительную часть цепочки.
Мне любопытно, как бы вы реализовали Comparable
для связанного индекса списка с сложностью O (1)?
Единственная идея, которую я сейчас имею, - это как-то подсчитать шаги, продвигая индекс, сохраняя его в типе индекса как свойство, а затем сравнивая эти значения.
Серьезным недостатком этого решения является то, что индексы должны быть аннулированы при мутации коллекции. И хотя это кажется разумным для массивов, Я не хочу нарушать эти огромные преимущества, связанные с списками ссылок - они не делают недействительными индексы неизменных узлов.
EDIT: Это можно сделать за счет двух дополнительных целых чисел в качестве свойств коллекции, предполагая, что один связанный список реализует переднюю вставку, переднее удаление и обратно. Любое вмешательство в середине будет в любом случае нарушать требование сложности O (1).