《c++程序性能优化》——常用数据结构性能分析

来源:互联网 发布:药品网络销售好做吗 编辑:程序博客网 时间:2024/06/16 18:37

第4章 常用数据结构性能分析

 

1从遍历,插入,删除,排序,查找5个基本操作,分别对数组,链表,哈希表和二叉树的性能做分析。

~遍历~

数组:遍历很容易,无论升序和倒序,而且初始位置从任意K开始。

链表:通过跟踪指针的方式来完成整个链表的遍历。双向连链表课以支持升序和倒序。

哈希表:如果我们事先知道Key值,可以通过哈希函数来找到非空的桶,进行遍历,否则的哈遍历哈希数组的方式访问每个桶。

二叉树:有三种方法,前序,中序,后序。递归实现遍历。随着树的深度的增加程序对栈的使用越多,而栈是有限空间的。

~插入~

数组:插入新节点西药一大部分的连续存储区,时间空间复杂度高。

链表:非常方便。

哈希表:分为两步,定位桶和向桶内插入节点。

二叉树:二叉树的接结构影响插入操作效率,比如是否平衡。

~删除~

数组:和插入类似,需要大量的时间空间花费。一种好的办法是在需要删除某个节点的时候,不将他真正的删除,而是在节点中设计一个标志位,禁止其他程序使用该节点,当数目达到一定的阀值时,统一的删除。

链表:与插入操作完全相同。

哈希表:首先通过哈希函数和链表遍历找到待删节点,删除后重新设置前后指针。

二叉树:(1)如果是叶子节点,直接删除。

             (2)如果节点只有一个子节点,替换。

             (3)如果左右大都在,找到合适的节点做新的根节点。

~排序~

数组:

1,直接插入排序:当数据表A中每个元素距其最终位置不远,数据表A按关键字值基本有序,可用此方法排序较快。

2,冒泡排序法:将较小的值“上浮”到数组顶部,而较大值“下沉”到数组底部,这种排序技术要比较好几趟,每一趟要比较连续的数组元素对,如果某对数值是按升序排序的(或者这两个值相等),那就保持原样,如果某对数组是按降序排列的,就要交换它们的值。

3,快速排序法:快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

4,直接选择排序法:直接选择排序的作法是:第一趟扫描所有数据,选择其中最小的一个与第一个数据互换;第二趟从第二个数据开始向后扫描,选择最小的与第二个数据互换;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。它比起冒泡排序有一个优点就是不用不断的交换。

链表:

链表的排序的复杂度非常的高,大多数的内部排序方法都不能适用晕链表。我们可以使用链表数组的方法来。当需要排序时,构造一个数组,存放链表中节点的指针,在排序过程中通过这个数组定位每个节点,并实现节点的交换。

哈希表:

对哈希表排序没有意义、

二叉树:

二叉树本身就是有序的。

~查找~

数组:数组的最大的优点就是可以通过下标来访问节点。不过在实际未知的情况下,还是要遍历整个数组。

链表:一般的链表的查找就低效的,但在一些情况下,链表的查找效率得到提高。有序链表,可以在从一个最优节点来找。跳转链表,事先在链表中建立指针关系,查询的效率会大大提高

哈希表:哈希表的查找个桶的链表长有关

二叉树:取决于树的形状

 

2动态数组的实现和分析

在实际的开发过程中,数组是最常用的数据结构之一,在一般情况下,会定义成为静态数组,他在内存的空间不不变的,如果程序定义的是一个全局数组,编译器会在静态数据区为这个数组分配空间,如果是局部数组,会在栈分配空间。

 

当然动态数组通过new/delete和malloc/free的方式在堆和自由存储区分配内存。

优点:分配空间大,使用灵活

缺点:空间分配率比较低,容易造成内存泄露。

 

 

3小结

每种数据结构都有自己的优缺点,要合理的使用它们达到程序的整体性能最优。