博弈论 | 博弈论简谈、常见的博弈定律、巴什博弈

文章目录

  • 博弈论
    • 什么是博弈论?
    • 博弈的前提
    • 博弈的要素
    • 博弈的分类
    • 非合作博弈——有限两人博弈囚徒困境
    • 合作博弈——无限多人博弈囚徒困境
  • 常见的博弈定律
    • 零和博弈
    • 重复博弈
    • 智猪博弈
    • 斗鸡博弈
    • 猎鹿博弈
    • 蜈蚣博弈
    • 酒吧博弈
    • 枪手博弈
    • 警匪博弈
    • 海盗分金
  • 巴什博弈


博弈论

什么是博弈论?

我个人的理解是,通过分析与事情有关的所有元素,在力所能及的范围内寻求最好的结果 ,前半句即博弈,后半句为博弈的意义。

博弈的深层意义在于,所得的最优策略与对手在博弈中的操作没有依存关系。简言之,其理性思想就是 抱最好的希望,做最坏的打算。


博弈的前提

博弈理论假定参与博弈的人必须是理性的,理性的人在博弈过程中会将 自身利益最大化 作为目标。其实这未必不是博弈的局限性,记得前段时间看到的一篇博客很有意思:在一个狼吃羊的AI智障游戏中,狼发现自己吃不到羊,直接选择了「自杀」。然而,狼选择撞石的原因竟是「自杀分数高」!(全文在这里)

出现自杀这一博弈结果的主要原因当然是在训练过程中将分数设置成了权重最大的项,甚至重于生命,但也侧面印证了 局中人的绝对理性


博弈的要素

博弈需要具备的要素通常有五个方面:

局中人

两人博弈 or 多人博弈

策略

  • 有限博弈:每个参与人明确的知道交易次数。不用给自己留后路,此种博弈下信誉没有保障。
  • 无限博弈:每个参与人不知道博弈会在什么时候停止,谁都考虑为自己留后路。此种博弈中妥协会比较多,信誉也比较好。

得失

局中人博弈的得失与两个因素相关:一是其自身所选定的策略,二是其他局中人所选定的策略。每个局中人在博弈结束时的得失可根据所有局中人选定的一组策略函数来判定,这个函数称为 支付函数

次序

  • 动态博弈:局中人的行动有先后顺序,且 后做出选择的人 知道 先做出选择之人 的行动。
  • 静态博弈:局中人同时选择要采取的策略。或者 后做出选择的人 不知道 先做出选择之人 的行动。

均衡

博弈通常都有一个 稳定的结果 ,谓之均衡,或称平衡。


博弈的分类

上面讲到的 动态博弈 与 静态博弈 的划分;有限博弈 与 无限博弈 的划分。都是博弈的分类方法。而经济学中通常将博弈分为:非合作博弈 和 合作博弈。

非合作博弈比合作博弈更简单,理论也更成熟。根据复合特征来划分,非合作博弈可分为四类:

  • 完全信息静态博弈: 对应的均衡概念是 纳什均衡

  • 完全信息动态博弈: 对应的均衡概念是 子博弈精炼纳什均衡

  • 不完全信息静态博弈: 对应的均衡概念是 贝叶斯纳什均衡

  • 不完全信息动态博弈: 对应的均衡概念是 精炼贝叶斯纳什均衡

  • 完全信息博弈:每位参与者都能准确地知道所有其他参与者的行为,以及整个博弈结构;

  • 不完全信息博弈:在这类博弈中,每位参与者对所有其他参与者的信息不够了解,或不了解整个博弈结构。


非合作博弈——有限两人博弈囚徒困境

在上文中提到,博弈的意义在于找到 最好结果,但要明白的是,在 有限博弈 中,这个最好结果是是个人最优解而非团体最优解。也就是 在保障自身利益的前提下,每个人的策略都是对其他人的策略的最优反应。 我们通过 约翰·纳什 创造的 囚徒困境 博弈故事进一步解释:

  • 两个共谋犯罪的人被关入监狱,不能互相沟通情况。如果两个人都不揭发对方,则由于证据不确定,每个人都坐牢五年;
  • 若一人揭发,而另一人沉默,则揭发者因为立功而坐牢一年,沉默者因不合作而判十年;
  • 若互相揭发,则因证据确凿,二者都判刑八年。

虽然对于团体而言最优解是大家都不揭发对方,然而对于囚徒而言:

  • 如果对方沉默,自己揭发的话判一年、沉默的话判一年,揭发更好;
  • 如果同伙揭发,自己揭发的话判八年、沉默的话判十年,揭发更好。

这个结果说明了 纳什平衡 的存在,即在非合作博弈中存在一个均衡解,这个解可使博弈双方的利益都获得保障,这个解并非团队最优解,却是个人最优解。

囚徒困境是一个 非合作博弈 ,原因在于博弈次数只有一次,即有限博弈。有限博弈下,无论之前选择了多少次合作,最后一次局中人必然会选择背叛对方以寻求个人利益最大化,可以理解为:

  • 如果不是最后一次博弈,你背叛人家的话人家一定会报复你,对方也一样,大家都怕背叛对方的话下一次博弈中对方的报复,导致本来可以拿到的团队最优解拿不到了。
  • 但如果是最后一次博弈的话,万一对方背叛你,你就没有报复机会了,那不如我先报复他。

但是,如果是 无限博弈 ,并且是 多人博弈 的话,就会呈现 合作博弈


合作博弈——无限多人博弈囚徒困境

在上一个囚徒困境的基础上,如果抓紧来的是犯罪团伙,并且不告诉它们要审问他们多少次,只告诉他们还是刚才的规矩,不过每个人的坐牢时间是根据每次审讯结果累加。在这种情况下,囚徒们就会意识到:如果持续选择都沉默,大家一起每轮多坐五年牢;如果持续选择彼此揭发,大家每轮多坐八年牢。通过这样的思考,参与者之间合作的动机就非常明显了。

针对 无限多人博弈 ,罗伯特·阿克塞尔罗德制定了类似的实验,最终取得 最好结果(对于变种囚徒困境而言就是坐牢时间最少的囚徒,阿克塞尔罗德的实验中是得分最高的程序) 的程序一般具有三个特点:

  • 善良性:从不主动背叛别人;
  • 可激怒性:对于别人的背叛会进行报复;
  • 宽容性:对于别人的背叛不会无休止的报复。

这种一报还一报的策略不仅优秀而且清晰,其特性通常在几次博弈后就能被清晰地辨识出来(其他程序:这个程序是个狼灭,不好惹,只有主动和他合作才能赢!),而其他复杂的策略并没有得到优秀的结果,对手无法总结与其相处的规律。

罗伯特·阿克塞尔罗德的研究揭示了合作的必要条件:

  1. 博弈要持续进行下去,参与者在一次或几次的博弈中是找不到合作动机的;
  2. 要对对手的行为做出回报,这个回报可以是好的,也可以是坏的,若一个人永远选择合作,那么是不会有太多人与他合作的。

常见的博弈定律

零和博弈

零和博弈是最常见的博弈,零和博弈属于非合作博弈。即参与博弈赛局的双方,在严格遵守博弈规则的前提条件下,若是其中一方可以获得利益,也就意味着另一方的利益必然受损。所以,博弈双方的收益和损失之和永远为零,即博弈双方不存在合作的可能。

与之对应的是 合作双赢,即在某种程度上保证双方达成 利己且不损人 的合作关系。通常是因为在零和博弈中双方都没有很大把握能一定胜出、而失败的成本太大的情况下。


重复博弈

通过两种囚徒困境的探讨,我们发现当博弈仅进行一次,人们往往更加关心它的最终结果;当博弈重复多次,人们将舍弃眼前利益而选取更长远的利益,即如单次博弈结果的利益让步与总体博弈结果的利益。影响重复博弈最终结果的因素,主要是重复博弈所进行的次数以及信息的完整性。

可以将重复博弈总结成三个基础特征:

  1. 在进行重复博弈的过程中并没有结果上的关联,简言之就是 上一个阶段所进行的博弈,并不会改变接下来所要进行的博弈结构。
  2. 在进行重复博弈的每个阶段,所有的参与者都能够看到前面的参与者所做出的决策。
  3. 对于参与重复博弈的参与者而言,他们所获得的收益是在每个阶段所获得收益的加权平均数。

智猪博弈

智猪:有智慧的猪,哼哼~

智猪博弈是纳什理论中的一个经典例子。若一个猪圈里有一头大猪,还有一头小猪,在猪圈的一边有一个投放饲料的猪槽,猪槽旁边安放着一个可以控制猪槽投食量的按钮,假设我们按一下这个投食按钮,猪槽内便会出现 10 个单位的猪食,但是想要按这个按钮,则需要拿出 2 个单位的猪食作为成本。在此种情况下,

  • 假设大猪先走到猪槽边,它跟小猪的进食量之比为 9:1
  • 假设大猪和小猪同时到达猪槽,它们的进食量之比则为 7:3
  • 若是小猪先走到猪槽,那么它们的进食量之比则为 6:4

若是两头猪都非常有智慧,那么小猪便会在猪槽边等待着。

  • 若是小猪去按投食开关,大猪在猪槽边等待,那么大猪小猪的进食量之比为 9:1 ,这样计算得出小猪最后的净收益为吃掉的 1 个单位减去按开关损失的 2 个单位(1-2=-1)单位的猪食。
  • 即当大猪去按下按钮时,大猪小猪的进食量之比为 6:4,扣除按开关所需要的 2 个单位的猪食,大猪最终得到的只有 4 个单位的猪食;
  • 若是小猪和大猪同时去按开关,同时到达猪槽,那么它们所获得猪食的比例为 1:5 (减去按开关的成本)。
  • 假设两头猪不去按开关,那么他们的纯收益都将为 0

而对于博弈中的劣势方小猪来讲,自己去按开关,得到的纯收益必定是 -1,但是如果自己不去按开关,一、大猪按开关,得到的纯收益为 4。二、大猪也不按开关,两只猪的纯收益都是 0 .由此看来,不论大猪是选择主动行动还是等待,小猪都选择等待的收益要高于选择行动所获得的利益,这便是小猪在此次博弈中的占优策略。

通常将小猪的这种方法称为 坐船搭便车 ,暗示人们在博弈中如果占据劣势,且时间损失不会对最终受益造成影响时,等待也是一种明智之举。


斗鸡博弈

Chicken Game 又名懦夫博弈。假定这样一种情景:狭路相逢,

  • 一方后退、另一方前进,称前进一方胜利;
  • 两方都后退,则称平局;
  • 两方都前进,则都失败。

这种博弈思想的价值,私以为在于进一步证明纳什均衡原理。在此博弈中,有两个纳什均衡点:A 进 B 退;A 退 B 进。

纳什均衡点:其他参与者策略保持不变时,当前参与者的选择是最优的,这样就组成了一个混合收益最大化的策略组。


猎鹿博弈

最早出现在卢梭的《论人类不平等的起源和基础》一书中,又名安全博弈、协调博弈。

猎鹿博弈源于一则故事:在一个村庄中有两个猎人,这个村庄主要有两种猎物:鹿和兔子。一个猎人只能捕捉到 4 只兔子,如果两个猎人合作就能捕到 1 只鹿。而站在填饱肚子的角度看,捕到 4 只兔子能够成为 4 天的食物,但是 1 只鹿足以让两个猎人在 10 天内都不用外出捕猎。

由此一来,这两个猎人的行动策略就会产生两个纳什均衡点,即:

  • 两个猎人单独行动,每个人获得4只兔子,并且每人能够吃饱4天;
  • 或者两个猎人建立合作,那么每个人可以吃饱10天。

虽然两个猎人合作可以获得的收益远超单独行动的收益。但是这要求两个猎人在合作过程中,个人能力和付出是相等的。(能力不等的情况下大家都是理性人,当然会要求付出多的收获占比多啦。)


蜈蚣博弈

蜈蚣博弈的提出者是罗森塞尔,它指参加博弈的 AB ,分别有 合作、背叛 两种策略可供选择。规则是 A 先进行选择,再由 B 做出选择,再轮 A 做出选择……

举个例子,如果双方需要博弈十轮:
在这里插入图片描述
网上的资料中没有对收益结果进行解释,所以我一直对最后一次不合作的结果是 (8,11)而不是(9,11)而感到困惑,我个人分析收益是这样计算的:

  • 根据第一轮 A 就不合作双方的收益仍是(1,1)可以推测博弈开始前,双方手里就各有一个筹码。
  • 根据第一轮 A 合作、B 不合作双方的收益是(0,3),会发现 A 手里的一个筹码没了,但 B 多了两个筹码。

因此合作的前提可能是 A、B 都拿出来一个筹码,如果双方选择合作则都收获一个筹码,之前拿出来的筹码也可以收回;如果 A 选择背叛则 B 不需要拿出来筹码,博弈结束;如果 B 选择背叛则 A 失去它拿出来的筹码,B 自己获得两个筹码。

如果一直合作,那么最终总体收益可达最大值 20 ,但根据理性人原则,B 会在最后一轮博弈中选择背叛,以拿到 11 的收益,大于选择合作的 10 收益。那么 A 亦会在 B 选择背叛前先背叛,那么它就能拿到 9 收益,大于 B 背叛时的 8 收益……以此类推,得到的答案是 A 会在刚开始就选择不合作,那么 AB 所获得的最终收益是 1

蜈蚣博弈的悖论

不难看出,在上面的推理过程中,运用的是逆推法。从逻辑推理来看,逆推法是严密的,但结论是不合理的。虽然 A 一开始采取合作性策略有可能获得 0 ,但 1 或者 010 相比实在是很小。直觉告诉我们采取 合作 策略是好的。而从逻辑的角度看,A一开始应选择 不合作 的策略。人们在博弈中的真实行动偏离了运用逆推法关于博弈的理论预测,造成二者间的矛盾和不一致。


酒吧博弈

假设有 100 个人都喜欢去酒吧消遣娱乐,若我们设定酒吧的座位数是 60,那么想要去酒吧的人便会有两种决策:一种是不去,待在家中,另外一种是去。假设所有的人都去酒吧,那么去酒吧的人就会感到不舒服,而这时他们会觉得待在家中要比去酒吧更好。那么,这 100 个喜欢去酒吧的人最终将会做何选择呢?

其实这些喜欢去酒吧的人,往往会受上一次酒吧人数的影响,进而产生一些人数上的浮动,久而久之便会形成一种持续性波动的情况。这是由切斯特·艾伦·阿瑟博士提出的,他的理论如下:

  • 假设每个想要去酒吧的人都是理性的,那么酒吧每天接待的人数几乎不会有过大的浮动。就会产生 神奇的 60% 客满率定理 ,即当人们选择去酒吧时,最初的观察结果并未找到任何规律,但是通过长时间的观察发现,每次去酒吧的人数和不去酒吧的人数之比接近 60:40
  • 但是人并不总能保持理性,当人们在第一次去酒吧时,若发现酒吧人数非常多,那么这种现象会成为他们下次选择的一个参考,他们会认为酒吧人数太多、十分拥挤、喧闹,大部分下次就不来了,但是少数人可能会选择下次依然去酒吧,这时他们发现酒吧的人数并不多,然后便会在下一次叫上自己的朋友一起去酒吧,由此一来循环便正式开始了。

从心理学的角度来看,最初去酒吧的那些人可能互相不熟悉,但是由于经常去酒吧而且能够遇见对方,久而久之便会由陌生人变成朋友,那么在这种情况下,便会由零散的个体变成一个大的群体,而这个整体中又会分支出小团体,而且这些小团体中的人,有一部分会占据主导地位,另一部分人会处在服从地位。这就意味着团体中的每个人的决策都会受到他人的影响。


枪手博弈

枪手博弈是指,枪手甲乙丙三人相互怨恨,以决斗的形式进行一场博弈。其中,甲的枪法最准,命中率 80%。乙的枪法在甲之下,命中率 60%。丙的枪法最差,命中率 40%。假设在三人都了解彼此实力并能理性判断的情况下,会出现以下两种情况:

  1. 三人同时开枪,谁活下来的可能最大?
  2. 若由丙开第一枪,随后轮流开枪,他会如何选择?

第一种情况:

  1. 第一轮:
  • 甲:最佳的策略是先对准乙,因为乙的枪法比丙好。
  • 乙:最佳的策略是先对准甲,因为三人中甲的枪法最准,这样,在乙丙两人中,乙活下来的概率更大。
  • 丙:同样也会先解决枪法最准的甲,干掉甲后再考虑如何应对乙。

现在我们可以分别计算三人活下来的概率:

  • 甲活:即乙和丙都未命中。两人都射偏的概率为:40%×60%,所以甲活下来的概率为 24%
  • 乙活:即甲射偏。甲有 20% 的未命中率,就相当于乙的存活率为 20%
  • 丙活:根据上面的分析,在这一种情况下,没有任何人对准丙,因此丙的存活概率为 100%

由此我们可以看到,在这一轮的决斗中,丙枪法最差但活下来的概率却最大。而甲和乙的枪法都远大于丙,存活率却都比丙低。

  1. 第二轮:

第一轮过后,有三种情况:

  • 若甲乙中有一方打偏,那么丙会面对甲或乙;
  • 若都打偏,那丙将同时面对甲乙两人;
  • 甲乙都命中,甲乙皆死。

现在我们可以分别计算三人活下来的概率:

  • 如果丙只面对甲或乙,那丙的存活率最低。
  • 如果同时面对甲乙两人,则返回第一轮的场景。
  • 如果甲乙皆死,那么无疑丙最终存活。

第二种情况:

由丙先开第一枪,那么可能如下:

  • 丙射中甲:乙与丙对决,且只能由乙先开枪,丙会处于不利位置。
  • 丙射中乙:同上,甲的命中率最高,丙的处境会更糟。
  • 丙都未射中的话:甲乙都不会选择先射击丙,而是会在甲乙双方之间一决胜负,直至其中一人死亡,而这时就会又轮到丙。可以这样说,只要丙谁都不打中,在接下来的对决中他就处于相对而言最有利的位置。

我们会发现,优势最小的丙,反而可能是不是最先死掉的,因此,在多方非合作博弈中,优势最小的往往可以在暂时安全的环境下,抓紧机会提升自己。当然,如果不能在暂时安全的环境下提升能力的话,当面对双人非合作博弈时,难免处于失败者的位置。简言之,实力最差的并不一定是输的最快的,但终究是需要提升自我的,否则即使能安全一时、但仍然难免落入败局。


警匪博弈

在某个小镇上只有一名警察,整个小镇的治安全部由他负责。此时,我们假设这个小镇上的一头有一家银行,存了 2 万元;而小镇的另一头有一个酒馆,存了 1 万元。若这个小镇上还有一名小偷,当这个小镇上的警察在小镇的一头巡视时,小偷只能去小镇的另一头进行偷盗。

假想一下,当小镇的警察正好在小偷采取行动的地方巡视,便能不费吹灰之力地抓住小偷;若是小镇的警察的巡视方向恰好与小偷采取偷盗行为的方向相反,那么小偷便能在不被警察抓到的情况下成功偷盗。那么如何才能将小镇的损失降到最低呢?

警察最好的做法是利用抽签的方式决定去小镇的银行还是酒店。由于小镇银行中所需保护的财产是酒馆的两倍,因此用 1、2 号两个签表示小镇的银行,用 3 号签表示酒馆,这样一来,警察去银行巡视的机会将达到 2/3,而去酒馆巡视的机会将是 1/3

在小镇警察的此种策略下,小偷的占优策略则要与警察相反,同样采用抽签的方式,与警察不同的是小偷用 1、2 号签表示去酒馆行动,而用 3 号签表示去银行,由此一来,小偷去酒馆行动的概率是 2/3,而去银行的概率仅有 1/3

如果双方都选择最佳占优策略的话,警察和小偷的成功率是相等的(过程有些繁琐,可选择跳过),分析如下:

如果警察和小偷都是理性人的话,警察可以猜到小偷的概率,小偷也可以猜到警察的概率。

  • 双方如果单纯都是第一层的话,警察成功概率 2/3*1/3+1/3*2/3=4/9,小偷成功概率 1-4/9=5/9
  • 但是如果警察在第二层(警察反概率行动),小偷在第一层,警察成功概率 1/3*1/3+2/3*2/3=5/9,小偷成功概率 1-5/9=4/9
  • 警察在第一层,小偷在第二层,那么和上一个情况一样,警察成功概率 5/9,小偷成功概率 4/9
  • 双方都是第二层(都以相反概率行动),警察成功概率 4/9,小偷 5/9

最后相加综合期望,双方成功概率都为 1/2。(这波啊,这波叠加就是千层饼~)

而如果警察和小偷扔硬币去决定守、偷哪出地点。这样就模糊了自己策略的倾向性,结果就具有偶然性。博弈取胜的要点在于运用其中的偶然性,针对对方是否发现你的某些策略性行为做出及时应对,进而保证自己成功的概率。总结来讲还是说明信息在博弈中的重要性。


海盗分金

有五个海盗(记为1、2、3、4、5号)掠得 10 枚金币,决定以抽签的方式依次提出分金方案,并由五人共同表决。要想通过方案,必须有超半数的人同意才可以,否则这个人将会被扔进大海。

与其从前往后一个一个地想每个人会怎样选择,不如先把问题简单化,若只剩下最后两人的话,他们会怎么做呢?

  • 倒推来看,若1、2、3号都被投入海中,那么 5 号必定反对 4 号把一百枚金币全部收入囊中。因此 4 号只有同意 3 号的方案才有可能保命。
  • 3号猜到这一点,就会采取 (100、0、0) 的分金方案,因为他清楚地知道即便4号一枚金币也分不到,也仍然会同意他的方案。
  • 2 号猜到 3 号的策略,就会采取 (98、0、1、1) 的方案,因为 2 号只要稍微照顾到 4、5 号的利益,4、5 号就会向他投赞成票,而不希望 2 号出局让 3 号分配。
  • 1 号同样猜到 2 号的意图,就会采取 (97、0、1、2、0) 或者 (97、0、1、0、2) 的方案。对于 1 号来说,只要放弃 2 号,再分给 3 号一枚金币,给 4 号或 5 号两枚金币。

巴什博弈

巴什博弈: 一堆物品有 n 个,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取 m 个。最后取光者得胜。

巴什博弈是一种 动态、完全信息博弈 ,即局中人的行动有先后顺序,且后做出选择的人知道先做出选择之人的行动。

如果一方拿取时,还剩 m+1 个,那便是 必败局,因为此时不论你拿走多少个,下次对方一定可以全部拿完。

其他情况则是 必胜局 。因为如果还剩 m+1+k 个(0 < k <= m),我只要拿走 k 个,那么对方就面临 m+1 个。可能有人在想 0 > k > -m 怎么办?没什么多说的,还是必胜局,我直接拿走剩下的全部。

扩展:如果 n = x(m+1) ,先拿的依然面对必败局,先拿的拿 p 个,后拿的拿 m+1-p 个,先拿的第二轮拿的时候,还剩 x-1(m+1) ,重复 x-2 轮,先拿的又面对 m+1 了。

反之,如果 n=x(m+1)+k ,先拿的面对必胜局,先拿的拿走 k 个,则后拿的面对 x(m+1) ,重复上一段的过程。

因此,可以得到代码:

#include<iostream>
using namespace std;
int main()
{int n, m;cin >> n >> m;if (n % (m + 1) == 0)cout << "second win" << endl;else cout << "first win" << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL命令(二)| 表的增删查改、聚合函数(复合函数)、联合查询

文章目录新增 (Create)全列插入指定列插入查询 (Retrieve)全列查询指定列查询条件查询关系元素运算符模糊查询分页查询去重&#xff1a;DISTINCT别名&#xff1a;AS升序 or 降序更新 (Update)删除 (Delete)分组&#xff08;GROUP BY&#xff09;联合查询内连接&#xff08;inne…

MySQL | 数据库的六种约束、表的关系、三大范式

文章目录数据库约束NOT NULL&#xff08;非空约束&#xff09;UNIQUE&#xff08;唯一约束&#xff09;DEFAULT&#xff08;缺省约束&#xff09;PRIMARY KEY&#xff08;主键约束&#xff09;AUTO_INCREMENT 自增FOREIGN KEY&#xff08;外键约束&#xff09;CHECK&#xff08…

哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

文章目录哈希哈希&#xff08;散列&#xff09;函数常见的哈希函数字符串哈希函数哈希冲突闭散列&#xff08;开放地址法&#xff09;开散列&#xff08;链地址法/拉链法&#xff09;负载因子以及增容对于闭散列对于开散列结构具体实现哈希表&#xff08;闭散列&#xff09;创建…

C++ 泛型编程(一):模板基础:函数模板、类模板、模板推演成函数的机制、模板实例化、模板匹配规则

文章目录泛型编程函数模板函数模板实例化隐式实例化显式实例化函数模板的匹配规则类模板类模板的实例化泛型编程 泛型编程旨在削减重复工作&#xff0c;如&#xff1a; 将一个函数多次重载不如将他写成泛型。 void Swap(int& left, int& right) {int temp left;lef…

你真的了解静态变量、常量的存储位置吗?

文章目录引言C对内存的划分如何落实在Linux上自由存储区和堆之间的问题栈常量区静态存储区静态局部变量静态局部变量、静态全局变量、全局变量的异同macOS系统的测试结果总结引言 在动态内存的博客中&#xff0c;我提到&#xff1a; 在Linux 内存管理的博客中&#xff0c;我提…

C++ 泛型编程(二):非类型模板参数,模板特化,模板的分离编译

文章目录非类型模板参数函数模板的特化类模板的特化全特化偏特化部分参数特化参数修饰特化模板分离编译解决方法非类型模板参数 模板的参数分为两种&#xff1a; 类型参数&#xff1a; 则是我们通常使用的方式&#xff0c;就是在模板的参数列表中在 class 后面加上参数的类型…

数据结构 | B树、B+树、B*树

文章目录搜索结构B树B树的插入B树的遍历B树的性能B树B树的插入B树的遍历B*树B*树的插入总结搜索结构 如果我们有大量的数据需要永久存储&#xff0c;就需要存储到硬盘之中。但是硬盘的访问速度远远小于内存&#xff0c;并且由于数据量过大&#xff0c;无法一次性加载到内存中。…

MySQL 索引 :哈希索引、B+树索引、全文索引

文章目录索引引言常见的索引哈希索引自适应哈希索引B树索引聚集索引非聚集索引使用方法联合索引最左前缀匹配规则覆盖索引全文索引使用方法索引 引言 为什么需要索引&#xff1f; 倘若不使用索引&#xff0c;查找数据时&#xff0c;MySQL必须遍历整个表。而表越大&#xff0c;…

服装店怎么引流和吸引顾客 服装店铺收银系统来配合

实体店的同城引流和经营是实体经济的一个重要的一环&#xff0c;今天我们来分享服装行业的实体店铺怎么引流和吸引、留住顾客&#xff0c;并实现复购。大家点个收藏&#xff0c;不然划走就再也找不到了&#xff0c;另外可以点个关注&#xff0c;下次有新的更好的招&#xff0c;…

MySQL 锁的相关知识 | lock与latch、锁的类型、简谈MVCC、锁算法、死锁、锁升级

文章目录lock与latch锁的类型MVCC一致性非锁定读&#xff08;快照读&#xff09;一致性锁定读&#xff08;当前读&#xff09;锁算法死锁锁升级lock与latch 在了解数据库锁之前&#xff0c;首先就要区分开 lock 和 latch。在数据库中&#xff0c;lock 和 latch 虽然都是锁&…

MySQL 存储引擎 | MyISAM 与 InnoDB

文章目录概念innodb引擎的4大特性索引结构InnoDBMyISAM区别表级锁和行级锁概念 MyISAM 是 MySQL 的默认数据库引擎&#xff08;5.5版之前&#xff09;&#xff0c;但因为不支持事务处理而被 InnoDB 替代。 然而事物都是有两面性的&#xff0c;InnoDB 支持事务处理也会带来一些…

MySQL 事务 | ACID、四种隔离级别、并发带来的隔离问题、事务的使用与实现

文章目录事务ACID并发带来的隔离问题幻读&#xff08;虚读&#xff09;不可重复读脏读丢失更新隔离级别Read Uncommitted (读未提交)Read Committed (读已提交)Repeatable Read (可重复读)Serializable (可串行化)事务的使用事务的实现Redoundo事务 事务指逻辑上的一组操作。 …

MySQL 备份与主从复制

文章目录备份主从复制主从复制的作用备份 根据备份方法的不同&#xff0c;备份可划分为以下几种类型&#xff1a; 热备(Hot Backup) &#xff1a; 热备指的是在数据库运行的时候直接备份&#xff0c;并且对正在运行的数据库毫无影响&#xff0c;这种方法在 MySQL 官方手册中又…

C++ 流的操作 | 初识IO类、文件流、string流的使用

文章目录前言IO头文件iostreamfstreamsstream流的使用不能拷贝或对 IO对象 赋值条件状态与 iostate 类型输出缓冲区文件流fstream类型文件模式文件光标函数tellg() / tellp()seekg() / seekp()向文件存储内容/读取文件内容string流istringstreamostringstream前言 我们在使用 …

C++ 右值引用 | 左值、右值、move、移动语义、引用限定符

文章目录C11为什么引入右值&#xff1f;区分左值引用、右值引用move移动语义移动构造函数移动赋值运算符合成的移动操作小结引用限定符规定this是左值or右值引用限定符与重载C11为什么引入右值&#xff1f; C11引入了一个扩展内存的方法——移动而非拷贝&#xff0c;移动较之拷…

且谈关于最近软件测试的面试

前段时间有新的产品需要招人&#xff0c;安排和参加了好几次面试&#xff0c;下面就谈谈具体的面试问题&#xff0c;在面试他人的同时也面试自己。 面试问题是参与面试同事各自设计的&#xff0c;我也不清楚其他同事的题目&#xff0c;就谈谈自己设计的其中2道题。 过去面试总是…

C++ 多态 | 虚函数、抽象类、虚函数表

文章目录多态虚函数重写重定义&#xff08;参数不同&#xff09;协变&#xff08;返回值不同&#xff09;析构函数重写&#xff08;函数名不同&#xff09;final和override重载、重写、重定义抽象类多态的原理虚函数常见问题解析虚函数表多态 一种事物&#xff0c;多种形态。换…

C++ 运算符重载(一) | 输入/输出,相等/不等,复合赋值,下标,自增/自减,成员访问运算符

文章目录输出运算符<<输入运算符>>相等/不等运算符复合赋值运算符下标运算符自增/自减运算符成员访问运算符输出运算符<< 通常情况下&#xff0c;输出运算符的第一个形参是一个 非常量ostream对象的引用 。之所以 ostream 是非常量是因为向流写入内容会改变…

C++ 重载函数调用运算符 | 再探lambda,函数对象,可调用对象

文章目录重载函数调用运算符lambdalambda等价于函数对象lambda等价于类标准库函数对象可调用对象与function可调用对象function函数重载与function重载函数调用运算符 函数调用运算符必须是成员函数。 一个类可以定义多个不同版本的调用运算符&#xff0c;互相之间应该在参数数…

C++ 运算符重载(二) | 类型转换运算符,二义性问题

文章目录类型转换运算符概念避免过度使用类型转换函数解决上述问题的方法转换为 bool显式的类型转换运算符类型转换二义性重载函数与类型转换结合导致的二义性重载运算符与类型转换结合导致的二义性类型转换运算符 概念 类型转换运算符&#xff08;conversion operator&#…