1) 程序在内存中运行,内存分区,时间复杂度:即while循环的次数
2)数组array
存储:一数占1byte=8bit,每个元素有相对于首个的index,一个数组占一片区
查找:逐个
增删:①重,牵一发而动全身
②10个要增至18个时,所占的区大小不够,还需要先找到大小能满足存储的区,再把10个挪过去,再开始增
3)链表
优点:解决了数组的缺陷②
存储:数组不需要再抱团占区,每个元素独立见缝插针即可,但前一个数同时要存储指向下一个数的指针,这不可避免会有tradeoff,一个指针在64位设备上占用8byte,32位占用4byte。
查找复杂度:O(n)
4)二分查找策略(也称折半查找)
定义:首先要对数字进行排序,有序的数组index为0,1,2…n,先从floor(n/2)开始查询,如果要找的数小于当前数,则下一步在左边子组的范围中查询,左边子组也是从该子组的floor(n/2)开始查询…每查找一次,或成功,或使查找数组中元素的个数减少一半,如果某一步数组为空,则表示找不到目标元素
时间复杂度:
5)链表搭配上二分查找策略就可以演变为二叉树
二叉树的优点:一个节点只存一个关键字,每查找一次,只需要和一个值进行比较,或成功,或使查找数组中元素的个数减少一半,适合内存中使用。
二叉树的缺点:树高,很可能趋近线性链表,如果用在磁盘,查找时IO次数多。
6)平衡二叉树(AVL)
平衡要求:左子树与右子树的高度之差的绝对值不超过1
7)特化的AVL树-红黑树
对之进行平衡的代价低于平衡二叉树
8)平衡多路查找树-B树
优点:树低,用在磁盘,有效减少查找时的IO次数
9)B+树
优点:范围查找全表扫描更高效