浅谈C#常用集合类的实现以及基本操作复杂度

本文深入解析了C#中各类集合类的性能特性,包括List、SortedList、Dictionary、SortedDictionary、HashSet和SortedSet的Add、Contains等方法的时间复杂度,为开发者选择合适的数据结构提供指导。

List 集合类是顺序线性表,Add操作是O(1)或是O(n)的,由于List的容量是动态扩容的,在未扩容之前,其Add操作是O(1),而在需要扩容的时候,会拷贝已存在的那些元素同时添加新的元素,此时的Add操作是O(n)的。而对于Contains方法,其是按照线性检索的,其复杂度是O(n)。而BinarySearch方法,其是按二分查找的,其复杂度是O(lg n)。

SortedList集合类是有序线性表,Add操作是O(n),       其Contains方法是通过二分查找检索元素的,因此复杂度是O(lg n),其Containskey方法也是通过二分查找检索元素,复杂度也是O(lg n),ContainsValue方法是使用线性查找元素,复杂度是O(n)。

Dictionary集合类是hash表,Add操作是O(1)或是O(n)的,原因同上。其Containskey方法是O(1),原因是通过hash来查找元素而不是遍历元素。ContainsValue方法的时间复杂度是O(n),原因是内部通过遍历key来查找value,而不是通过hash来查找。Item[Key]属性根据key来检索value,其时间复杂度也是O(1)。

SortedDictionary集合类是基于平衡二叉树实现的,其Add方法是O(lg n),ContainsKey方法也是O(lg n),而ContainsValue方法则是O(n)。

HashSet集合类是包含不重复项的无序hash表(非线性表)。Add操作是O(1)或是O(n)的,原因同List集合类。Contains方法是O(1)。HashSet是Set集合,它只实现了ICollection接口,在单独元素访问上,有很大的限制:     1、List相比,不能使用下标来访问元素,如:list[1] 。        2、Dictionary相比,不能通过键值来访问元素,例如:dic[key],因为HashSet每条数据只保存一项,并不采用Key-Value的方式,换句话说,HashSet中的Key就是Value,假如已经知道了Key,也没必要再查询去获取Value,需要做的只是检查值是否已存在。

SortedSet集合类是基于红黑树实现的,其Add方法是O(lg n),Contains方法也是O(lg n)

 目前只涉及到Add以及Contains等检索方法,后续可能会补充上删除等操作的复杂度。

参考:

真是O(1)吗?想清楚了没?

C# SortedDictionary以及SortedList的浅谈

你真的了解字典(Dictionary)吗?

转载于:https://www.cnblogs.com/zhiyong-ITNote/p/10363568.html

哈希表(Hash Table)是一种非常重要的数据结构,它通过哈希函数将键映射到表中的一个位置来访问记录,以加快查找的速度。下面详细介绍哈希表的时间复杂度: ### 平均情况下的时间复杂度 - **插入**:O(1) - **删除**:O(1) - **查找**:O(1) 在理想情况下,即没有哈希冲突或者冲突较少时,哈希表的插入、删除和查找操作都可以在常数时间内完成。 ### 最坏情况下的时间复杂度 - **插入**:O(n) - **删除**:O(n) - **查找**:O(n) 最坏的情况通常发生在大量的键被哈希函数映射到同一个位置,导致严重的哈希冲突。此时,哈希表退化为链表结构,所有操作的时间复杂度都会上升到O(n)。 以下是一个简单的Python实现哈希表的例子: ```python class HashTable: def __init__(self, size): self.size = size self.table = [None] * size def hash_function(self, key): return key % self.size def insert(self, key, value): index = self.hash_function(key) if self.table[index] is None: self.table[index] = [(key, value)] else: found = False for i, (k, v) in enumerate(self.table[index]): if k == key: self.table[index][i] = (key, value) found = True break if not found: self.table[index].append((key, value)) def search(self, key): index = self.hash_function(key) if self.table[index] is not None: for k, v in self.table[index]: if k == key: return v return None def delete(self, key): index = self.hash_function(key) if self.table[index] is not None: for i, (k, v) in enumerate(self.table[index]): if k == key: del self.table[index][i] break # 使用例子 ht = HashTable(10) ht.insert(1, 'apple') ht.insert(2, 'banana') print(ht.search(1)) # 输出: apple ht.delete(1) print(ht.search(1)) # 输出: None ``` 上述代码中`HashTable`类实现了基本的哈希表功能,包括插入、删除和查找操作。每个操作都尽量保持在O(1)的时间复杂度内完成,但当出现哈希冲突时,可能会退化到O(n)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值