算法一千零一夜 · 第三夜 神庙之夜的汉诺塔

2026 大厂面试高频题解:Java 并发与底层 + AI 工程 + 算法 LeetCode 高频 12 题【每题带面试官视角、完整解答与追问链路】 本文聚焦2026大厂Java岗面试核心三科:Java底层与并发、AI工程、算法,精选12道高频真题,以“面试官视角→完整解答→复杂度分析→追问链路”结构精讲。涵盖HashMap原理、ConcurrentHashMap线程安全机制、线程池配置策略、synchronized与ReentrantLock对比、RAG链路设计、幻觉治理、Function Calling安全规范、微调与RAG选型决策,以及反转链表、层序遍历等经典算法手撕题。文末附30天冲刺计划,助你高效通关大厂面试。 阅读详情

第三夜 · 神庙之夜的汉诺塔

灯又亮了。第三夜。这一夜不回那间教室。上一夜散场,我带走的是那个归字。递是出发,归是回家,接不归的棋救不回。可是回去的路上,我一直在想这句话的后半截。既然要回家,那条回家的路,有多长?

这个问题,一段 4 岁的故事先替我起了个头。

从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事。讲的什么?讲的还是从前有座山,山里有座庙,庙里有个小和尚在听老和尚讲故事。再往里讲一层,还是它自己。故事套着故事,层与层一模一样,全都是同一座山,同一座庙,同一个讲不完的老和尚。

大人们拿这段话哄孩子。孩子缠着要听故事,大人不肯编新的,就递出这座山。孩子安静了,因为这段故事真的没有底。不是讲的人偷懒,是它本来就没打算讲完。下一层和上一层一模一样,只是听故事的人更小,夜更深。你随时可以走开,故事不怪你。故事里那个小和尚,到今天还在听。

我第一次在两面镜子中间见到这段故事,是在三年级。那天跟着外婆和舅舅一家人逛江苏省科技馆,展厅里立着两面相对的镜子。外婆那时是物理老师,她把我拉到两面镜子中间,给我讲镜面反射,讲镜面成像。

我往前一看,镜子里套着镜子,我自己一层一层退下去,越来越小,越来越小,朝着最深处退过去。所有的一切,最后都消散在透视的原点,缩成一个黑点。外婆在旁边讲她的原理,我在那个黑点跟前看了很久。镜里的像无穷无尽,人的视野却是有穷的。无穷的像,走到有穷的视野尽头,就只剩下那一个点。

道理上,镜子后面还有镜子,像的后面还有像,无限就站在那里,站得端端正正。可我亲眼看见,那无穷无尽的像,最终消散在透视点处,收成一个黑点。无穷是镜子的事,有穷是看的人的事。

后来我学递归,才知道镜子其实很客气。上一夜那口井,塌在第 22835 层,不是运气差。镜子再深,最深处的无穷,最后收成安安静静一个黑点,挂在透视的原点上。递归不这么客气。递归写坏了,尽头不是黑点,是黑洞,什么掉进去,当场爆炸。庙里的故事一层套一层,镜子里的像一层退一层,怎么套怎么退,都有一个原点替它们收尾;递归收不住的时候,没有谁替它收尾。所以机器收下递归的那一刻,同时递过来一把尺。写递归的人得先接住这把尺,再去谈无限。

好了。现在,让老和尚开口。这一回,他不再讲那座山了。

他说,从前,恒河边上有一座庙。

庙不稀奇,稀奇的是庙里那桩差事。庙里立着三根柱子,通体是宝石磨的。其中一根柱子上套着六十四片金盘,最大的在底下,越往上越小,摞成一座塔。庙里的僧侣们领了差事,要把这座塔从这根柱子搬到另一根柱子上去。规则只有两条。其一,一次只许挪一片。其二,无论什么时候,大片不许压在小片上。

僧侣们领了差事,日复一日地搬。金盘一片一片换柱,钟声一天一天响着,塔还是那座塔,模样没变。传说讲到这里,露出了牙。它说,等最后一片金盘落位的那一天,这个世界就到了尽头。

这个故事你多半听过。听过也不要紧,编它的人就盼着你听。1883 年,法国数学家吕卡斯做出了这个玩具,又亲手写下这段传说,一并印在说明书里。玩具卖遍了欧洲,传说跟着走遍了世界,一百多年后还住进了每一本编程教材。讲传说的书,自己讲的传说也是编的。这一夜的庙,两层都是编的。这一笔我不瞒你,照实记在夜末的核对表里,像第一夜把牛顿的名字还回去一样。

预言归预言。现在,把预言翻译成算术。

搬一片,算一步。想把最大的那片从甲柱挪到丙柱,得先把压在它上面的六十三片整个搬到乙柱去;等它落了位,再把六十三片从乙柱请回来。搬六十三片是同样的麻烦,得先搬六十二片。这样一层一层想下去,每加深一片,功夫翻一倍,再加一。一片要一步,两片要三步,三片要七步,十片要一千零二十三步。六十四片,一共是 2⁶⁴ 减 1 步。

18446744073709551615。

每秒挪一片,不吃饭,不睡觉,不过节,这个数折合 5849 亿年。宇宙到今天 138 亿岁。僧侣们要连搬上四十二个宇宙的年纪,才能听见最后一片金盘落位的那一声轻响。

这个数的分量,得拿人生去称。三片的小庙,七步搬完,每一步都画在下面这张图里。二十片要十二天,一个下午变成了两个星期。三十片要三十四年,动手的小伙子搬成了老汉。四十片要三万五千年,长过全部文字的历史。五十片要三千五百多万年,长过整个人类物种的年纪。六十四片,5849 亿年。预言没有说谎,它只是把日程表的最后一行,写在了谁也等不到的年份里。

图 3-1 三片金盘的七步搬法

图 3-1 三片金盘的七步搬法。灰色加粗的盘,是这一步正在挪动的那片。从初始到第 7 步,塔从甲柱完整落到丙柱,任何时候都没有大片压住小片。第 6 步之后乙柱空了,最省的搬法也不必用上每一根柱。

 

预言翻完了。接下来这一位,才是真正吓过数学家的。

1872 年,柏林。威尔斯特拉斯当着科学院摆出一条曲线,处处连着,却处处立不起切线。要知道,那个年代的数学家默认连续的曲线总该有光滑的段落,好比人人都默认山总有坡度缓的一段。这一条没有。它处处连着,却寸步难滑。分析学界哗然,埃尔米特在信里自陈,怀着恐惧与惊骇,避开这场可悲的瘟疫。三十二年之后,科赫用一把直尺和初等几何,把这群怪物里最驯顺的一只牵到了每个人眼前。就是下面这片雪花。

从一片正三角形开始。把每条边三等分,中间那一段向外顶成一片尖角,尖角自己也是一个小三角形。第二层,对着现有的每一条边再做一遍同样的事。第三层,再来。图形越磨越碎,越磨越像冬夜窗上的霜花。本夜的程序亲手把它磨了一遍,从零层磨到三层,画在下面。

图 3-2 科赫雪花的头四层

图 3-2 科赫雪花的头四层。从左到右,打磨了零、一、二、三层。图是本夜的程序自己画出来的,代码附在夜末。

 

磨到无穷多层,这片雪花的面积,停在最初那片三角形的一又五分之三倍,封了顶,一步也不再走。它的周长却是另一副脾气。每磨一层,周长变成上一层的 4/3 倍。乘一个比一大的数,乘个不停,周长通向无限。

一片巴掌大的雪花,镶着一条走不完的边。这一次是真的走不完。不是走很久,是定义本身就到不了。这才是无限本来的脸色。

可是没有人怕雪花。没有人怕,因为没有人真的去走那条边。走不完写在定义里,谁也不欠它一步。

庙里那条路正相反。六十四片,片片数得清,步步都要人挪,每一步都真实存在。让世界惦记了一百多年的,从来不是无限,是一个每一位都写得出来的大数。真无限反倒和善,吓人的是数得出来的有限。

老和尚的故事,讲到这里本该收尾了。这一回,插话的是小和尚。

师父,庙里为什么只有三根柱子?

老和尚不答。传说只发三根柱子,不发为什么。小和尚又问,那我能不能先把头顶的小塔整座寄存到别的柱子上,腾出手来搬底下的大山,等大山落了位,再回来取小塔?

老和尚还是不答。庙里只有三根柱子,第四根柱子,传说没有发。

可是山下的世界,不归传说管。

1941 年,大西洋彼岸的一本数学杂志上,Frame 和 Stewart 把第四根柱子插进了庙里。两人素不相识,文章登在同一卷、相邻的两页,交来的却是同一套搬法。先把头顶的小塔整座寄存到第四根柱上。寄存几片最省,这个问题自己又是一道递归。腾出手来,用老三柱的功夫,把底下的大山搬完。最后回到第四根柱上,把小塔请回来,盖在大山的顶上。

六十四片金盘,四根柱子,18433 步。

一秒挪一片,五个小时零七分。日头升起来的时候僧侣们动手,日头还没偏西,塔落成了,世界好好的。压在世界头顶的末日,被多出来的那根柱子,改期到了当天晚饭前。

可是 1941 年,没有人敢把话说满。这套搬法是不是天下第一省,Frame 和 Stewart 都没有证明。往后的七十三年里,它一直顶着一个头衔,叫据信最省。全世界最会算的一批人试了一辈子,没能证明它是,也没能找到更省的。直到 2014 年,法国数学家布歇把它钉死了。第四根柱子上那套搬法,就是最省的搬法。柱子 1941 年就插好了,承认它的那句话,在路上走了七十三年。

北山愚公说过,子子孙孙无穷匮也。河曲智叟笑他,他就拿这句话作答。山不会再长高,子孙却没有尽头,一茬接一茬地挖,总有一天挖平。这个道理在许多年后有了名字,叫数学归纳法。只是愚公的两座山,最后是天帝派夸娥氏二子背走的,神替他收了尾。恒河边的庙没有神来。金盘要僧侣一片一片地搬,第四根柱子要人一代一代地想,从 1941 年一直想到 2014 年。

有一句话,我想原样放在这一夜里。人是不能打破规律的,但是看透规律之后,我们能做出更好的选择。大盘不压小盘,一次只挪一片,谁也改不了,也不必改。多一根柱子,多一层寄存,多一步回头,末日就改期了。规则没有被打破,被看透了。

庙里的僧侣不知道自己在倒数什么。他们不数日子,只数手边这一片。世界没有在倒数,僧侣们在慢慢搬;再长的路,也是一步一步走完的。

这一夜,我把庙写成了三段能跑的程序。第一段替僧侣数数,小塔数到七步,大塔数到钟声里。第二段插上第四根柱子。第三段磨雪花,图就是它画的。你要是不信末日会改期、周长没有底,自己跑一跑,数一数。

第一段 · 庙里的钟(三柱)

import java.io.PrintStream;
import java.math.BigInteger;

/**
 * 《算法一千零一夜》第三夜 · 庙里的钟(三柱)
 * 恒河边的庙,三根柱,六十四片金盘,大盘在下,小盘在上。
 * 规则只有两条:一次挪一片,大片不压小片。
 * 传说讲,最后一片金盘落位之日,世界终结。
 * 这一版按最省的搬法替僧侣数数:小塔一步步看得见,大塔一声钟数得完。
 */
public class TempleBells {
    static int moves = 0;

    // 递,是把塔交给更小的塔;归,是一片落位,钟响一声。
    static void move(int n, String from, String to, String via) {
        if (n == 0) {
            return;                                  // 零片可搬,这一层到家。
        }
        move(n - 1, from, via, to);                  // 先把上面的塔寄存到中途柱。
        moves++;
        if (n <= 3) {
            System.out.println("第 " + moves + " 步," + n + " 号盘," + from + "柱到" + to + "柱。");
        }
        move(n - 1, via, to, from);                  // 再把寄存的塔请回来,盖在大盘上。
    }

    public static void main(String[] args) throws Exception {
        System.setOut(new PrintStream(System.out, true, "UTF-8"));

        // 一、小庙演示。三片金盘,七步,与图 3-1 逐步核对。
        System.out.println("三片金盘,从甲柱搬到丙柱:");
        move(3, "甲", "丙", "乙");
        System.out.println("三片共 " + moves + " 步。");
        System.out.println();

        // 二、大庙钟声。每加深一片,功夫翻倍再加一:1、3、7、15、31……
        BigInteger steps = BigInteger.ONE;
        for (int n = 2; n <= 64; n++) {
            steps = steps.shiftLeft(1).add(BigInteger.ONE);
        }
        System.out.println("六十四片金盘,一共 " + steps + " 步。");
        BigInteger perYear = BigInteger.valueOf(365L * 24 * 60 * 60);   // 一年按 365 天,不闰。
        BigInteger years = steps.divide(perYear);
        System.out.println("每秒搬一片,约 " + years + " 年,约合 5849 亿年。");
        BigInteger universe = BigInteger.valueOf(13800000000L);         // 宇宙现龄约 138 亿年。
        System.out.println("这个年头,约是宇宙现龄的 " + years.divide(universe) + " 倍。");
    }
}

第二段 · 第四根柱子(四柱)

import java.io.PrintStream;
import java.math.BigInteger;

/**
 * 《算法一千零一夜》第三夜 · 第四根柱子(四柱)
 * 1941 年,Frame 与 Stewart 在同一本杂志的同一卷里,
 * 各自给庙里插上了第四根柱子:先寄存小塔,搬完大山,再回来取塔。
 * 寄存几片最省,这个问题自己又是一道递归。本程序替小僧把它数完。
 */
public class FourthPeg {
    public static void main(String[] args) throws Exception {
        System.setOut(new PrintStream(System.out, true, "UTF-8"));

        // f(n) 是四根柱搬 n 片的最省步数。
        // 搬法:寄存 k 片到第四根柱,三根柱搬完剩下的 n-k 片,再取回小塔。
        // f(n) = min over 1 <= k < n { 2*f(k) + 2^(n-k) - 1 }。寄存几片最省,问 n 自己。
        BigInteger[] f = new BigInteger[65];
        f[1] = BigInteger.ONE;                           // 一片,一步。
        for (int n = 2; n <= 64; n++) {
            BigInteger best = null;
            for (int k = 1; k < n; k++) {
                BigInteger plan = f[k].shiftLeft(1)      // 寄存一次,取回一次。
                        .add(BigInteger.ONE.shiftLeft(n - k).subtract(BigInteger.ONE)); // 三柱搬大山。
                if (best == null || plan.compareTo(best) < 0) {
                    best = plan;
                }
            }
            f[n] = best;
        }

        StringBuilder head = new StringBuilder();
        for (int n = 1; n <= 10; n++) {
            head.append(f[n]);
            if (n < 10) {
                head.append("、");
            }
        }
        System.out.println("四柱搬 n 片的最省步数,前十项: " + head);
        System.out.println("六十四片,四根柱子,共 " + f[64] + " 步。");
        long secs = f[64].longValue();                   // 18433,装得下。
        System.out.println("每秒一片,约合 " + secs / 3600 + " 小时 " + secs % 3600 / 60 + " 分 " + secs % 60 + " 秒。");
        BigInteger three = BigInteger.ONE.shiftLeft(64).subtract(BigInteger.ONE);
        System.out.println("同一座塔,三根柱要 " + three + " 步;四根柱只要 " + f[64] + " 步。");
    }
}

第三段 · 雪花的画笔(科赫)

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.PrintStream;
import javax.imageio.ImageIO;

/**
 * 《算法一千零一夜》第三夜 · 雪花的画笔(科赫)
 * 从一片正三角形开始,每条边的中间三分之一向外顶出尖角,
 * 层层打磨。面积封了顶,周长没有底。
 * 这一版一边打磨一边画,图就是程序自己画的。
 */
public class KochSnowflake {

    // 递,是把一条边交给四条更短的边;归,是 depth 用尽,落笔画直线。
    static void koch(Graphics2D g, double x1, double y1, double x2, double y2, int depth) {
        if (depth == 0) {
            g.drawLine((int) Math.round(x1), (int) Math.round(y1),
                       (int) Math.round(x2), (int) Math.round(y2));
            return;
        }
        double dx = (x2 - x1) / 3, dy = (y2 - y1) / 3;
        double ax = x1 + dx, ay = y1 + dy, bx = x1 + 2 * dx, by = y1 + 2 * dy;
        // 尖点:底边中点向图形外侧顶起一个等边三角。屏幕坐标 y 朝下,外侧法线取(-dy3, dx3)。
        double mx = (ax + bx) / 2 - (by - ay) * Math.sqrt(3) / 2;
        double my = (ay + by) / 2 + (bx - ax) * Math.sqrt(3) / 2;
        koch(g, x1, y1, ax, ay, depth - 1);
        koch(g, ax, ay, mx, my, depth - 1);
        koch(g, mx, my, bx, by, depth - 1);
        koch(g, bx, by, x2, y2, depth - 1);
    }

    public static void main(String[] args) throws Exception {
        System.setOut(new PrintStream(System.out, true, "UTF-8"));

        // 一、画。四联图,从左到右磨了零、一、二、三层。
        int W = 1600, H = 400;
        BufferedImage img = new BufferedImage(W, H, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = img.createGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, W, H);
        g.setColor(new Color(0x22, 0x22, 0x22));
        g.setStroke(new BasicStroke(1.6f));
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        double edge = 200;
        for (int i = 0; i < 4; i++) {
            double cx = 200 + i * 400;                    // 每格中心。
            double h = edge * Math.sqrt(3) / 2;
            double ax = cx, ay = 190 - h / 2;             // 顶点朝上的正三角形。
            double bx = cx - edge / 2, by = 190 + h / 2;
            double cx2 = cx + edge / 2, cy2 = 190 + h / 2;
            int depth = i;
            koch(g, ax, ay, bx, by, depth);
            koch(g, bx, by, cx2, cy2, depth);
            koch(g, cx2, cy2, ax, ay, depth);
        }
        ImageIO.write(img, "png", new File("fig3-2-koch.png"));
        System.out.println("四联图已画完,落在 fig3-2-koch.png。");

        // 二、数一数。周长每层乘 4/3,面积每层只添一点点。
        double area0 = Math.sqrt(3) / 4;                  // 边长 1 的正三角形。
        double perimeter = 3.0;
        double area = area0;
        double newCorners = 3;                            // 这一层新添的尖角个数。
        double seg = 1.0 / 3;                             // 尖角的边长。
        System.out.println("层 0,周长 3 倍,面积 1 倍。");
        for (int n = 1; n <= 9; n++) {
            perimeter = perimeter * 4 / 3;
            area += newCorners * Math.sqrt(3) / 4 * seg * seg;
            newCorners *= 4;
            seg /= 3;
            System.out.printf(java.util.Locale.ROOT, "层 %d,周长 %.3f 倍,面积 %.4f 倍。%n",
                    n, perimeter, area / area0);
        }
    }
}

① 真伪核对 逐条照实登记。

  Ⅰ 吕卡斯与传说 汉诺塔玩具由法国数学家吕卡斯于 1883 年推出,上市时署名 N. Claus de Siam,这个名字是他本名加家乡(Lucas d'Amiens,亚眠)的字母变形;东方的皮是营销的包装,神庙传说出自这套包装,三根柱、六十四片金盘、搬完世界终结,全是编的。

  Ⅱ 数字与换算 三柱六十四片共 2⁶⁴ 减 1 步,即 18446744073709551615 步;每秒一片、一年按 365 天折合 5849 亿年,为本夜程序实跑输出;宇宙现龄约 138 亿年,倍数约 42。

  Ⅲ 四柱 1941 年 Frame 与 Stewart 在 American Mathematical Monthly 第 48 卷 216 至 219 页各自独立发表四柱搬法;四柱六十四片最少 18433 步,为本夜程序按 Frame-Stewart 递推实跑所得;2014 年布歇(Thierry Bousch)证明这个递推给出的正是最少步数,论文 La quatrième tour de Hanoï 载于 Bulletin of the Belgian Mathematical Society – Simon Stevin 第 21 卷第 5 期,895 至 912 页。坊间另有此文载于法国数学会通报第 142 卷的引法,系以讹传讹,那是它 2013 年预印本旧题目惹的祸。

  Ⅳ 雪花 科赫 1904 年论文的题目直译过来,是"用初等几何构造的一条无切线的连续曲线";雪花面积收敛于初始三角形面积的 8/5,周长每层乘 4/3,均经本夜程序实跑核对。威尔斯特拉斯于 1872 年 7 月 18 日在柏林科学院报告此曲线;埃尔米特 1893 年致斯蒂尔杰斯的信里自陈,怀着恐惧与惊骇避开这场可悲的瘟疫。

  Ⅴ 庙循环与愚公 从前有座山系民间口传,作者与年代不可考,如今是讲解无限递归时的常用例子。愚公引文出自《列子·汤问》,原文为"子子孙孙无穷匮也,而山不加增",结尾是"帝感其诚,命夸娥氏二子负二山"。

  Ⅵ 实跑记录 三段程序均在本机 JDK 21 下编译运行;三片七步与图 3-1 逐格一致;四柱前十项为 1、3、5、9、13、17、25、33、41、49,六十四片 18433 步,折合 5 小时 7 分 13 秒;雪花第九层周长约为初始三角形周长的 13.3 倍,面积 1.5996 倍,正向 8/5 收敛。

  Ⅶ 亲历登记 科技馆一节是亲历。三年级那年跟外婆和舅舅一家人逛江苏省科技馆,外婆那时是物理老师,镜面反射与成像的原理是她讲的;两面镜与透视原点的黑点,都是当年的实景。黑点的机理,是每折一次光就折损一分,深处渐暗,最终收成一个点;递归那边没有这份收敛,栈溢出当场终止程序,即正文所说的黑洞;第二夜那口井实跑塌在第 22835 层,照实登记。

② 关于证明 正文只留了七十三年一句话,证明放在这里。

  Ⅰ 三柱的步数为什么省不掉 想让最大的那片动身,压在它上面的 n 减 1 片必须全部让开,而它要落的那根柱子必须腾空,于是这 n 减 1 片只能全体挤进剩下那一根柱。让路的功夫一步都省不掉,所以三柱的最少步数,至少是搬 n 减 1 片的两倍再加一,而搬法恰好做到这个数,$T(n)=2^n-1$ 就此锁死。

  Ⅱ 四柱为什么难了七十三年 让路的队伍一旦可以分成两批,小塔去第四根柱,大山直接走,让路的成本就不再服从三柱的公式,上面的下界证明当场断裂。算法 1941 年就有,难的从来不是省,是证明没有更省的。

  Ⅲ 布歇走的是图的路 把每一个合法局面画成一个点,每挪一片画一条边,全体局面连成一座巨大的图,两座塔之间的最短距离就是最少步数。布歇量清了这座图的距离结构,证明 Frame-Stewart 的数恰好就是那个距离。2014 年,下界闭合,七十三年的门开了。

  Ⅳ 两条式子留档 $T(n)=2^n-1$。$S(n)=\min_{1\le k<n}\{2S(k)+2^{n-k}-1\}$。

③ 今夜习题 三道,评论区见。

  Ⅰ 小庙里的金盘只有一小摞。僧侣们按最省的搬法搬完了它,一共 1023 步。这一摞有几片金盘?

  Ⅱ 方丈给小庙添了第四根柱子。五片金盘从一根柱子搬到另一根柱子,最少几步?同样的五片,三根柱子要多少步?

  Ⅲ 从一片正三角形开始打磨雪花,每打磨一层,周长变成上一层的 4/3 倍。打磨几层之后,周长第一次超过最初那片三角形周长的 10 倍?

你算出来了吗?评论区见。(答案与参考程序,收在书后《参考解答》。)


本书目录导航 上一篇:第二夜 算法“接不归” 下一篇:第四夜 影分身与记事本 起点:卷首语·算法童话


版权声明:本文为作者原创,受著作权法保护。未经授权禁止转载、搬运、摘编、改编及任何形式的二次创作;个人学习引用请注明作者与原文出处。转载授权请联系作者(CSDN 私信)。侵权必究。

光模块数字诊断监控(DDM)功能 DDM(Digital Diagnostic Monitoring)数字诊断监控,由行业组织SFF Committee制定,遵循SFF-8472多源协议定义的标准参数而工作,规范了光模块和网络设备的软硬件所需遵循的标准数值或范围,确保了网络设备供应商和光模块供应商之间所提供产品的互操作性不同。:通过监测激光器的偏置电流来预测激光器的劣化,从而确保在故障发生之前将业务切换到备用链路上或替换有可能故障的光模块,因此起到了预测光模块寿命的作用。光模块DDM信息可以通过SNMP读取光模块的接收光功率和发射光功率。. 阅读详情

相关推荐

避开这些坑!RK3588安卓系统内置输入法的正确姿势(含.mk文件修改指南)

本文详细解析了在RK3588安卓系统定制中预置第三方输入法的完整流程与关键避坑指南。重点涵盖APK签名、Android.mk文件编写、系统默认输入法配置(使用adb ime list命令获取服务名)以及SeLinux策略适配等核心步骤,并指出RK3566/RK3568等兄弟平台的通用性与差异点,帮助开发者实现稳定、深度的系统集成。

tgb34567890的博客 430

算法一千零一夜 · 第四夜 影分身与记事本

灯又亮了。第四夜。上一夜,神庙的僧侣还在慢慢搬。收工之后,我把那座庙写成了三段能跑的程序。写完第三段,雪花分形的那一段,我盯着屏幕发了很久的呆。程序里每一条边都把自己交给四条更短的边,函数在它自己的函数体里调用它自己,一层,又一层。我调用了它,它又调用它自己,每一次调用都裂出一个新的自己,在原地做事,做完就散。那一刻,我想起恰好摊在案头的《三国演义》。第六十八回。宴席上,左慈掷出酒杯,杯子悬在半空,化作一只白鸠,绕殿而飞。满座的人抬头去找那只鸟,席位上的左慈已经不见了。曹操下令捉拿。第二天,满城都是左慈。一

qq_41057763的博客 326

Qt6.8.0(win64)安装教程

启动 Visual Studio 2022 Community,选择 “继续但无需代码” 运行,然后打开Option设置,Add一条版本配置,Location 选择 D:\Qt\6.8.0\msvc2022_64\bin\qmake,点击确定。我是win11系统,所以选择windows版,下载路径二选一即可。方案1:默认情况下,额外勾选图中两个组件(总共40多G)方案2:按图中自定义勾选组件(总共5.8G)选择Custom Installation。我选的方案2,总共5.81G。

D4G1TIAO的博客 9031

算法一千零一夜 · 第二夜 算法“接不归”

灯又亮了。第二夜,还留在那间教室里。上一夜,一枚假币教我看清一条没人念出来的规则;这一夜,是同一间教室的下一页——讲递归,和一句我答错了的答案。那天教授讲完假币和三分,接着问:你们知道什么是递归吗?递归分支和解空间,又是什么关系?教室里安静了一瞬。抢着开口的人是我:“递归是一种算法!”全班哄堂大笑。我们用算法解决问题——那时我的学问只有一个抽屉,抽屉上贴着"算法"两个字,什么都要往里塞。教授问什么是递归,我听见"递归解决问题",就把它塞进了那个抽屉。我的声音比谁都大,因为我从不怀疑那个抽屉。教授没有笑。他给

qq_41057763的博客 505

AirSim安装和地图加载

详细教程如何安装AirSim并加载地图

fegxg的博客 3029

循环神经网络(RNN)

在之前学习了全连接神经网络(DNN)模型,网络结构都是从输入层到隐含层再到输出层,层与层之间是全连接或部分连接的,但每层之间的节点是无连接的。 一、神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下: 将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特定的y,那么既然有了这么强大的模型,为什么还需要RNN(循环神经网络)呢? 二、为什么需要RNN(循环神经网络) 考虑这样一个问题,如果要预测句子的下一个单词是什么

小朱小朱绝不认输的博客 2万+

【优选算法 — 双指针】经典例题题解+算法总结

本文总结了双指针算法在三道经典题中的应用:1)移动零——使用快慢指针将非零元素前移,零元素后移;2)复写零——采用反向回填同向双指针,从右向左复写0,避免覆盖;3)盛水最多容器——运用对撞指针,根据短板原则移动指针,高效求解最大面积。算法时间复杂度均为O(n),显著优于暴力法。文章还归纳了双指针的三类模式:快慢指针、反向回填同向双指针、对撞指针,并附推荐练习题,助力算法学习。

Tsuki_tl的博客 301

代谢组数据分析(二十六):LC-MS/MS代谢组学和脂质组学数据的分析流程

本教程概述了LC-MS/MS在代谢组学和脂质组学数据分析中的应用流程。首先介绍了样本的采集、提取和LC-MS/MS分析,随后详细阐述了质谱数据的预处理、峰值识别、特征注释,以及数据标准化和统计分析的重要性。特别强调了使用XCMS和CAMERA进行数据对齐和加合物识别,以及利用MultiABLER和LipidFinder进行数据过滤、插补和标准化处理。此外,还介绍了如何应用EigenMS算法进行数据标准化,以及如何使用Limma包进行差异分析。整个流程旨在提高数据质量,确保分析结果的准确性和可靠性,为后续的生

专注生信领域 1928

【算法拾光 7】双指针|两数之和 II - 输入有序数组 + 三数之和

本文总结双指针核心技巧——相向双指针,适用于有序数组。两数之和II通过左右夹逼实现O(n)时间、O(1)空间解法;三数之和则在排序基础上固定一数,结合双指针与三层去重(固定数、左指针、右指针),避免重复答案,复杂度为O(n²)。核心思想:利用有序数组的单调性,通过指针单向移动高效排除不可能组合,是后续多数问题的基础。

wuqingyigexiaoba的博客 255

uniapp 开发小程序 使用 `uni.canvasToTempFilePath` 导出图片时遇到的 “fail fail canvas is empty“ 错误解决方法

问题的关键在于,在调用时需要正确的上下文对象。如果没有传入this(vue2)或instance(vue3),就会导致导出失败,提示错误。这也提醒我们,在使用类似这样的 API 时,要确保上下文传递正确,以便函数能够正常执行。希望这个排查过程和解决方案能帮助你解决类似的问题!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2320

什么是 SAP Build Process Automation?

SAP Build Process Automation 是一款综合性的低代码工具,允许企业用户快速开发和自动化端到端业务流程。它整合了工作流管理、任务自动化和人工智能技术,提供了一个易于使用的平台,帮助企业更好地应对现代商业挑战。通过该工具,用户无需具备深厚的编程技能即可创建复杂的业务流程。例如,用户可以使用直观的拖放式界面设计流程、设置触发条件、定义任务分配规则,并通过内置的分析功能对流程效率进行评估。流程建模与设计:提供图形化界面,帮助用户直观地设计业务流程。任务自动化。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1253

优选算法——【双指针算法1】C++实现

双指针算法详细题解思路

2402_87037360的博客 475

流程图详解Transformer最核心的多头注意力机制,QKV流向清晰明了

本文详细讲解了Transformer模型中的多头注意力机制(Multi-head Attention)。通过类比多人评估同一事物的不同视角,说明多头机制能综合多个注意力权重获得更有效的输出。文章逐步推导了多头注意力的计算过程:将输入矩阵X(4×512维)分别与8组Q、K、V权重矩阵相乘,得到8组head(每组4×64维),拼接后经Wo矩阵变换恢复为4×512维输出。整个过程涉及37个待训练参数矩阵(1个Wo、8组Wq/Wk/Wv)。该机制通过并行计算多个注意力头,能更全面捕捉输入特征间的复杂关系。

人工智能研究所的博客 248

算法札记:线性筛法乱改乱改内层循环条件有感

该代码为埃拉托斯特尼筛法的优化版本,用于求素数。WA版本未标记1为非素数,导致错误;AC版本添加vis[1]=true,并调整循环边界至N-2,确保正确筛除合数。关键优化在于内层循环中一旦i%p[j]==0即跳出,避免重复标记,提升效率。注意初始化与边界处理是正确性的关键。

Keven_11的博客 94

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

P1192 台阶问题

题目P1192台阶问题是一道经典的递归与动态规划结合题。通过记忆化搜索或递推DP求解,状态转移为:到达第n阶的方案数等于前k步内各阶方案数之和。关键在于初始化dp[0] = 1(起点),其余按dp[i] = sum(dp[i-j])递推,取模100003防止溢出。代码简洁,逻辑清晰,是理解动态规划基础的好例题。

UIU114的博客 167

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

算法一千零一夜 · 第十五夜 一门别扭的外语

比特王国第二课:房卡上的 6 和 4 是一种什么文字。速记官的十六枚戳,三块屏幕各司其职,FF 的两副面孔,和一条简单到不像学问的国籍法:二进制里只有一个 1。幻方旅行团回门,10 过不了闸,16 是上宾。

qq_41057763的博客 375

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

贪心题目:交换一次的先前排列

为了得到字典序小于原始数组的最大可能排列,应使用贪心策略找到上述下标。如果无法得到字典序更小的排列,返回原数组。得到的排列的字典序更小,一定不是可能的最大排列。时,应寻找符合上述要求的最大下标。处的元素值不变或增加,因此字典序不可能更小。都可以得到字典序更小的排列,其中交换。的左侧或右侧则一定不是可能的最大排列。的位置)后得到的按字典序排列小于。处的元素值减少,因此字典序更小。得到字典序更小的排列,必须满足。的最大元素所在的最小下标作为。之后得到字典序更小的排列。的最大元素的最小下标作为。

stormsunshine的博客 218

[GESP202409 六级] 算法学习(含视频)

第 i 道题目有对应的知识点 ai​,即学习第 i 道题目可以令小杨对第 ai​ 种算法的掌握程度提高 bi​。小杨认为连续学习两道相同知识点的题目是不好的,小杨想请你编写程序帮他计算出他最少需要学习多少道题目才能使得他在完成学习目标的同时避免连续学习两道相同知识点的题目。第三行 n 个正整数 b1​,b2​,...,bn​,代表每道题目提升的掌握程度。第二行 n 个正整数 a1​,a2​,...,an​,代表每道题目的知识点。对于全部数据,保证有 1≤m,n,bi​,k≤10^5,1≤ai​≤m。

weixin_46127956的博客 361

算法--桶思想

谐距下标对;最大 FST 距离

w_zero_one的博客 42

算法day1--移动零&&复写零

答案藏在不变量的第二句里:既然。

2401_85340832的博客 374

限流算法——固定窗口、滑动窗口、漏桶、令牌桶

本文对比了三种常见限流算法:计数器(固定/滑动窗口)仅关注请求数量,易受临界突刺影响;漏桶算法通过恒定速率输出,实现流量整形,保护下游但响应延迟高;令牌桶则允许突发,空闲时攒令牌,兼顾平滑与效率,适合大多数场景。三者本质区别在于对突发流量的处理策略,选择应基于业务需求。

fancyfor的博客 217

GraphRAG的问答大模型算法详解

GraphRAG 的核心算法机制GraphRAG 的流程通常可以拆解为三个阶段:图索引、图检索和图生成。图索引(Graph Indexing)这是 GraphRAG 区别于普通 RAG 的关键前置步骤。对于非结构化文本,系统会调用 LLM 进行实体与关系抽取,将“某公司收购了某品牌”这样的句子,转化为 (公司)-[收购]->(品牌) 的三元组,并存入图数据库。微软的 GraphRAG 项目还在此基础上构建“社区”(community)层级,对紧密连接的实体簇生成摘要,用于回答全局性问题。

qq_42773521的博客 244

C++ 算法(四)

C++string算法题

2503_94479566的博客 634

从 1024 块 GPU 到 558 万美元:拆解 DeepSeek-V3 的算法-系统协同设计

DeepSeek-V3以671B参数、仅37B激活量和278.8万H800 GPU小时训练成本,打破大模型“堆算力”叙事。其核心在于四重解耦:MoE实现参数与计算分离,MLA低秩压缩KV缓存至576元素,MTP增稠训练信号,DualPipe将通信藏于计算之中。算法与系统协同设计,使资源瓶颈在多维度同时突破。真正的启示不在于模块创新,而是在约束边界上构建可落地的高效方法论——这正是AI工程时代最稀缺的能力。

小相探索IT世界 1310

【算法拾光】二分查找|第一个错误的版本 + H 指数 II

本文总结二分查找的两类经典应用:一是「第一个错误的版本」,利用布尔二段性(好/坏)采用左边界二分模板,关键在于right = mid而非mid-1;二是「H指数II」,通过二分答案结合嵌套二分求最小引用下标,利用单调性寻找最大合法h。两题分别体现二分左边界与二分答案思想,核心均为数据满足二段性即可二分。掌握后可应对多数二分变种问题。

wuqingyigexiaoba的博客 296

2026年10月26日 论文中期 简历准备 算法能力建设与GPT讨论

你说自己有时觉得学了很久却没有结果,甚至怀疑自己可能根本不适合算法。我不认为现在就有足够的证据得出这个结论。更准确的判断是:你有一定的大模型知识基础,也经历过真实的 Agent 业务开发,但独立编程、实验设计、结果分析和研究表达这些环节,还没有经过足够完整的训练。这与“你没有算法天赋”不是一回事。另一方面,你也需要接受一个现实:如果继续仅仅阅读资料、浏览新仓库,却没有在未来几个月完成可以检验的实验,你的算法能力不会因为学习时间累积得更多,就自动发生质变。现在已经到了需要用输出检验学习成果的阶段。

victory0431的博客 224
上一篇: 听故事学语言 · 第五章 藏在运算符里的别样江湖
下一篇: 听故事学语言 · 第六章 真真假假,到底谁才是真正的证明
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值