C#常用数据结构

本文探讨了C#编程中常用数据结构的特征和操作时间复杂度,指导如何根据数据源特点选择合适的数据结构。对于无键值对的数据,推荐使用HashSet<T>以实现高效的插入、删除和查找;若数据源是键值对,字典类型如SortedDictionary<K,T>或SortedList<K,T>是常见选择。此外,还分析了不同数据量和数据重复情况下的最佳实践。" 108509715,9326093,Twincat HMI 中集成外部网页的实战指南,"['工业自动化', 'HMI开发', '嵌入式界面', '前端框架', 'TWINCAT']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用数据结构特征以及操作时间复杂度

数据结构类型及备注插入和删除查找
Array顺序存储的线性表、定长不支持(这里的插入与删除指会更改表长的行为)O(N)
LinkedList<T>链式存储的线性表、不定长O(1)O(N)
List<T>顺序存储的线性表、不定长、动态扩容O(N),结尾则是O(1)O(N)
Stack<T>栈、不定长、动态扩容O(1)只能访问栈顶
Queue<T>队列、不定长、动态扩容O(1)只能访问队列头部
Dictionary<K,T>保存键值对、使用开散列法、不定长、动态扩容、长度总为质数O(1)O(1)
SortedList<K,T>保存键值对、内部使用数组实现、保持有序、不定长O(logN)O(logN)
SortedDictionary<K,T>保存键值对、内部使用红黑树实现、保持有序、不定长O(logN)O(logN)
HashSet<K>使用开散列法、不定长、动态扩容、长度总为质数、是不含值的字典,故复杂度和它完全相同O(1)O(1)
SortedSet<T>内部使用红黑树实现、保持有序、不定长、是不含值的SortedDictionary<K,T>,故复杂度和它完全相同O(logN)O(logN)

如何选择数据结构

完美的数据结构应该具备较高的插入、删除效率和查找效率
对于队列,直接使用对应的数据结构即可

数据源不是键值对

  • 数据量大,没有重复数据。使用HashSet<T>,好处是令插入、删除和查找的时间复杂度都降为常数,而且,在大数据量的情况下,O(N)和O(1)区别较明显。这里的大小是相对的,具体还要根据性能测试来确定
  • 数据量大,但可能有重复数据;或数据量小。使用Array,List<T>或LinkedList<T>。当数据的数量是固定的,而且需要使用索引器时使用Array
  • 没有重复数据,且希望集合处于有序状态:使用SortedSet<T>,插入和删除的速度稳定,并且查找的速度提升
  • 有重复数据,且希望集合处于有序状态:没有现成的数据结构提供,可以考虑基于数组实现一个

数据源是键值对

如果数据源是键值对,那么可选项本来就不多。首先当然是类型安全的字典,然后,如果总是希望集合处于有序状态,从SortedList<K,T>和SortedDictionary<K,T>中进行权衡
另外对于键值对的情况,如果你的数据源数据很少,可以考虑使用List<KeyValuePair<K,T>>替代字典,在数据量小的情形,线性和常熟时间复杂度没有什么区别,但List<KeyValuePair<K,T>>比字典初始化要做的事情少多了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值