列表去重三种实现的渐近界(O vs Θ)选择问题咨询
先明确严格渐近记法的使用前提:
- 大O(O)仅描述算法运行时间的上界,保证运行时间增长不会超过这个量级
- 紧界(Θ)描述算法运行时间的上下界增长量级完全一致,即不管输入是什么情况,运行时间都在这个量级区间内
我们标注复杂度的核心逻辑就是根据算法实际的上下界表现选择对应的记法,三个算法的标注原因分别如下:
1. 暴力去重算法标注O(n²)的原因
该算法每次遍历到新元素时,都要遍历已经去重的前半段数组检查重复:
- 最坏情况:输入数组所有元素都不重复,每次检查的操作数随已去重长度递增,总操作数为
1+2+...+n ≈ n²/2,上界为O(n²) - 最好情况:输入数组所有元素完全相同,每次检查仅需要比对1次就能判定重复,总操作数仅为O(n)
二者的增长量级完全不同,不存在统一的紧界,因此只能标注能稳定保证的上界O(n²)。
2. 排序后去重算法标注Θ(nlogn)的原因
该算法的耗时由排序和单次遍历两部分组成:
- 不管输入数组的重复率多高,Python内置排序的Timsort实现的时间复杂度稳定为Θ(nlogn),不会跳出这个量级
- 后续遍历去重的耗时为Θ(n),量级远小于排序的Θ(nlogn),不影响整体复杂度
因此该算法无论输入是什么样的,运行时间的上下界都稳定在nlogn量级,符合Θ的定义,所以直接标注Θ(nlogn)。
3. 哈希集合法标注「平均情况Θ(n)」的原因
该算法的性能完全依赖哈希集合的查找、插入操作:
- 平均情况:哈希冲突概率极低,单次查找、插入的耗时为Θ(1),遍历整个数组的总耗时就是Θ(n),上下界一致可以用Θ标注
- 最坏情况:如果出现极端哈希冲突(所有元素的哈希值都落在同一个哈希桶中),单次查找、插入的耗时会退化到O(n),总耗时最坏可达O(n²),达不到Θ(n)的标准
因此必须明确注明这个Θ(n)仅为平均情况的结论,不覆盖最坏场景。
内容的提问来源于stack exchange,提问作者Robin Andrews
相关产品推荐
相关产品推荐

