1、计数排序算法(需要两个辅助数组存放排序结果的B[1...n],提供临时存储区的C[0...k]),输入数组A[1...n]
辅助数组C的长度,输入数组的最大数就是辅助数组的长度
计数排序是一种线性排序算法,不用进行比较。基本思想是对于每个元素x,找出比x小的数的个数,从而确定x在排好序的数组中的位置。
图中,数组A是待排序的数组,C是用来临时存放信息的数组,B是最终排好序的数组。对于A中的每一个元素,我们将其元素作为C数组的下标。直白的说,如a中,C[0]=2表示A中的元素为0的有两个,C[1]=0,表示A数组中没有值为1的元素,以此类推。所以C[i]中存放的是A中i的个数。b图是对数组前面的数字相加后的结果,如C[2]=4表示,A中小于等于2的元素有4个。以此类推。
得到A和C之后,就可以开始排序了。如A[1]=2,我们由C数组知道,小于等于2的元素有4个,所以排好序的数组中,2应该放在数组的第4位。图中是从后往前的。比如A[8]=3,由C知道,数组A中小于等于3的元素有7个,因此B[7]=3.以此类推这样排下去……
【特别注意】由于数组中可能会有相等的元素,因此在排序后,要记得C中对应部分减1
1. 提前必须是已知待排序的关键字为整型且范围已知。
2. 时间复杂度为O(n+k),不是基于比较的排序算法,因此效率非常之高且稳定。
3. 稳定性好,这个是计数排序非常重要的特性,可以用在后面介绍的基数排序中。
4. 但需要一些辅助数组,如C[0..k],因此待排序的关键字范围0~k不宜过大。
2、常见排序算法稳定性、时间复杂度比较
3、顺序存储结构
顺序表的插入、删除需移动大量元素O(n);但在尾端插入、删除效率高O(1)。
- 随机存取结构:指在一个数据结构上进行查找的时间性能是O(1)。顺序表就是一种随机存取结构。
- 顺序存取结构:指在一个数据结构上进行查找的时间性能是O(n)。单链表就是一种顺序存取结构。
链式存储结构:
(1)占用额外的空间以存储指针(浪费空间)
(2)存取某个元素速度慢
(3)插入元素和删除元素速度快
(4)没有空间限制,存储元素的个数无上限,基本只与内存空间大小有关.
顺序存储结构:
(1)空间利用率高
(2)存取某个元素速度快
(3)插入元素和删除元素存在元素移动,速度慢,耗时
(4)有空间限制,当需要存取的元素个数可能多于顺序表的元素个数时,会出现"溢出"问题.当元素个数远少于预先分配的空间时,空间浪费巨大.
在存取元素频繁,但删除或插入操作较少的情况宜用顺序表.堆排序,二分查找适宜用顺序表.
4、数据结构,用筛选法建堆的问题
由无序序列筛选变成有序序列从第 【i/2】(取下界)个开始
5、吞吐率
流水线时间计算公式:一条指令所需时间+(指令条数-1)*时间最长的指令的一段 // 6t+(n-1)3t
吞吐率公式:指令条数 除以 流水线时间
6、关系型数据库和非关系型数据库
数据库 类型 | 特性 | 优点 | 缺点 |
关系型数据库 SQLite、Oracle、mysql | 1、关系型数据库,是指采用了关系模型来组织 数据的数据库; 2、关系型数据库的最大特点就是事务的一致性; 3、简单来说,关系模型指的就是二维表格模型, 而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 | 1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解; 2、使用方便:通用的SQL语言使得操作关系型数据库非常方便; 3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率; 4、支持SQL,可用于复杂的查询。 | 1、为了维护一致性所付出的巨大代价就是其读写性能比较差; 2、固定的表结构; 3、高并发读写需求; 4、海量数据的高效率读写; |
非关系型数据库 MongoDb、redis、HBase | 1、使用键值对存储数据; 2、分布式; 3、一般不支持ACID特性; 4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 | 1、无需经过sql层的解析,读写性能很高; 2、基于键值对,数据没有耦合性,容易扩展; 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 | 1、不提供sql支持,学习和使用成本较高; 2、无事务处理,附加功能bi和报表等支持也不好; |
注1:数据库事务必须具备ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性。
注2:数据的持久存储,尤其是海量数据的持久存储,还是需要一种关系数据库。
7、先深度后广度测试技术