[.Net]SortedSet常用方法时间复杂度分析与改进思路

简介

最近在做算法题,用SortedSet解决一个区间添加和区间删除问题。不可避免的需要分析一下方法的时间复杂度。
仅介绍Max、Min、GetViewBetween()、Count方法/属性。Add和Remove肯定是log级别的,因为公开的代码注释中写了用的是红黑树。
分析参考了公开的代码,应该是.Net6.0的,看index时间是6月13。(.Net6.0和.Net Framework的实现好像不同,在Stack Overflow上有人提到)(https://source.dot.net/#System.Collections/System/Collections/Generic/SortedSet.cs,03df9da9e6b0283e

方法/属性

Max, Min

O(logn),每次获取时从根一路向右或一路向下

GetViewBetween(left, right)

O(logn),调用会从this的root遍历得到给定范围([left, right])中的根元素,就算初始化完成。
注1:返回的是SortedSet.TreeSubSet,一些属性的获取时间复杂度和主Set区别较大
注2:早期的实现好像会在创建SubSet的同时计算Count,导致了时间复杂度不为log级(有人在Stack Overflow里问“为什么这个方法不是logn”)

Count

O(1)或O(k),k是Set中的元素数量。
O(k)情况主要发生在GetViewBetween返回的TreeSubSet中,因为在这种情况下Count不能被remove+add追踪计算,所以只能在调用的时候遍历一遍子树去计算。

改进思路

主要针对Count属性的计算。
可以为每个节点维持一个_nodeNum字段,记录以当前节点为子树的节点数量,这样就可以log级别计算出SubSet的Count,当然也要在每次添加删除的时候递归更新这个字段的值,需要额外O(logn)的复杂度。但O(logn)+O(logn)=O(logn)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容