各种算法简介
1.二分查找:
要求数据必须是按照顺序排序的
然后假设是按照升序排序的,首先把要查找的数据和表中间位置的数据比较大小,如果两者相等,则查找成功,否则利用中间位置记录
将表拆分为前,后两个子表,如果中间位置大于查找关键字,则进一步查找前表,然后再次从中间比较,拆分,直到找到为止.
2.二叉查找树 转载;原文:https://blog.****.net/chenkaibsw/article/details/80648941
节点的左子树都是小于这个节点,节点的右子树都是大于这个节点的
所以从某节点node开始查找,如果在要找的值小于这个节点的值,就在左子树中查找,如果要找的值大于这个节点的值,
就在该 节点的右子树中查找,这里看出,最终查找后,从根节点到结束查找的节点,只有一条路径,
所以二叉查找树的效率很高,如果一直找到某一个叶子节点,还没有找到,就返回false。
3.链表 转载https://www.cnblogs.com/ysocean/p/7928988.html
是一种线性表,但是不会按照线性的顺序存储数据,而在每个节点里存储了下个节点的指针.
一个单链表的节点(Node)分为两个部分,第一个部分(data)保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。
最后一个节点存储地址的部分指向空值。
对于单项链表,我们如果想在尾部添加一个节点,那么必须从头部一直遍历到尾部,找到尾节点,
然后在尾节点后面插入一个节点。这样操作很麻烦,如果我们在设计链表的时候多个对尾节点的引用,那么会简单很多。
转载:https://blog.****.net/kangxidagege/article/details/80211225
双链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针,可以通过prev()快速找到前一结点,顾名思义,单链表只能单向读取
1.hashMap底层哈希表 从上图我们可以发现哈希表是由数组+链表组成的
调用Put方法的时候发生了什么呢? 转载https://blog.****.net/wufaliang003/article/details/79997585
比如调用hashMap.put("apple", 0) ,插入一个Key为“apple"的元素。这时候我们需要利用一个哈希函数来确定Entry的插入位置(index):
index= Hash(“apple”)
但是,因为HashMap的长度是有限的,当插入的Entry越来越多时,再完美的Hash函数也难免会出现index冲突的情况。
HashMap数组的每一个元素不止是一个Entry对象,也是一个链表的头节点。每一个Entry对象通过Next指针指向它的下一个Entry节点。当新来的Entry映射到冲突的数组位置时,只需要插入到对应的链表即可:
需要注意的是,新来的Entry节点插入链表时,使用的是“头插法”。之所以把Entry6放在头节点,是因为HashMap的发明者认为,后插入的Entry被查找的可能性更大。这就是HashMap的底层原理。
使用Get方法根据Key来查找Value的时候,发生了什么呢?
首先会把输入的Key做一次Hash映射,得到对应的index:
index= Hash(“apple”)
由于刚才所说的Hash冲突,同一个位置有可能匹配到多个Entry,这时候就需要顺着对应链表的头节点,一个一个向下来查找。假设我们要查找的Key
是“apple”:
HashMap的默认初始长度是16,并且每次自动扩展或是手动初始化时,长度必须是2的幂。之所以选择16,
是为了服务于从Key映射到index的Hash算法。