Stern-Brocot 树

news/2025/2/8 22:05:20/文章来源:https://www.cnblogs.com/water-flower/p/18705480

Stern-Brocot 树

由两个初始值 \(0\over 1\)\(1\over0\),由两个相邻的数 \(a\over b\)\(c\over d\) 会生成数 \(a + c\over b + d\)。这由图片可以非常直观地看出。形态类似于一棵树。

每个点上有一个"三元组"\((a,b,c)\)\(\left(\dfrac{0}{1},\dfrac{1}{1},\dfrac{1}{0}\right)\) 作为根节点,且在每个节点 \(\left(\dfrac{a}{b},\dfrac{p}{q},\dfrac{c}{d}\right)\)
\(\left(\dfrac{a}{b},\dfrac{a+p}{b+q},\dfrac{p}{q}\right)\) 为其左儿子,\(\left(\dfrac{p}{q},\dfrac{p+c}{q+d},\dfrac{c}{d}\right)\) 为其右儿子

根据构造,Stern-Brocot 树显然是分数的 二叉搜索树,即树上节点的中序遍历得到的分数序列是递增的。除此之外,他还满足如下两个重要性质:

  • 最简性:Stern-Brocot 树构造出来的所有分数都是最简分数
  • 完全性:Stern-Brocot 树能构造出来任意一个正的最简分数

完全性是显然的,因为往子树搜索一定会让分子或者分母变大,这样对于任意一个最简分数 \(\frac{p}{q}\),搜索次数是有限的。

最简性要用线性代数和裴蜀定理。

SB树的作用

在 Stern-Brocot 树上查找一个确定的分数 \(\frac{p}{q}\)

每次暴力往左/右跳的复杂度是 \(O(p+q)\) 的,无法接受。

这个复杂度高的原因是我们经常会连续往左/往右跳很多步,而一次往左跳再接一次往右跳(或者一次往右跳接一次往左跳)一定会让分子分母都至少变为原来的两倍。所以“拐弯”的次数是 \(O(\log (p+q))\) 的。

只要我们能快速确定每次拐弯的位置就行了。

如果要查找的分数 \(\dfrac{p}{q}\) 落入 \(\dfrac{a}{b}\)\(\dfrac{c}{d}\) 之间,那么连续 \(t\) 次向右移动时,右侧边界保持不动,而左侧节点移动到 \(\dfrac{a+tc}{b+td}\) 处;反过来,连续 \(t\) 次向左移动时,左侧边界保持不动,而右侧节点移动到 \(\dfrac{ta+c}{tb+d}\) 处。因此,可以直接通过 \(\dfrac{a+tc}{b+td}<\dfrac{p}{q}\)\(\dfrac{p}{q}<\dfrac{ta+c}{tb+d}\) 解出向右和向左移动的次数。

复杂度 \(O(\log(p+q))\)

  • 大部分时候,我们在树上查找的分数其实是不确定的,比如我们需要根据当前分数的值跑一个二分查找的检验算法来决定具体是往左走还是往右走。

这个时候,把刚才通过解方程来确定次数的部分改为二分连续向左/向右的次数 \(t\) 即可。复杂度 \(O(\log^2(p+q))\)

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

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

相关文章

电影解析之虾米解析

我们通常会因为看电影但是需要vip却没有足够生活费去支持的困扰 我就在想有没有白嫖的方法呢(bushi 就在我苦恼的时候我发现了一个方法————就是被称为:解析 的技术这玩意就是最好的选择 但是可能部分人在刚刚接触的时候不会用的于是我就写了一个小软件来支持(只支持wind…

【AI+安全】基于大模型在流量分析领域应用的实践

一、内容概要 随着网络攻击手段的不断进化,流量分析已经成为确保网络安全的关键环节。传统的基于规则和机器学习的方法在一定程度上帮助我们识别和防范攻击,但随着网络攻击形式的多样化和复杂性增加,如何利用更强大的技术手段来分析网络流量,成为了当今网络安全领域的研究热…

RocketMQ实战—7.生产集群部署和生产参数

大纲 1.RocketMQ生产集群部署和生产参数分析 2.RocketMQ生产集群10wTPS压测 3.RocketMQ生产级故障案例1.RocketMQ生产集群部署和生产参数分析 (1)服务器数量 4C8G阿⾥云⾼配服务器共四台,公⽹IP假设如下: 139.224.217.92,106.15.250.248,47.102.152.14,139.224.212.58 (2)…

十二、MyBatis分页插件

十二、MyBatis分页插件@目录十二、分页插件12.1 分页插件使用步骤12.2 分页插件的使用12.3 测试案例本人其他相关文章链接 十二、分页插件 12.1 分页插件使用步骤 1. 添加依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>page…

htb Nunchucks walkthrough ssti + shebang绕过apparmor限制

注册发现注册失败扫描子域名 ffuf -u https://nunchucks.htb/ -w /usr/share/dirb/wordlists/common.txt -H "Host: FUZZ.nunchucks.htb" -fs 30589访问看看有啥随便输入个邮箱抓包看看 尝试ssti 注入发现确实存在在hacktrick上搜索payload https://book.hacktricks.…

P1551 亲戚

并查集还是不熟,还得练 #include<iostream> #include<set> #include<map> #include<algorithm> #include<vector> #define int long long const int N = 1e6; using namespace std; char* p1, * p2, buf[100000]; #define nc() (p1==p2 &&a…

推荐一些程序员常逛的开发者社区

前言 在信息技术日新月异的今天,程序员作为推动技术进步的重要力量,始终在探索、学习和交流的道路上不断前行。为了帮助程序员们更好地拓宽视野、提升技能,本文大姚将给大家推荐12个程序员常逛的开发者社区。 GitHub GitHub是一个功能强大、易于使用的代码托管平台。拥有庞大…

为飞牛OS基于FRP的内网穿透开启HTTPS加密

前言 玩NAS的朋友应该有比较多只是在家庭局域网使用,比如日常看看电影、备份手机照片什么的,这属于家庭局域网的使用场景。 当然了,如果你经常出差,或者过年回家不想把NAS也背回去,或者是想上班摸鱼,或者是NAS搭建游戏服务器之类的能公网访问就很有必要了。 公网访问我自…

0208《XEduHub + PySimpleGUI + PySimpleGUIWeb:在行空板上部署模型的全解析》【模型部署】

- 2月8日,晚上,19:30~21:00(主讲老师:邱奕盛)实验内容: 【模型部署】利用统一推理框架实现模型部署。 在训练好的模型基础上,设计简洁的体验界面, 最终尝试在行空板上实现完整效果的呈现,涉及 XEduHub、PySimpleGUI、PySimpleGUIWeb等工具。 import PySimpleGUI as …

DeepSeek 不再卡顿,从此告别服务器繁忙,请稍后再试(建议收藏!)

大家好,我是六哥。 由于DeepSeek真的太火了,也许你也跟我一样,常会遇到这样的情况:真的让人抓狂,10条回复里常常有9条是“服务器blabla,请稍后重试”,看到这话,就问你,谁能不崩溃? 其实仔细想想,DeepSeek的目标是AGI,算力资源更多用在探索模型上,很难兼顾几亿用户…

踩坑---注意芯片复位后引脚初始化功能

踩坑---注意复位后引脚初始化功能 背景 ​ 做综合案例训练的时候,把PB3和PB4当做了普通IO进行了配置,运行过程中发现很奇怪,怎么输出和配置的不一致。debug调试显示的IO输出和万用表量的都不一样。由于添加了其他功能代码,还把每个部分代码都抽出来单独调试,最后发现就是那…

【字符串、栈】单个char字符转为string表示

单个char转string char x = a; string c = string(1, x);string转单个char string s = "abc"; char x = s[0];string转char[](字符数组) string s = "abc"; s.c_str();(字符数组)char[]转string //直接赋值即可 char s1[4] = "abc"; string …