Итак, я просматривал реализацию SortedList<TKey, TValue>
и реализацию Add
(который вызывает Insert
, показанный ниже) действительно удивил меня.
Метод Add
делает очевидный двоичный поиск для определения индекса, в котором должен идти KVP, но Insert
кажется, что он может быть значительно улучшен (хотя и в больших масштабах):
private void Insert(int index, TKey key, TValue value)
{
if (this._size == this.keys.Length)
this.EnsureCapacity(this._size + 1);
if (index < this._size)
{
Array.Copy((Array) this.keys, index, (Array) this.keys, index + 1, this._size - index);
Array.Copy((Array) this.values, index, (Array) this.values, index + 1, this._size - index);
}
this.keys[index] = key;
this.values[index] = value;
++this._size;
++this.version;
}
Если я правильно прочитал это, и я оставляю за собой право быть неправым во все времена, это операция O(2n)
.
Мне кажется, что значения должны быть реализованы с помощью указателей. Вид вроде LinkedList
по отношению к значению из ключа, но не связан с тем, что он не поддерживает произвольный доступ. Более того, ключ просто связан с его значением. Операция get не будет медленнее, и ни один из них не будет удален, потому что у нас есть указатель, но теперь операция добавления будет O(n)
.
Может кто-то пролить свет на то, почему решение, возможно, пошло в этом направлении?