ARTS 0830: 有效括号、LLM 在预测下一个词与真正昂贵的是逐对象 new/free

简介: ARTS 是一项技术精进计划:每周完成Algorithm(算法题,如栈实现与括号匹配)、Review(英文技术文章点评,如LLM原理)、Tips(实用技巧,如macOS防休眠)、Share(深度思考分享,如批判“十亿美元错误”迷思),系统提升工程能力。(239字)

每周完成一个 ARTS: 至少做一个 leetcode 的算法题、阅读并点评至少一篇英文技术文章、学习至少一个技术技巧、分享一篇有观点和思考的技术文章。(也就是 Algorithm、Review、Tips、Share 简称 ARTS)

Algorithm

这周我们写一个关于栈相关的题目。我们来介绍一下什么是栈,并且栈可以这么实现?

1、栈(stack)是一种遵循先入后出逻辑的线性数据结构。支持的操作是 pop(出栈)、push(入栈)、peek(访问栈顶元素)

2、栈如何实现,分为两种实现方式:数组和链表,两种方式各有优缺点:

1)数组:时间效率相对不稳定,因为如果出现数组扩容的情况插入效率会下降很多;空间效率可能会浪费一些空间,因为扩容的时候会数组长度 x 2

2)链表:时间效率更稳定一些;需要存储额外的指针,占用空间相对较大

对应的简单代码实现:

1)Array实现:

    // Array 实现栈
    private final ArrayList<Integer> stack = new ArrayList<>(10);

    public void push(Integer i) {
   
        stack.add(i);
    }

    public Integer pop() {
   
        int index = stack.size() - 1;
        return stack.remove(index);
    }

    public Integer peek() {
   
        return stack.get(stack.size() - 1);
    }

    public boolean isEmpty() {
   
        return stack.isEmpty();
    }

    public int size() {
   
        return stack.size();
    }

2)链表实现:

这里使用的 ListNode 有两个属性,如果是不使用 ListNode 的 next 属,就需要从 head 找到需要 peek 的 pre 节点,还需要进行循环判断找到 pre 节点(也就是需要 peek 的前一个)

    private ListNode top; 
    private int size = 0;

    public void push(Integer i) {
   
        top = new ListNode(i, top);
        size++;
    }

    public Integer pop() {
   
        if (top == null) {
   
            return null;
        }
        Integer val = top.val;
        top = top.next;
        size--;
        return val;
    }

    public Integer peek() {
   
        return top == null ? null : top.val;
    }


    public class ListNode {
   
        int val;
        ListNode next;

        ListNode() {
   
        }

        ListNode(int val) {
   
            this.val = val;
        }

        ListNode(int val, ListNode next) {
   
            this.val = val;
            this.next = next;
        }
    }

LeetCode 题目

image-20260830112609834

1)第一次做感觉用 Stack 还真是没有想到,一开始还以为这个 和 ([]) 是两种情况

2)更多的情况举一些具体的例子,来辅助:

输入 "()[]{}"

第一次:输入 ( ,栈 空

第二次:输入 ),栈 (,进行判断是否匹配,发现匹配就推出

等等

输入 "([)]"

第一次:输入 ( ,栈空

第二次:输入 [,栈 ( [

第三次:输入 ),栈 ([)

第四次:输入 ],栈 ([)]

最终栈还有 stack 有数据,就证明不匹配

输入 "([])"

第一次:输入 ( ,栈空

第二次:输入 [,栈 ([

第三次:输入 ],进行对比发现 stack.peek 元素和当前进行匹配,那么最终栈的元素 (

第四次:输入 ),进行对比发现 stack.peek 元素和当前进行匹配,那么最终栈的元素为空

最终栈的 stack 没有数据,证明是 valid 的

class Solution {
   

    private Map<Character, Character> map = new HashMap<>();

    {
   
        map.put('(', ')');
        map.put('[', ']');
        map.put('{', '}');
    }

    public boolean isValid(String s) {
   
        if (s.length() % 2 != 0) {
   
            return false;
        }
        Stack<Character> stack = new Stack<>();
        char[] chars = s.toCharArray();
        for (char aChar : chars) {
   
            if (!stack.isEmpty() && Objects.equals(aChar, map.get(stack.peek()))) {
   
                stack.pop();
                continue;
            } 
            stack.push(aChar);

        }
        return stack.isEmpty();
    }
}

Review

文章 https://www.3blue1brown.com/lessons/gpt 关于 LLM 是如何工作的。

关于 LLM 是如何工作的,有大佬是这样说的:

想象一下,有一些书,而书中有一个单词分隔符。这个单词分隔符总是保存某个单词在那个被分隔的单词之前出现了什么,并把它保存下来。通过概率和数学计算,LLM 使用这些分隔出来的单词进行训练,并尝试预测下一个单词是什么。所以在我给你的这个上下文中,这个单词分隔符会保存书中的每一个单词,以及哪个单词出现在它之前、哪个单词出现在它之后,例如“bread pudding”,然后是“new bread”,然后是“new bread is good”“too good!” 然后,当 LLM 收到问题“is bread pudding good?” 时,你会从你这里收到“pudim”“bread”和“good”这些词,并返回短语“bread pudding is good!”。这个例子很荒谬也很简单,但就是这么回事。

很荒谬但是 LLM 就是这样工作的,其实就像人脑的神经元也是一样的,一个很简单但是每一个连接起来就变得异常复杂,可以处理很多复杂的问题。

Tips

1)MacOS 不睡眠的命令:

caffeinate -d

2)用 pi 在需要 -p 的模式下还是挺好用的。比如批量校验文字是否有问题,可以用 Python 脚本 + pi 实现

3)语音转文字可以使用 whisper-cpp 搭配 large-v3-turbo 实现。

下载 whisper-cpp:

brew install whisper-cpp

下载模型:

注意:1)不要设置系统 proxy 2)需要设置 Token 获取链接

hf download ggerganov/whisper.cpp \
  ggml-large-v3-turbo.bin

Share

文章:https://www.gingerbill.org/article/2026/01/02/was-it-really-a-billion-dollar-mistake/

「十亿美元错误」可能高估了 null 的问题。真正昂贵的,是「每个对象单独 new/free」的个体思维。

Tony Hoare 把空引用称为「十亿美元错误」,但 Odin 作者 gingerBill 认为,null 本身未必是最致命的问题。

在 C/Odin 里,空指针反而是最好发现、也相对少见的错误,更常见的是 use-after-free、指针运算错误和访问未映射内存。去掉 null,也只是把问题转移到「到处检查」或「强制初始化」上。

更深层的问题是内存管理方式:一个对象一个对象地分配和释放。

更合理的思路是把生命周期相同的数据放在一起,用 arena、pool、scratch (下面有介绍)这类方式批量管理。这样可以减少 malloc/free、减少指针和管理开销,也能避免大量无意义的逐对象初始化。

  • Arena:预先申请大块内存,统一分配,最后整体释放。
  • Pool:预先准备对象,需要时取出,用完后归还复用。
  • Scratch:专门存放临时数据,用完后一次性清空释放。

真正值得警惕的,可能不是 null,而是我们习惯把一组数据拆成一个个独立对象,然后逐个管理。

目录
相关文章
|
18天前
|
人工智能 缓存 前端开发
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
DeepSeek Harness + DeepSeek V4 Pro 项目实战保姆级教程!手把手带你从零安装开源 AI 编程工具,开发架构图、知识讲解网站、3D 网页游戏、全栈 AI 应用 4 个项目,覆盖运行模式选择、插件安装与开发,看看能不能对标 Claude。
12951 81
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
|
6天前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
|
11天前
|
Web App开发 人工智能 API
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
DeepSeek Harness 精选插件推荐合集,从图片识别、浏览器操控、多 Agent 协作到手机远程控制,一口气带你看完 DSH 社区热门的十几个插件,覆盖技能扩展、UI 界面增强、整活玩法三大类,让你的鲸鱼变得更强。
1661 3
|
人工智能 JavaScript 开发工具
DeepSeek Harness 本地安装与使用指南
DeepSeek Harness(DSH)是DeepSeek AI开源的Agent运行框架,支持本地文件操作、命令执行与工具调用。基于Cordis插件架构,具备高扩展性与强可控性,适合开发者搭建可控Agent环境或开展模型基准测试。当前为开发者预览版,需Node.js环境,推荐先用`npx @deepseek-ai/dsh web`快速体验。
5069 0
|
12天前
|
人工智能 Java BI
【AI】DeepSeek Harness 安装、运行、管理插件
本文介绍了如何运行DeepSeek开源的Agent框架DeepSeek Harness(dsh)。主要内容包括:使用nvm安装适配的Node版本;通过代理加速克隆GitHub源码;使用pnpm安装依赖并启动项目;配置DeepSeek API Token;安装扩展功能的插件。该框架自带Web界面,支持模型适配、文件编辑等插件化功能
1816 1
|
14天前
|
人工智能 JavaScript 测试技术
保姆级教程:DeepSeek Harness从安装到跑通测试,30分钟上手
DeepSeek Harness是DeepSeek开源的AI Agent运行时,主打“一行命令安装、5分钟跑通”。它让模型真正动手干活——读代码、跑测试、分析失败、生成修复方案。本文手把手教你30分钟从零上手,覆盖安装、配置、实测及避坑指南,助你快速掌握下一代AI编程范式。
|
16天前
|
开发工具 Swift git
DeepSeek Harness 插件推荐:4 款开源神器让写代码直接起飞
DeepSeek Harness 插件推荐:ModLens 视觉、Web UI 全家桶、Mac 原生与 GenUI 渲染,4 款开源插件给纯文本模型补齐短板。
2039 6
DeepSeek Harness 插件推荐:4 款开源神器让写代码直接起飞
|
13天前
|
人工智能 JavaScript 测试技术
从 0 到 1,DeepSeek Harness 保姆级安装与使用教程!
DeepSeek Harness是DeepSeek推出的开源Agent运行框架,秉持“一切皆插件”理念,支持模型、工具、技能、工作流等全模块自由替换与扩展。其核心Cordis内核实现动态插件管理,赋能Agent自进化。已成GitHub史上增速最快开源项目(15w+ Star),标志着国内大模型从拼价格转向重架构与生态的新拐点。
1312 6
从 0 到 1,DeepSeek Harness 保姆级安装与使用教程!