各种算法简介

1.二分查找:

   要求数据必须是按照顺序排序的

  然后假设是按照升序排序的,首先把要查找的数据和表中间位置的数据比较大小,如果两者相等,则查找成功,否则利用中间位置记录

  将表拆分为前,后两个子表,如果中间位置大于查找关键字,则进一步查找前表,然后再次从中间比较,拆分,直到找到为止.

2.二叉查找树  转载;原文:https://blog.csdn.net/chenkaibsw/article/details/80648941

    节点的左子树都是小于这个节点,节点的右子树都是大于这个节点的

    所以从某节点node开始查找,如果在要找的值小于这个节点的值,就在左子树中查找,如果要找的值大于这个节点的值,

   就在该 节点的右子树中查找,这里看出,最终查找后,从根节点到结束查找的节点,只有一条路径,

     所以二叉查找树的效率很高,如果一直找到某一个叶子节点,还没有找到,就返回false。
 

3.红黑二叉树:是一颗自平衡的排序二叉树。也就是说该二叉树的任何一个等等子节点,其左右子树的高度都相近。

        1、每个节点都只能是红色或者黑色

       2、根节点是黑色

       3、每个叶节点(NIL节点,空节点)是黑色的。

       4、如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。

       5、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

     对于红黑二叉树而言它主要包括三大基本操作:左旋、右旋、着色。

  转载: https://blog.csdn.net/wzd2012/article/details/73530444

 

4.链表  转载https://www.cnblogs.com/ysocean/p/7928988.html

     是一种线性表,但是不会按照线性的顺序存储数据,而在每个节点里存储了下个节点的指针.

     一个单链表的节点(Node)分为两个部分,第一个部分(data)保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。

     最后一个节点存储地址的部分指向空值。

     对于单项链表,我们如果想在尾部添加一个节点,那么必须从头部一直遍历到尾部,找到尾节点,

    然后在尾节点后面插入一个节点。这样操作很麻烦,如果我们在设计链表的时候多个对尾节点的引用,那么会简单很多。

 转载:https://blog.csdn.net/kangxidagege/article/details/80211225

双链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针,可以通过prev()快速找到前一结点,顾名思义,单链表只能单向读取

 

1.hashMap底层哈希表  从上图我们可以发现哈希表是由数组+链表组成的

调用Put方法的时候发生了什么呢?  转载https://blog.csdn.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算法。

 

JDK1.8后: 当链表的节点数超过8个的时候,会自动变为红黑二叉树, 当节点小于6个的时候,会变为链表

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值