zoukankan      html  css  js  c++  java
  • 2020-12-05:go中,map的扩容流程是什么?

    福哥答案2020-12-05:[答案来自此链接:](https://www.bilibili.com/video/BV1Nr4y1w7aa?p=13)

    源码位于runtime/map.go文件中的hashGrow函数。

    在向map中添加数据时,当达到某个条件,则会引发字典扩容。

    扩容条件:
    1.map中数据总个数/桶个数>6.5,引发翻倍扩容。mapassign中的overLoadFactor函数。
    2.使用了太多的溢出桶时(溢出桶使用的太多会导致map处理速度降低)。mapassign中的tooManyOverflowBuckets函数。
    B<=15,已使用的溢出桶个数>=2的B次方时,引发等量扩容。
    B>15,已使用的溢出桶个数>=2的15次方时,引发等量扩容。

    当扩容之后:
    1.B会根据扩容后新桶的个数进行增加(翻倍扩容 新B=旧B+1,等量扩容 新B=旧B)。
    2.oldbuckets指向原来的桶(旧桶)。
    3.buckets指向新创建的桶(新桶中暂时还没有数据)。
    4.nevacuate设置为0,表示如果数据迁移的话,应该从原桶(旧桶)中的第0个位置开始迁移。
    5.noverflow设置为0,扩容后新桶中已使用的溢出桶为0。
    6.extra.oldoverflow设置为原桶(旧桶)已使用的所有溢出桶。即:h.extra.oldoverflow = h.extra.overflow。
    7.extra.overflow设置为nil,因为新桶中还未使用溢出桶。
    8.extra.nextOverflow设置为新创建的桶中的第一个溢出桶的位置。

  • 相关阅读:
    poj 3278 catch that cow
    POJ 1028 Web Navigation
    poj 2643 election
    hdu 1908 double queues
    hdu_2669 Romantic(扩展欧几里得)
    0/1背包 dp学习~6
    校验码
    最长上升子序列(LIS经典变型) dp学习~5
    LCS最长公共子序列~dp学习~4
    最长上升子序列(LIS) dp学习~3
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14091182.html
Copyright © 2011-2022 走看看