常用数据结构的时间复杂度
如何选择数据结构
Array(T[])
当元素的数量是固定的,并且需要使用下标时。
Linkedlist(LinkedListT)
当元素需要能够在列表的两端添加时。否则使用ListT。
Resizablearraylist(ListT)
当元素的数量不是固定的,并且需要使用下标时。
Stack(StackT)
当需要实现LIFO(LastInFirstOut)时。
Queue(QueueT)
当需要实现FIFO(FirstInFirstOut)时。
Hashtable(DictionaryK,T)
当需要使用键值对(Key-Value)来快速添加和查找,并且元素没有特定的顺序时。
Tree-baseddictionary(SortedDictionaryK,T)
当需要使用价值对(Key-Value)来快速添加和查找,并且元素根据Key来排序时。
Hashtablebasedset(HashSetT)
当需要保存一组唯一的值,并且元素没有特定顺序时。
Treebasedset(SortedSetT)
当需要保存一组唯一的值,并且元素需要排序时。
Array在计算机程序设计中,数组(Array)是最简单的而且应用最广泛的数据结构之一。在任何编程语言中,数组都有一些共性:
数组中的内容是使用连续的内存(ContiguousMemory)来存储的。
数组中的所有元素必须是相同的类型,或者类型的衍生类型。因此数组又被认为是同质数据结构(HomegeneousDataStructures)。
数组的元素可以直接被访问。比如你需要访问数组的第i个元素,则可以直接使用arrayName[i]来访问。
对于数组的常规操作包括:
分配空间(Allocation)
数据访问(Accessing)
在C#中,可以通过如下的方式声明数组变量。
intallocationSize=10;
bool[]booleanArray=newbool[allocationSize];
FileInfo[]fileInfoArray=newFileInfo[allocationSize];
上面的代码将在CLR托管堆中分配一块连续的内存空间,用以容纳数量为allocationSize,类型为arrayType的数组元素。如果arrayType为值类型,则将会有allocationSize个未封箱(unboxed)的arrayType值被创建。如果arrayType为引用类型,则将会有allocationSize个arrayType类型的引用被创建。
如果我们为FileInfo[]数组中的一些位置赋上值,则引用关系为下图所示。
.NET中的数组都支持对元素的直接读写操作。语法如下:
//读数组元素
boolb=booleanArray[7];
//写数组元素
booleanArray[0]=false;
访问一个数组元素的时间复杂度为O(1),因此对数组的访问时间是恒定的。也就是说,与数组中包含的元素数量没有直接关系,访问一个元素的时间是相同的。
未完待续。。。