数据结构在C#
数组Array:顺序存储结构
优点:按位置索引很快,修改效率高。
缺点:需声明存放类型,且只能存放相同类型,必须指定长度(过长浪费,过短溢出),插入与删除很慢(排除特殊情况)。
数组ArrayList:顺序存储结构,解决了Array的缺点,由源码得知,默认容量为4,容量自增2倍。
不过由于容量是类成员,自增机制会引发线程安全问题,所以ArrayList不是线程安全的。
优点:无需指定长度,无需声明存放类型,可存放不同类型元素,底层是object,顺序存储结构常有优点这里都有。
缺点:由于底层元素是object,当为值类型时,存在装箱/拆箱操作,效率降低,且可能会有非类型安全问题。顺序存储结构常有缺点这里都有。
数组List:顺序存储结构,综合Array和ArrayList的优点,所以List也不是线程安全的。
优点:无需指定长度,长度自增。需声明存放类型,内部用Array实现,保证了类型安全。
缺点:顺序存储结构常有缺点都有。
所以现在基本上不使用Array和ArrayList,而是使用List。
双向链表LinkList:链式存储结构,非线程安全,可自己加锁实现线程安全。
优点:插入,删除效率高,只需修改指针域的前驱节点和后继节点即可进行插入删除。
缺点:无法基于位置索引,必须从头结点依次遍历。
队列Queue:顺序存储结构,先进先出集合。由官方文档得知,非线程安全,但是其有线程安全的的队列实现为ConcurrentQueue
默认容量为32,容量自增为4(.net framework 4.8),其他版本可能会有变化。
栈Stack:顺序存储结构,后进先出集合,默认容量10,容量自增2倍。非线程安全。
-
公式法求复杂度:
NQueen算法:
算法复杂度:
- 题外:关于ref, out的区别
1、ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
2、out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。