首页
学习
活动
专区
圈层
工具
发布

有趣的算法(六) ——Find-Union算法

有趣的算法(六)——Find-Union算法 (原创内容,转载请注明来源,谢谢) 一、场景 Find-Union解决一类问题: 1、武林帮派 假设有n个武林帮派,当两个帮派是合作的时候,人员不会互相打架...最终,经过一番连接,需要获取集合的数目(初始是n个,随着连接集合变少),以及在同一个集合中的元素。 二、分析 解决问题的关键,在于连接、判断是否已连接,这也就是find、union两个词的精髓。...三、解决方案 1、方法一:quick-find 第一个想法,id[i]存放的是第i个元素所属的组,初始id[i]=i。...3、方法三:加权的quick-union 为了解决上述问题,进行了一个改进,即在连接的时候,将树节点较少的那颗,连接到节点较多的那颗。这样可以保证大多数的节点的深度不要增加。...要这样做,需要加一个数组,保存每个节点的子节点数量,初始状态都是1。当连接的时候,子节点数量少的一个连接到多的那个(相同时随意),并把多的那个的子节点数量再加上少的那个子节点。

1.1K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    有趣的算法(七) ——快速排序改进算法

    有趣的算法(七) ——快速排序改进算法 (原创内容,转载请注明来源,谢谢) 一、概述 快速排序,被认为是最好的排序算法之一。...3)当一个数组的元素只有两个的时候,则直接比较这两个元素的大小,并返回比较结果;当数组元素只有一个,则直接返回这个数组。 快速排序的速度很快,只需要O(nlogn),而且可以不需要额外的空间。...二、问题分析 快速排序在众多排序算法中,属于非常优秀的算法,不过这几十年来,还是有许多人对其进行贡献,提供了一些很好的改进。...因此,对于切分元素,不能选的太随意,需要改进。 2)快速排序是一个递归的排序算法。 在数组元素很少的时候,如果也用快速排序,则要不断的递归与函数调用,效率较低。...而有一些简单的算法,对于数组数量较少的时候,不需要递归,而且方便。 因此,对于数组元素较少的情况,可以采用其他算法。 3)元素值一样的问题。

    1.5K40

    RSA 背后的算法

    在专栏中的第 36 讲的选修课堂中,我介绍了 Diffie–Hellman 密钥交换这一算法,它可以说是质数在加密技术中的一个应用,并且是通过其中的 “模幂运算” 来实现的。...今天,我来介绍质数的另一个应用,RSA 背后的算法。...我在互联网上搜索了一下,我发现基本没有能把它背后的实现原理用浅显的中文叙述讲清楚的,但我还是想试一试,看看能不能尽可能避开那些难懂的术语,用尽量形象和易于理解的方式,把 RSA 背后的原理讲清楚。...你看,这是不是又一个需要 “正向计算简单,逆向求解困难” 特性的问题?...纵观整个 RSA 的原理,其中涉及到了两个和质数相关的 “正向计算简单,逆向求解困难” 的特性: 一个是前面介绍的模幂等式逆向求底数; 另一个就是这里介绍的超大质数因子的因式分解。

    80040

    发现一个有趣的开源项目:通过动画教你学习算法

    学算法学累了吧?被算法虐的不轻吧?反正,我已经被虐的遍体鳞伤。所以今天呢,我给大家介绍一个开源项目,这个开源项目给我们提供了一个通过视图动画学习算法的环境。下面来一览究竟。...到目前为止,这个项目已经提供了好多种算法的动图了,包括:暴力、动态规划、回溯、分治等多种类型算法。...首先要进入这个开源项目的演示地址:https://algorithm-visualizer.org/ 进入之后是这样的: 我对这个功能区画了绿色小圈圈, 1、最左边部分就是各种算法的分类了。...2、中间就是算法的演示了,不过我这里没有给你们看动图,想看效果如何的,自行去看看。 3、右上面可以对动画进行暂停,调整动画的演示速度等等。 4、最下面那个就是算法的执行过程了,记录了算法的选择路径。...如果你想的话,自己也可以去贡献一些算法的动画哦,这样,你也是这个开源项目的贡献者之一了。 一直被算法困扰,有兴趣的小伙伴,可以去观摩一波哦。

    66020

    一个有趣的BUG

    最近在协助团队完成ES数据的切换(业务数据迁移),过程中遇到一个比较好玩的BUG ,和大家分享并作为经验记录。...在最后的数据验证环节,发现有一个ID对应不上了,如下图所示,通过对比工具,发现一个长度较大的ID发生了偏移,其他的数据都没有问题。这是为什么呢?一头雾水。...千年虫问题:这个问题相信很多人IT人都听说过,简单来说,就是由于前期计算机的存储资源较为昂,在表达时间时,为了节约空间,有位科学家提出了一个方案,把1960年8月11日,简写成600811。...但这样会有一个问题,就是当时被缩写掉的是19XX年中19,如果时间来到2000年,程序就无法准确表达时间。比如:2000年1月1日,简写成六位数是000101。计算机就会怀疑人生,怎么时间倒流了呢?...有时间和精力,还是需要更深层次的去了解缺陷背后的逻辑和根因是什么,触类旁通。以避免更多类似的问题发生。

    69140

    一个有趣的问题

    前言   这个问题来自于看到的一个面试题,其中的解题过程比较有趣,有很多值得借鉴的地方,这里写出来作为记录。 题目 假设一栋100层的楼,两个完全一样的鸡蛋。...非完美的5分解决方案:     解决方案一的灵感来自于已知两数的和,求两数的平方和的最小值。即假设两数和为25,求两数的平方和的最小值和最大值。   ...这个解法比较简单,直接设一个数位x,则另一个数为(25-x),两数的平方和为 x2 + (x-25)2 = 2x2 - 50x + 625 = 2(x - 12.5)2 + n 可以只当x为12.5的时候取得最小值...丢第一个鸡蛋,直到第一个鸡蛋碎掉。然后从碎之前的一次丢位子的后面一层开始一直往上一层丢,直到找到刚好第二个蛋碎的位置。此时最坏情况下需要试18次。   ...假设第一次丢蛋没碎,那么第二次丢肯定要在x层之上丢,假设第二次丢的层数比第一次丢的高z层,同第一次一样假设第二次丢鸡蛋碎了, 那么最坏的情况下找到N需要的次数应该是: 1 + 1 + z - 1 =x;

    1K130

    有趣的算法题~单调栈

    这是无量测试之道的第195篇原创 在刷 LeetCode 的时候,每次遇到精彩的题解都会感叹数据结构的伟大,通过巧妙地设计,能够非常清晰明了的解决问题。...)的数的位置的时候就可以用到单调栈。...做题 思路 可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。正向遍历温度列表。...因为在这种情况下,即将进栈的 i 对应的 T[i] 一定是 T[prevIndex]右边第一个比它大的元素,试想如果 prevIndex 和 i 有比它大的元素,假设下标为 j,那么prevIndex...以下用一个具体的例子帮助读者理解单调栈。

    60110

    发现一个有趣的开源项目:通过动画教你学习算法

    学算法学累了吧?被算法虐的不轻吧?反正,我已经被虐的遍体鳞伤。所以今天呢,我给大家介绍一个开源项目,这个开源项目给我们提供了一个通过视图动画学习算法的环境。下面来一览究竟。...先上一张可视化学习算法的图片吧,让你们感受下 ? 这个开源项目已经斩获了很多 star了,如下: ?...首先要进入这个开源项目的演示地址:https://algorithm-visualizer.org/ 进入之后是这样的: ? 我对这个功能区画了绿色小圈圈, 1、最左边部分就是各种算法的分类了。...2、中间就是算法的演示了,不过我这里没有给你们看动图,想看效果如何的,自行去看看。 3、右上面可以对动画进行暂停,调整动画的演示速度等等。 4、最下面那个就是算法的执行过程了,记录了算法的选择路径。...如果你想的话,自己也可以去贡献一些算法的动画哦,这样,你也是这个开源项目的贡献者之一了。 一直被算法困扰,有兴趣的小伙伴,可以去观摩一波哦。

    74830

    有趣的算法(八) ——红黑树插入算法

    有趣的算法(八)——红黑树插入算法 (原创内容,转载请注明来源,谢谢) 一、概述 红黑树是一种二叉平衡查找树。二叉查找树是二叉树,且树的根节点会比左节点大、比右节点小。...由于其左子节点都比根节点小,右子节点都比根节点大,要查找一个数是否在其中,或者在某个位置,会变得很容易。...可能出现某些值存在于树的非常低层次的节点,导致最终效率很低。 红黑树与其不同的地方在于,其是平衡的,通过颜色来进行平衡。 现有以下规定: 1)只有左节点可以是红色。...二、红黑树详解 在红黑树中插入节点,也是通过查找的方式,在找不到节点的地方,进行插入数据。如果找到某个节点,则修改节点的值。 新插入的节点,一开始默认都是红色。...2)将a的左节点指向r。 3)给a赋予r的颜色,给r赋予红色(相当于新插入节点)。 2、右旋 右旋是当节点的左子节点是红色,且左子节点的左子节点还是红色时,需要调整的情况。

    1.8K50

    有趣的数据可视化,进来看看有没有你想要的?

    这几天我在阅读《谁说菜鸟不会数据分析(工具篇)》一书,发现里边有很多知识是我自己想要学习的内容,现分享部分可视化的学习内容给大家。...我们通常看到的或者在公司企业经常性用到的图表有饼图、条形图、柱形图、折线图、散点图、表格等,工作中我们要秉持一种原则,能够使用图来展示的坚决不用表格,能够用表格展示的绝对不用文字,也就是说优先级顺序为:...下面我们先来看看两个有趣的可视化成果吧! 一、地图 很多时候我们看到地图展示在我们面前,我们就会耳目一新,顿然之间感觉高大上,直接甩图。...二、标签云(词云) 标签云是一种关键词的视觉化方式,其中字体的大小表示该关键词出现的频率或者次数,出现的频次越高,那么字体就越大,反之就越小。话不多说,直接甩图。...民谣歌手歌词的词云展示 上图是上个月我通过网络爬虫分析15万民谣歌手歌词所得的词云可视化图,可以清楚的看到民谣歌词中出现频率比较高的意象是世界、生活、姑娘、青春、时间等。

    42320

    有趣的数据可视化,进来看看有没有你想要的?

    这几天我在阅读《谁说菜鸟不会数据分析(工具篇)》一书,发现里边有很多知识是我自己想要学习的内容,现分享部分可视化的学习内容给大家。...我们通常看到的或者在公司企业经常性用到的图表有饼图、条形图、柱形图、折线图、散点图、表格等,工作中我们要秉持一种原则,能够使用图来展示的坚决不用表格,能够用表格展示的绝对不用文字,也就是说优先级顺序为:...下面我们先来看看两个有趣的可视化成果吧! 一、地图 很多时候我们看到地图展示在我们面前,我们就会耳目一新,顿然之间感觉高大上,直接甩图。 ?...二、标签云(词云) 标签云是一种关键词的视觉化方式,其中字体的大小表示该关键词出现的频率或者次数,出现的频次越高,那么字体就越大,反之就越小。话不多说,直接甩图。 ?...民谣歌手歌词的词云展示 上图是上个月我通过网络爬虫分析15万民谣歌手歌词所得的词云可视化图,可以清楚的看到民谣歌词中出现频率比较高的意象是世界、生活、姑娘、青春、时间等。

    44630

    算法科普:有趣的游程编码

    第 81篇原创 在这个大数据时代,我们保存的数据量有时候往往是非常庞大的,存储它将会耗费非常多的内存,读取速度也相对减慢了。...首先从一个简单的例子开始:编码一个在 5 * 5 方块上使用三种颜色绘制的图像。 图 1 根据方块不同的颜色匹配不同的字母。这里使用 Y 代表黄色,使用 G 代表绿色,使用 B 代表蓝色。...游程编码是一种将代码和重复的次数作为一组来编码的方法。 例如,我们可以通过将第一个 “YYYY” 的部分表示未 “Y4”,这样就可以将其 缩短两个字符 。...当然,这样显示是有一个要求的,那就是 代码的第一个数字必须是白色方块的连续数。只有使用了这个规则,才能通过代码还原出之前的图像。...图 9 所以,对于图 9 这种开头是黑色方块的图像的代码,需要在代码的开头处添加 0 ,这样就也遵守了 代码的第一个数字必须是白色方块的连续数这条规则。 今日问题: 游程编码的局限性是什么?

    1.8K20

    算法科普:有趣的霍夫曼编码

    第 84 篇原创 前言 霍夫曼编码 ( Huffman coding ) 是一种可变长的前缀码。霍夫曼编码使用的算法是 David A....出现频率更大的符号将获得更短的比特,出现频率更小的符号将被分配更长的比特,以此来提高数据压缩率,提高传输效率。 以字符串 ” ABAABACD “ 为例进行说明。...通过一条线连接两个字母拼构成一个树状结果。将两个字母合并为 “ C 或 D”,并将出现比率相加起来。 动画 2 按照同样的操作,将合并后的 “ C 或 D ” 视为一个字符,重复相同的操作。...在 " A " 的情况下,被分配的代码为 " 0 " 在 " B " 的情况下,被分配的代码为 " 10 " 在 " C " 的情况下,被分配的代码为 " 110 " 在 " D " 的情况下,被分配的代码为..." 111 " 动画 6 就这样,通过这样的编码规则, " ABAABACD " 的二进制编码就变成了 " 01000100110111 ",只需要 14 个比特就能表示,比单纯的使用 2 比特表示一个字符缩短了很多

    1.2K30

    有趣的算法(二)——跳跃表的分析

    有趣的算法(二)——跳跃表的分析 (原创内容,转载请注明来源,谢谢) 一、概述 最近在学习redis,其中说到当使用redis的sorted set类型时,如果数据量大,redis内部会使用跳跃表结合散列表的方式对数据进行存储...理想跳跃表,第一层的数字是从小到大排序,第二层存储了第一层每两个中的一个,第三层存第二层每两个中的一个,以此类推,最后一层存储2个。...另外,除了第一层,其余每一层每一个元素都指向下一层中和本元素值相同的元素。...三、redis中sorted set的值存储 类似跳跃表,但是为了方便逆向排序,对每个元素加入了指向前一个元素的指针。另外根据sorted set特性,允许跳跃表中的元素值相同。...此方法在数据量小的时候,偏差较大,而当数据量非常大的时候,由于总是0.5的几率插入,因此概率上是一个接近完美的跳跃表。

    1.1K100

    一个有趣的东西-cloudeye

    最近遇到了一个挺好玩的东西,应该是前段时间突然火起来cloudeye,在wooyun上有卖激活码,不过找到了一个免费版的还不错… 背景 在实际渗透环境时,我们经常会遇到疑似命令执行或者没有回显的注入,第一种我们可能会用各种各样的请求来判断是否存在命令执行...现在我们有个一个更好的解决办法,dns带外查询… 原理 rr菊苣曾经写过一篇解释原理的文章 简单的来说,cloudeye自己保留dns的日志信息,并对应每个会员一个二级域名,这样我们可以通过 ping...test.xxxxx.dnslog.info 这样的多级域名方式,把我们需要返回的信息链接到url中,然后分析日志,test部分就是我们得到的信息 免费的平台 先推荐一个免费的平台吧,并不是每一个人都会花...对于 MySQL 熟悉的人可能会知道 MySQL 有一个 load_file 的 function,可以用来读取文件。...传入 我们看到收到了请求 查询user()的时候可能会发生错误,因为在url中@有特殊意义,(╯-_-)╯╧╧,需要编码一下 感觉还是挺有趣的…

    64140

    有趣的算法(九) ——蛇形数组

    有趣的算法(九)——蛇形数组 (原创内容,转载请注明来源,谢谢) 一、问题阐述 给定一个数字,需要返回的内容如下图所示: 输入5,得到结果: 输入10,得到结果: 输入一个数字i,输出结果的矩阵是i行i...列的。...共需要四类的循环,从左上到下、从下右到左、从左下到上、从上左到右,其中的上下左右都是相对的位置。...当触及边界问题,则按照第一点提到的四种循环,按顺序执行。 3)循环结束条件 上述的四个循环,只能完成一次的矩阵内容填充,故还需要一个总的循环。...其中的核心就是四重的循环,并且以结果不能大于 $level * $level作为边界控制条件。 PHP的实现相对来说简易,如果要用Java等强类型语言来实现的时候,需要先初始化整个二维数组。

    2.3K90

    有趣的算法、逻辑面试题

    B生病了,A有B所需要的药。C有一艘小船和一个可以上锁的箱子。C愿意在A和B之间运东西,但东西只能放在箱子里。只要箱子没被上锁,C都会偷走箱子里的东西,不管箱子里有什么。...箱子再运到B手中时,B取下自己的锁,获得药物。 2、有一个软件公司,1/2的人是系统分析员,2/5的人是软件工程师,有1/4的人两者都是,问有多少人两者都不是?...只要已经能确定有3匹或3匹以上的马比这匹马快,那么它就已经被淘汰了。可以看到,只有上表中粗体蓝色的那5匹马才有可能为2、3名的。即:A组的2、3名;B组的1、2名,C组的第1名。...取这5匹马进行第7场比赛,第7场比赛的前两名就是25匹马中的2、3名。故一共最少要赛7场。 4、考虑一个双人游戏。游戏在一个圆桌上进行。每个游戏者都有足够多的硬币。...4、一个矩形蛋糕,蛋糕内部有一块矩形的空洞。只用一刀,如何将蛋糕切成大小相等的两块? 答案:注意到平分矩形面积的线都经过矩形的中心。

    1.2K60

    Python一个有趣的彩蛋

    上周组内技术分享会,朋友介绍了Python语言有趣的历史,其中一个有意思的环节就是Python之禅,或者叫Python的彩蛋-this.py, 命令行执行python -c "import this"...找了一个靠谱的翻译版本,体会一下, 优美胜于丑陋(Python以编写优美的代码为目标) 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似) 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现...(动手之前要细思量) 如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准) 命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召) 其实这个this.py原始文件在$PYTHON_HOME...这是一段镜像密码函数,密码的关键是使用d[chr(i+c)] = chr((i+13) % 26 + c),0-12前十三个数字对应的序号结果+13,13-25后13个数组序号结果-13,即一个字母表上的镜像交换密码...对程序员来说,外人看着很严谨,其实还是有顽皮的一面,无论是这种语言,还是一些工具,都会有程序员夹带的一些彩蛋,例如Chrome,其中隐藏着一个小恐龙跑酷的黑白像素小游戏,在地址栏输入chrome://dino

    79530
    领券