数组结构
开辟一片连续的空间,将元素依次放入其中
数组的优点:可以进行随机访问数据,只需要一个下标就可以访问到该数据。
数组的缺点:插入和删除数据会消耗大量的时间。
单链表和双向链表分别是啥?
单链表:单链表只有一个指向下一个节点的指针,也就是只能next。
双向链表:双向链表除了有一个指向下一节点的指针外,还有一个指向前一节点的指针。
链表的优点:插入删除速度快,大小没有固定,拓展灵活。
链表的缺点:不能随机查找,必须从第一个开始遍历,查找效率低。
hashmap的底层就是一个数组结构,数组的每一项又是一个链表。
hashmap的实现原理:
1.利用key的hashCode 重新计算出当前对象的元素在数组中的下标。
2.存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果
key不同(出现冲突),则将当前的key-value放入链表中。
3.获取时,直接找到hash值对应的下标,再进一步判断key是否相同,从而找到对应值。
核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中作进一步
的对比。
哈希表
哈希(hash)将某个对象变换为唯一标识符,该标识符通常用一个短的而随机字母和数字组成的字符串来
表示。哈希可以用来实现各种数据结构,其中最常用的就是哈希表。
哈希表通常是由数组实现的。
二叉树
二叉树是啥?
每个结点最多只有两个子树的树结构,通常子树被称为“左子树”和“右子树”。
叶子节点是啥?
叶子节点就是树中最底段的节点,叶子节点没有子节点。
二叉树分类?
完全二叉树:对一棵具有N个结点的二叉树按层编号,如果i(1<=i<=N)的结点与同样深度的满二叉树中
编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。
满二叉树:在一颗二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的
二叉树称为满二叉树。
平衡二叉树:它是一颗空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一颗平衡二叉树。
斜树:所有的结点都只有左子树的二叉树叫左斜树,所有结点都是只有右子树的二叉树叫右斜树,这两者
统称为斜树。
注意:满二叉树一定是完全二叉树,但反过来不一定成立。
二叉树的遍历:
先序遍历:先访问根节点,先序遍历左子树,先序遍历右子树
中序遍历:中序遍历左子树,访问根节点,中序遍历右子树
后序遍历:后序遍历左子树,后序遍历右子树,访问根节点
层次遍历:按照层次访问,通常用队列来做,访问根节点,访问子女,在访问子女的子女
二叉查找树
时间复杂度:就是树的深度
时间复杂度分析:
二分:log => 2^X=n(树的高度) => x = log2^n => logn
二叉搜索树又叫二叉查找树,二叉排序树:它具有以下特点:
1.如果它的左子树不为空,则左子树上结点的值都小于根结点。
2.如果它的右子树不为空,则右子树上结点的值都大于根结点。
3.子树同样也要遵守以上两点。
红黑树
红黑树的底层数据结构是一个二叉查找树
JDK1.7 HashMap:数组+链表
JDK1.8:链表+红黑树
红黑树的性质:
1.每个结点不是红色的就是黑色的。
2.不可能有连在一起的红色结点。
3.根结点都是黑色的。
4.每个红色结点的两个子结点都是黑色的,叶子节点都是黑色的:出度为0 满足了性质就可以近似的平衡,不一定要红黑,可以为其他的。
红黑树变换:
1.改变颜色:红变黑 黑边红
2.左旋:
队列和栈的区别?
栈的特点就是后进先出,对于栈中的数据来说,所有操作都是在栈的顶部完成的,只可以查看栈顶的数据,
只能向栈的顶部压入数据,也只能从栈的顶部取出数据。
队列的特点就是先进先出,就想是顺序排队一样,对于队列的数据来说,只允许在队尾查看和添加数据,在
队头查看和删除数据。
双端队列:双端队列和普通队列最大的不同在于,双端队列允许队列的头尾两端都能够进行数据的查看,添加
和删除。与队列相似,可以利用一个双向链表来实现双端队列。
优先队列:出栈顺序和入栈顺序无关,和优先级有关
数组结构
开辟一片连续的空间,将元素依次放入其中
数组的优点:可以进行随机访问数据,只需要一个下标就可以访问到该数据。
数组的缺点:插入和删除数据会消耗大量的时间。
单链表和双向链表分别是啥?
单链表:单链表只有一个指向下一个节点的指针,也就是只能next。
双向链表:双向链表除了有一个指向下一节点的指针外,还有一个指向前一节点的指针。
链表的优点:插入删除速度快,大小没有固定,拓展灵活。
链表的缺点:不能随机查找,必须从第一个开始遍历,查找效率低。
hashmap的底层就是一个数组结构,数组的每一项又是一个链表。
hashmap的实现原理:
1.利用key的hashCode 重新计算出当前对象的元素在数组中的下标。
2.存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果
key不同(出现冲突),则将当前的key-value放入链表中。
3.获取时,直接找到hash值对应的下标,再进一步判断key是否相同,从而找到对应值。
核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中作进一步
的对比。
哈希表
哈希(hash)将某个对象变换为唯一标识符,该标识符通常用一个短的而随机字母和数字组成的字符串来
表示。哈希可以用来实现各种数据结构,其中最常用的就是哈希表。
哈希表通常是由数组实现的。
排序
排序
归并排序:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间
有序,若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。
归并操作
也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如 设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11;
逆序数为14
快速排序
先找一个基准数,在从后面往前面依次找到比基准数小的那个数并交换位置,然后从前面往后面依次
查找比基准数大的那个数并交换位置,直到基准数的左边的数全部比基准数小,基准数右边的数全部比
基准数大为止。
例:6,1,2,9,10,7 -->将6作为基准数
第一次排序:2,1,6,9,10,7 -->此时基准数的左边全部比基准数小,基准数右边比基准数大,第一轮排序结束
第二次排序(对基准数左边的再次按照以上方法进行排序):1,2
第三次排序(对基准数右边的再次按照以上方法进行排序):7,9,10
最后排序结果:1,2,6,7,9,10
二叉树排序
使用第一个元素作为根结点,如果之后的元素比第一个小,则放在左子树,否则放到右子树,之后按中序排序。
二分法查找
首先二分法排序必须为有序数组,从中查找某一元素,如果此元素在这个数组中则返回下标,不在则返回-1;
通过数组的长度取其中间值,然后与要查找的元素相比较,如果大于则下次循环应该从左边查找,小于则从右边;
二分法排序快的原因是它并没有循环所有元素,而是折半查询,但是需要有序数组这一必要条件