我正在尝试解决HackerRank中的挑战,而解决方案要求:
O(log [n])项插入。
O(log [n])检索项目。
令我惊讶的是,我意识到没有支持这两种操作的数据结构。
最初,我相信SortedList可以满足所有要求,但不能!
SortedDictionary对于未排序的数据, O(log n)具有更快的插入和删除操作,而对SortedList的 O(n)具有更快的插入和删除操作。
阅读此行提示SortedDictionary可能满足我的需求,但答案是否定的!再次
SortedDictionary和SortedList类之间的另一个区别是SortedList支持通过Keys and Values属性返回的集合对键和值进行有效的索引检索。访问属性时不必重新生成列表,因为列表只是键和值的内部数组的包装。以下代码显示了Values属性用于从排序的字符串列表中检索值的索引。
他们建议使用 ToList()扩展名和列表中的 BinarySearch(),但使用此 ToList()来完全检索键的集合。 >调用已经使性能达到O(n),因此没有必要调用 BinarySearch()。
另一方面,索引检索 O(log [n])的一种非常流行的实现方式是,在树的每个节点上添加一个字段Count,以跟踪许多项目都位于以该节点为根的子树中。可以在O(1)中的红黑树旋转期间更新此字段,并且每个节点仅消耗 sizeof(int)个额外的内存。
问题:
为什么从一开始就没有这样实现?
将其包含在SortedSet数据结构中有什么弊端?