分布式一致性算法的重要原理:鸽巢原理

2023-11-01

分布式BASE理论:数据一致性模型有哪些?中,我们谈到了BASE理论的最终一致性,以及简单介绍了数据一致性模型,但我们都是站在一个使用者的角度,在发出数据更新的请求给分布式系统之后,观察返回的数据是否更新。为了更好使用、理解分布式系统,不妨换个视角,观察在服务端是怎么实现一致性的

因为分布式算法还是比较难的,笔者在这篇文章先对分布式一致性算法的基石——鸽巢原理进行介绍:

  • 鸽巢原理
  • 鸽巢原理在生活中的应用案例
  • 鸽巢原理在计算机领域的应用案例

(若文章有不正之处,或难以理解的地方,请多多谅解,欢迎指正)

鸽巢定理

鸽巢定理,又名抽屉算法,是组合数学里一个重要的原理。

其具体算法是:

  • 第一鸽巢原理:如果有n个笼子和n+1只鸽子,所有的鸽子都被关进笼子里,那么至少有一个笼子有至少2只鸽子。

    证明(反证法):如果每个笼子里只能放一只鸽子,有n个笼子至多也只能放n只鸽子,而不是题设的n+k(k≥1)只鸽子,故与题设不符。
    在这里插入图片描述

  • 第二鸽巢原理:把m×n+1只鸽子放到n个笼子,所有的鸽子都被关进笼子里,那个至少有一个笼子有m+1只鸽子。

    证明(反证法):如果每个笼子里只能放m只鸽子,有n个笼子至多也只能放m×n只鸽子,而不是题设的m×n+1只鸽子,故与题设不符。

  • 第三无穷项集鸽巢原理:把无穷多只鸽子放入笼子,则至少有一个笼子里有无穷只鸽子。

这鸽巢定理看着挺好理解的,那么来试做两道题。

鸽巢原理在生活中的应用案例

先来一道生活题热热身。

盒子里有3只黑袜子、2只蓝袜子,你需要拿一对同色的出来,假设只能拿一次,最少需要拿出几只?

其实只要一次拿三只袜子就行了。因为袜子的颜色只有两种(笼子只有2个),一次性拿三只袜子(鸽子有3只),所以至少有一只袜子是同色的。

热身之后,我们再来一道伦理题。

在不丹,某女性有4位丈夫,她一共生了2子3女,那么在什么情况下可以判断,除了4位丈夫,这位女性没有替别的男人生孩子。

笔者列出一种情况:这位女性的孩子中,至少有2位子女来自同一位父亲,且这位女性与每位丈夫都有孩子。那么这4位丈夫还可以稍微松口气,最起码这位女性没给其他男人生孩子。

(这道是开放题,大家可以在评论区说出其他的情况。)

在这里插入图片描述

鸽巢原理在计算机领域的应用案例

笔者是后台开发工程师(Java),最近在复习HashMap,发现HashMap的底层结构也运用了鸽巢原理。

我们知道HashMap(JDK1.8)的底层结构是数组+链表/红黑树,如下图所示:
在这里插入图片描述
为什么需要数组+链表/红黑树的结构呢?

因为在HashMap实际上也是哈希表,通过哈希表实现数据的分散操作方式为:在插入新值(key, value)的时候,需要将key传入哈希算法中,得到在哈希表存储位置的下标index,最后再将value放入哈希表索引为index的位置。

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

//AbstractMap
public int hashCode() {
        int h = 0;
        Iterator<Entry<K,V>> i = entrySet().iterator();
        while (i.hasNext())
            h += i.next().hashCode();
        return h;
    }

所以在插入数据时,是有一定概率发生哈希冲突的,因为Keys的数目总会比哈希表的索引多,总会有两个key在经过哈希算法后,得到相同的index,所以不管是多么高明的算法都不可能解决这个问题。HashMap采用了数组+链表/红黑树的方式,即使发生了哈希冲突,只需将新值放在对应哈希表索引的链表上即可。

结语

看到这里的读者们,相信你们对鸽巢原理也有了一定的理解了,接下来会对鸽巢原理的应用之一——Quorum算法进行介绍。

笔者其实是小菜鸡一只,也没学过组合数学,只是在了解分布式系统的过程中学到鸽巢原理,所以才斗胆写出自己的理解。本文仅代表个人理解,如果若文章有不正之处,或难以理解的地方,请多多谅解,欢迎指正。

如果本文对你的学习有帮助,请给一个赞吧,这会是我最大的动力~

参考资料:

鸽巢原理

Zookeeper(一)从抽屉算法到Quorum (NRW)算法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式一致性算法的重要原理:鸽巢原理 的相关文章

随机推荐

  • [Unity]VRTK V4的导入和使用

    1 新建3D工程 2 导入SteamVR插件 2 1下载最新插件 https github com ValveSoftware steamvr unity pluginhttps github com ValveSoftware steam
  • 23种设计模式之状态模式和策略模式的区别

    文章目录 概述 状态模式 策略模式 区别 总结 概述 在行为类设计模式中 状态模式和策略模式是亲兄弟 两者非常相似 我们先看看两者的通用类图 把两者放在一起比较一下 状态模式 状态模式 状态模式的类图与策略模式一模一样 区别在于它们的意图
  • MIPI简介(二)——物理层D-PHY

    一 物理层 物理层规范了传输介质 电气特性 IO电路 和同步机制 通俗地说 就是指定在MIPI协议的最底层物理层 发送端Tx如何拿到上层编码好的数据 转化成怎样的电信号 并通过多少根 组通道以何种形式发送给接收端Rx等等 CSI和DSI的物
  • C++ 函数参数何时用引用何时用指针

    什么时候使用引用 什么时候使用指针 什么时候按值传递呢 对于使用传递的值而不做修改的函数 如果数据量很小 如内置数据类型或小型结构 则按值传递 如果数据对象是数组 则使用指针 并将指针申明为指向const的指针 如void fun cons
  • nlohmann 最优秀的C++序列化工具库 详细入门教程(转)

    C 使用nlohmann json教程 使用指南 1 include include
  • 【react】createRef

    createRef 1 React createRef调用后可以返回一个容器 该容器可以存储被ref所标识的节点 2 该容器是 专人专用 的 因为后放进去的节点会把前面的节点覆盖掉 3 除非再调用一次createRef
  • k8s笔记8--快速部署k8s集群 v1.19.4--calico网络

    k8s笔记8 快速部署k8s集群 v1 19 4 calico网络 1 介绍 2 搭建集群 4 注意事项 3 说明 1 介绍 k8s 部署的时候可以选择多种cni插件 每种插件都有其对应的特殊 最经典的的莫过于 Flannel 和 Cali
  • signature=571b6507b6fff101f4546f0b0a3f3860,Contribution of fishery discards to the diet of the Black...

    Abraham ER Pierre JP Middleton DAJ Cleal J Walker NA Waugh SM 2009 Effectiveness of fish waste management strategies in
  • 真诚不等于坦诚

    有趣的问题及答案 https www zhihu com question 343898658 这个问题背后可以影射很多社会现象 人家没问的 我自认为可能是减分项的 暂时就先不说 人家问了的 我可以不完全说清楚 说一半留一半 不对 这件事情
  • url重定向

    不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方 如果后端采用了前端传进来的 可能是用户传参 或者之前预埋在前端页面的url地址 参数作为了跳转的目的地 而又没有做判断的话 就可能发生 跳错对象 的问题 u
  • 大数据基础之Hbase——Hbase的shell基本操作

    目录 一 简介 二 Hbase重要概念 Hbase的表结构 表Table 命名空间namespace 行键Row Key 区域region 列簇column family 修饰符 列限定符 三 Hbase shell基本操作 1 创建简单表
  • linux的apache安装在哪个目录,在linux系统下apache的默认安装路径怎么看

    在linux系统下apache的默认安装路径怎么看 发布时间 2020 11 06 10 38 18 来源 亿速云 阅读 127 作者 小新 这篇文章将为大家详细讲解有关在linux系统下apache的默认安装路径怎么看 小编觉得挺实用的
  • Docker教程(三) - Docker 网络(上)- 桥接 Bridge

    本文章翻译自Docker的官方教程 有兴趣的同学可以上Docker官网进行play with docker学习 Docker的安装教程请参考这里 未定义 本文翻译自Docker官方教程Doing More With Docker Image
  • 【Unity项目实战】手把手教学:飞翔的小鸟(5)背景滚动

    承接上一篇 Unity项目实战 手把手教学 飞翔的小鸟 4 文本添加 我们已经使得主角小鸟接触到地面后跳转到Game Over状态 接下来我们将继续往下 讲解得分机制 一 重新进入游戏 根据上篇最后的描述 我们小鸟掉到草地就会立马被判断为游
  • 项目中Swagger2、lombok(小辣椒)、以及短信API的调用 简单介绍

    一 使用Swagger2实时生成接口文档 分布式系统使用 Swagger 是一个规范和完整的框架 用于生成 描述 调用和可视化 RESTful 风格的 Web 服务 总体目标是使客户端和文件系统作为服务器以同样的速度来更新 文件的方法 参数
  • 2021-05-27

    k8s 根据CPU利用率实现pod的弹性伸缩 一 概念 1 弹性伸缩的作用 让集群的配置可以根据计算需求 自动增加或者自动减少 在服务器访问量突然增多 算力吃紧的情况下增加节点配置数量 直到访问量下降 计算后减少节点数 保证业务平稳健康运行
  • 使用BP神经网络预测锂电池健康状态(附Matlab源码)

    使用BP神经网络预测锂电池健康状态 附Matlab源码 随着电动汽车的普及 电池技术得到了广泛的关注 其中 锂电池因其能量密度高 环保等优点被广泛应用于电动汽车和储能系统中 然而 锂电池的寿命问题一直是制约其应用和发展的重要因素之一 针对这
  • jQuery+Ajax+js请求json格式数据并渲染到html页面

    1 先给json格式的数据 id 1 name stan id 2 name jack id 3 name lucy id 4 name mary id 5 name jerry id 6 name tom 2 通过访问html页面 获取并
  • 虚幻4学习笔记(3)地形工具和植被

    地形工具和植被 地貌编辑器 生成斜坡 雕刻工具 编辑样条曲线 光照进行构建解决方法 导入灰度图 植被工具使用 植被碰撞 B站UP谌嘉诚课程 https www bilibili com video BV164411Y732 地貌编辑器 生成
  • 分布式一致性算法的重要原理:鸽巢原理

    在分布式BASE理论 数据一致性模型有哪些 中 我们谈到了BASE理论的最终一致性 以及简单介绍了数据一致性模型 但我们都是站在一个使用者的角度 在发出数据更新的请求给分布式系统之后 观察返回的数据是否更新 为了更好使用 理解分布式系统 不