- 时间复杂度是用来估算程序“数据变大时变慢多少”的标尺,不看具体跑了几毫秒,只看增长趋势。记作 O(…) 时,括号里只留增长最快的那一项,常数和低阶项都省掉,因为数据足够大时它们说了不算。最常见的量级按从快到慢排:O(1)、O(log n)、O(n)、O(n log n)、O(n²)、O(2ⁿ)。O(1) 是不管数据多大都只做固定几步,比如按下标取数组元素;O(log n) 是每步砍掉一半,比... 时间复杂度是用来估算程序“数据变大时变慢多少”的标尺,不看具体跑了几毫秒,只看增长趋势。记作 O(…) 时,括号里只留增长最快的那一项,常数和低阶项都省掉,因为数据足够大时它们说了不算。最常见的量级按从快到慢排:O(1)、O(log n)、O(n)、O(n log n)、O(n²)、O(2ⁿ)。O(1) 是不管数据多大都只做固定几步,比如按下标取数组元素;O(log n) 是每步砍掉一半,比...
- Redis 是一种把数据主要放在内存里的开源数据结构存储系统,常被用作缓存、消息队列和实时排行榜等场景的组件。它的速度来自内存读写和简单高效的数据结构,但这也意味着使用方式和传统关系型数据库很不一样:键的设计、过期时间的设置、持久化策略,都会直接影响系统的正确性和稳定性。本文从新手视角出发,把五种常用数据结构、缓存常见问题和持久化取舍一次讲清楚。 一、先建立一个正确的认知:Redis 适合做... Redis 是一种把数据主要放在内存里的开源数据结构存储系统,常被用作缓存、消息队列和实时排行榜等场景的组件。它的速度来自内存读写和简单高效的数据结构,但这也意味着使用方式和传统关系型数据库很不一样:键的设计、过期时间的设置、持久化策略,都会直接影响系统的正确性和稳定性。本文从新手视角出发,把五种常用数据结构、缓存常见问题和持久化取舍一次讲清楚。 一、先建立一个正确的认知:Redis 适合做...
- 十条数据怎么存都行,一万条、十万条时,存法不对程序就会慢得受不了。数据结构就是研究“数据怎么摆”的学问:摆法对了,查找、增删都快。本文用最常见的四种结构,数组、链表、哈希表、树,讲清各自擅长什么、代价是什么,看完就懂选结构其实就是在做取舍。很多新手以为程序快慢全看语言和机器,其实同样一台机器、同一门语言,数据存法不同,速度能差出几百倍。举个最直观的例子:在一本没有目录、没有页码的书里找一句话... 十条数据怎么存都行,一万条、十万条时,存法不对程序就会慢得受不了。数据结构就是研究“数据怎么摆”的学问:摆法对了,查找、增删都快。本文用最常见的四种结构,数组、链表、哈希表、树,讲清各自擅长什么、代价是什么,看完就懂选结构其实就是在做取舍。很多新手以为程序快慢全看语言和机器,其实同样一台机器、同一门语言,数据存法不同,速度能差出几百倍。举个最直观的例子:在一本没有目录、没有页码的书里找一句话...
- 一、问题从哪里来做爬虫时,同一个 URL 被重复抓取几十次,既浪费带宽还可能被目标站封 IP;做缓存时,大量根本不存在的 key 穿透到数据库,直接把 DB 打垮;做消息推送时,同一条消息被重复下发,用户体验极差。这些场景的共同点是:需要快速判断“某个元素之前是否出现过”,而且数据量巨大,动辄上亿。最直观的做法是把所有元素塞进 HashSet。假设有 1 亿个 URL,每个平均 64 字节,... 一、问题从哪里来做爬虫时,同一个 URL 被重复抓取几十次,既浪费带宽还可能被目标站封 IP;做缓存时,大量根本不存在的 key 穿透到数据库,直接把 DB 打垮;做消息推送时,同一条消息被重复下发,用户体验极差。这些场景的共同点是:需要快速判断“某个元素之前是否出现过”,而且数据量巨大,动辄上亿。最直观的做法是把所有元素塞进 HashSet。假设有 1 亿个 URL,每个平均 64 字节,...
- 斜率在垂直线处没有定义,在近垂直线处放大误差,还会丢掉方向。用「两个点 + 叉积」或「中点 + 法向量 + 点积」表示直线和半平面,表示与判断阶段不需要除以坐标差;除法只留在确实需要求交的地方,并且每一处都能说清分母在什么条件下不为零。 斜率在垂直线处没有定义,在近垂直线处放大误差,还会丢掉方向。用「两个点 + 叉积」或「中点 + 法向量 + 点积」表示直线和半平面,表示与判断阶段不需要除以坐标差;除法只留在确实需要求交的地方,并且每一处都能说清分母在什么条件下不为零。
- 前十篇我们走完了排序的"完整生命周期":《C语言常见排序算法详解》:比较排序的写法、复杂度、稳定性;《从会写到会用:C语言排序算法的实战选择与优化》:场景选型、qsort 泛型、快排优化;《突破 O(n log n):C语言非比较排序实战》:计数/基数/桶排序;《数据放不进内存怎么办:C语言外部排序与海量数据排序实战》:分块、多路归并;《让多核一起干活:C语言并行排序与多线程实战》:pthr... 前十篇我们走完了排序的"完整生命周期":《C语言常见排序算法详解》:比较排序的写法、复杂度、稳定性;《从会写到会用:C语言排序算法的实战选择与优化》:场景选型、qsort 泛型、快排优化;《突破 O(n log n):C语言非比较排序实战》:计数/基数/桶排序;《数据放不进内存怎么办:C语言外部排序与海量数据排序实战》:分块、多路归并;《让多核一起干活:C语言并行排序与多线程实战》:pthr...
- Java 数组排序完全教程数组排序是 Java 编程中最基础也最常用的操作之一。本教程将从多个角度系统讲解 Java 中数组排序的实现方法,涵盖内置 API、经典算法手写实现以及实用技巧。 一、准备工作:认识 Java 数组在开始排序之前,先明确数组的基本特性:数组是定长的,创建后长度不可变数组元素类型必须一致索引从 0 开始,范围 0 ~ length-1int[] arr = {5, ... Java 数组排序完全教程数组排序是 Java 编程中最基础也最常用的操作之一。本教程将从多个角度系统讲解 Java 中数组排序的实现方法,涵盖内置 API、经典算法手写实现以及实用技巧。 一、准备工作:认识 Java 数组在开始排序之前,先明确数组的基本特性:数组是定长的,创建后长度不可变数组元素类型必须一致索引从 0 开始,范围 0 ~ length-1int[] arr = {5, ...
- 为什么自己写给内部小工具加定时能力时,我先用了现成的 cron 库,遇到两个问题:表达式写错时只返回空数组,不知道错在哪;*/7 这种不能整除的步长,实际命中和我以为的不一样。于是自己写了一个五百行不到的解析器,把六个边界整理如下。一、步长的起点不是零*/7 在分钟位,是从 0 开始每 7 分钟,命中 0、7、14、21、28、35、42、49、56,共 9 个值,不是 60 除以 7 取整... 为什么自己写给内部小工具加定时能力时,我先用了现成的 cron 库,遇到两个问题:表达式写错时只返回空数组,不知道错在哪;*/7 这种不能整除的步长,实际命中和我以为的不一样。于是自己写了一个五百行不到的解析器,把六个边界整理如下。一、步长的起点不是零*/7 在分钟位,是从 0 开始每 7 分钟,命中 0、7、14、21、28、35、42、49、56,共 9 个值,不是 60 除以 7 取整...
- 为什么要自己写一个 cron 解析器给一个内部小工具加定时能力时,我先用了现成的 cron 库,结果遇到两个问题:表达式写错时只返回空数组,完全不知道错在哪;*/7 这种不能整除的步长,实际命中时间和我以为的不一样。后来干脆自己写了一个解析器,五百行不到,反而更清楚。下面把其中六个容易出错的边界整理出来。边界一:步长的起点不是零*/7 在分钟位上,含义是从 0 开始每 7 分钟,命中 0、7... 为什么要自己写一个 cron 解析器给一个内部小工具加定时能力时,我先用了现成的 cron 库,结果遇到两个问题:表达式写错时只返回空数组,完全不知道错在哪;*/7 这种不能整除的步长,实际命中时间和我以为的不一样。后来干脆自己写了一个解析器,五百行不到,反而更清楚。下面把其中六个容易出错的边界整理出来。边界一:步长的起点不是零*/7 在分钟位上,含义是从 0 开始每 7 分钟,命中 0、7...
- 一直知道dict是哈希表、查询O(1),但O(1)是怎么来的、最坏会发生什么,我是读了CPython的dictobject实现笔记后才算真明白。顺便发现dict的内部结构和教科书版的「链地址法」并不一样。查找的路径dict底层维护一个Entry数组。查找key时先用hash(key)算出哈希值,再对数组长度取模定位槽位,比较槽里存的哈希值和key是否都相等,命中就返回。整条路径没有遍历,所以... 一直知道dict是哈希表、查询O(1),但O(1)是怎么来的、最坏会发生什么,我是读了CPython的dictobject实现笔记后才算真明白。顺便发现dict的内部结构和教科书版的「链地址法」并不一样。查找的路径dict底层维护一个Entry数组。查找key时先用hash(key)算出哈希值,再对数组长度取模定位槽位,比较槽里存的哈希值和key是否都相等,命中就返回。整条路径没有遍历,所以...
- 缓存穿透那阵子,恶意请求用不存在的ID狂刷接口,每次都回源打数据库。加了个布隆过滤器做前置判断,不存在的key直接拦下,数据库QPS立刻回落。这个结构的误判特性值得每个做缓存的人理解一遍。结构与原理一个m位的位数组加k个哈希函数。插入元素时,k个哈希各算出一个位置,置1。查询时同样算k个位置,全为1才「可能存在」,任一为0就「一定不存在」:importhashlibclassBloomFil... 缓存穿透那阵子,恶意请求用不存在的ID狂刷接口,每次都回源打数据库。加了个布隆过滤器做前置判断,不存在的key直接拦下,数据库QPS立刻回落。这个结构的误判特性值得每个做缓存的人理解一遍。结构与原理一个m位的位数组加k个哈希函数。插入元素时,k个哈希各算出一个位置,置1。查询时同样算k个位置,全为1才「可能存在」,任一为0就「一定不存在」:importhashlibclassBloomFil...
- 三角网格可以用一条整数等式做体检:3F = 2E − h,h 是只属于一个三角形的边数。这条式子很便宜,能抓非流形边和重复三角形;但如果 E 和 h 都从同一份三角形列表推出来,它接近恒真,抓不到一个干净的洞。这篇讲清公式怎么来、h 为什么不能换成凸包顶点数,以及它真正的检验力在哪里。 三角网格可以用一条整数等式做体检:3F = 2E − h,h 是只属于一个三角形的边数。这条式子很便宜,能抓非流形边和重复三角形;但如果 E 和 h 都从同一份三角形列表推出来,它接近恒真,抓不到一个干净的洞。这篇讲清公式怎么来、h 为什么不能换成凸包顶点数,以及它真正的检验力在哪里。
- Redis 是一种基于内存的开源数据结构存储系统,常被用作数据库、缓存和消息中间件。它把数据放在内存中读写,速度很快,同时支持持久化到磁盘,因此既能扛住高并发读请求,也能在重启后恢复数据。 安装与启动 在 Linux 上安装 Redis 通常有两种方式:用系统包管理器安装,或者从源码编译。包管理器方式最省事,安装后可以用 systemctl 启动服务并设置开机自启动;源码方式则适合想指定版本... Redis 是一种基于内存的开源数据结构存储系统,常被用作数据库、缓存和消息中间件。它把数据放在内存中读写,速度很快,同时支持持久化到磁盘,因此既能扛住高并发读请求,也能在重启后恢复数据。 安装与启动 在 Linux 上安装 Redis 通常有两种方式:用系统包管理器安装,或者从源码编译。包管理器方式最省事,安装后可以用 systemctl 启动服务并设置开机自启动;源码方式则适合想指定版本...
- 一、前言在日常开发中,数据库查询几乎是所有业务系统都绕不开的环节。当数据量只有几百条时,即使没有任何优化,查询速度通常也很快。但随着业务发展,数据量从几万条增长到几百万条,甚至上千万条,原本简单的 SQL 查询可能开始变得缓慢。例如:SELECT * FROM users WHERE username = 'zhangsan';如果 users 表中有 1000 万条记录,数据库如何快速找到... 一、前言在日常开发中,数据库查询几乎是所有业务系统都绕不开的环节。当数据量只有几百条时,即使没有任何优化,查询速度通常也很快。但随着业务发展,数据量从几万条增长到几百万条,甚至上千万条,原本简单的 SQL 查询可能开始变得缓慢。例如:SELECT * FROM users WHERE username = 'zhangsan';如果 users 表中有 1000 万条记录,数据库如何快速找到...
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签