初级程序员必备的十大技能之基础数据结构与算法(一)

简介: 教程来源 https://tmywi.cn/ 数据结构与算法是程序员的“内功”:决定代码性能、面试成败与问题解决能力。本文从时间/空间复杂度讲起,详解7大结构与5大算法思想,配原理、代码与执行分析,助你夯实编程根基。

为什么数据结构与算法是程序员的“内功”
数据结构与算法是编程世界的基石。如果把编程比作建造房屋,那么:

编程语言是砖瓦水泥(工具)

数据结构是建筑结构(如何组织材料)

算法是施工方案(如何高效建造)

很多初级程序员会问:“我只是写业务逻辑,需要学算法吗?”

答案是:绝对需要。

理由很简单:

写出高性能代码:同样的功能,算法优劣决定程序是 0.1 秒完成还是 10 秒卡死

面试必考:大厂面试 80% 的时间都在考察数据结构与算法

解决问题的工具:遇到复杂问题,数据结构与算法是你最锋利的武器

代码质量的保障:理解底层原理才能写出健壮的代码

本文将从零开始,带你系统掌握初级程序员必须吃透的 7 大数据结构和 5 大算法思想,每一部分都有详细的原理讲解、代码实现和执行过程分析。

一、时间复杂度与空间复杂度:衡量算法的尺子

在学习具体的数据结构之前,我们必须先学会如何衡量一个算法的好坏。

1.1 什么是时间复杂度?
时间复杂度描述了算法执行时间随输入规模增长的变化趋势。它不关心具体运行时间(因为机器性能不同),而是关心操作次数的增长率。
https://fndvx.cn/
大O表示法:忽略常数项和低阶项,只保留最高阶项。
image.png
1.2 时间复杂度计算实战

// O(1) - 常数时间
// 无论输入多大,操作次数固定
function getFirstElement(arr) {
    return arr[0];  // 只做一次操作
}

function isEven(num) {
    return num % 2 === 0;  // 一次取余,一次比较
}
// O(n) - 线性时间
// 操作次数与输入规模成正比
function findMax(arr) {
    let max = arr[0];
    for (let i = 1; i < arr.length; i++) {  // 循环 n-1 次
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}
// 总操作次数 ≈ n,所以是 O(n)
// O(n²) - 平方时间
// 常见于双重循环
function bubbleSort(arr) {
    const n = arr.length;
    for (let i = 0; i < n; i++) {           // 外层循环 n 次
        for (let j = 0; j < n - 1; j++) {   // 内层循环 n 次
            if (arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
            }
        }
    }
    return arr;
}
// 总操作次数 ≈ n × n = n²,所以是 O(n²)
// O(log n) - 对数时间
// 典型场景:二分查找
function binarySearch(arr, target) {
    let left = 0;
    let right = arr.length - 1;

    while (left <= right) {
        const mid = Math.floor((left + right) / 2);

        if (arr[mid] === target) {
            return mid;
        } else if (arr[mid] < target) {
            left = mid + 1;   // 抛弃左半部分
        } else {
            right = mid - 1;  // 抛弃右半部分
        }
    }
    return -1;
}
// 每次循环将搜索范围减半,操作次数 = log₂(n)
// 当 n=1,000,000 时,log₂(1e6) ≈ 20 次
// O(n log n) - 线性对数时间
// 典型场景:高效排序算法(归并排序、快速排序)
function mergeSort(arr) {
    if (arr.length <= 1) return arr;

    const mid = Math.floor(arr.length / 2);
    const left = mergeSort(arr.slice(0, mid));
    const right = mergeSort(arr.slice(mid));

    return merge(left, right);
}

function merge(left, right) {
    const result = [];
    let i = 0, j = 0;

    while (i < left.length && j < right.length) {
        if (left[i] <= right[j]) {
            result.push(left[i++]);
        } else {
            result.push(right[j++]);
        }
    }

    return result.concat(left.slice(i)).concat(right.slice(j));
}
// 归并排序将数组不断二分(log n 层),每层需要合并 n 个元素
// 总复杂度:n × log n

1.3 常见复杂度对比
image.png
1.4 空间复杂度
空间复杂度描述算法额外消耗的存储空间随输入规模的变化趋势。

// O(1) - 常数空间
// 只使用固定数量的额外变量
function sum(arr) {
    let total = 0;        // 1 个变量
    for (let i = 0; i < arr.length; i++) {
        total += arr[i];   // 复用同一个变量
    }
    return total;
}
// 无论数组多大,只用了 total 和 i 两个变量
// O(n) - 线性空间
// 需要创建与输入规模成比例的额外空间
function duplicateArray(arr) {
    const copy = new Array(arr.length);  // 新数组长度 = n
    for (let i = 0; i < arr.length; i++) {
        copy[i] = arr[i];
    }
    return copy;
}
// 额外空间与输入数组大小成正比
// O(n²) - 平方空间
// 典型场景:创建二维矩阵
function createMatrix(n) {
    const matrix = [];
    for (let i = 0; i < n; i++) {
        matrix[i] = new Array(n);  // 每行有 n 个元素
        for (let j = 0; j < n; j++) {
            matrix[i][j] = 0;
        }
    }
    return matrix;
}
// 总元素个数 = n × n = n²

1.5 复杂度分析技巧

// 技巧1:只看循环嵌套最深的部分
function example1(arr) {
    let sum = 0;                    // O(1)
    for (let i = 0; i < arr.length; i++) {  // O(n)
        sum += arr[i];
    }
    for (let i = 0; i < arr.length; i++) {  // O(n)
        for (let j = 0; j < arr.length; j++) {  // O(n²)
            console.log(i, j);
        }
    }
}
// 总体复杂度 = O(1) + O(n) + O(n²) = O(n²)(取最高阶)

// 技巧2:循环变量以乘法/除法增长的是对数级
function example2(n) {
    let i = 1;
    while (i < n) {
        i = i * 2;  // i 按倍数增长
    }
}
// 复杂度 = O(log n)

// 技巧3:递归算法可以用递归树分析
function fibonacci(n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}
// 复杂度 = O(2ⁿ)(指数爆炸)
相关文章
|
4月前
|
人工智能 运维 架构师
我在 AIP 智能体平台踩过的坑,都在这篇企业 AI 落地经验里了
软件架构师罗小东分享企业AI落地实战经验:聚焦AIP智能体平台建设中的真实坑点与解法——涵盖智能体全生命周期管理、多源知识库语义检索、MCP工具集成及多模型中立架构设计,强调“解决问题”而非堆砌功能。(239字)
|
安全 数据安全/隐私保护
亲手把360奇安信软件卸载了,爽!
由于工作原因,在上一家公司安装了360奇安信安全软件,到了下一个公司还需要安装另一个安全软件,这个必须要卸载,卸载!卸载!
2658 0
 亲手把360奇安信软件卸载了,爽!
|
4月前
|
人工智能 弹性计算 安全
Hermes Agent 极速部署指南+免费Token领取教程
Hermes Agent是全球增长最快(GitHub星标超14万)的开源自进化智能体框架,具备持久记忆、自主学习与技能优化能力。阿里云提供一键部署方案,2步即可完成配置,轻松启用越用越聪明的AI助手。
900 1
|
4月前
|
XML 前端开发 程序员
初级程序员必备的十大技能之 API 接口与前后端联调(一)
教程来源 http://qeext.cn/ 本文系统讲解API设计规范(RESTful/GraphQL)、HTTP协议核心(方法、状态码、头信息)、前后端联调流程及调试工具,助你打造标准化、高可用接口,打破前后端协作孤岛。
|
4月前
|
存储 程序员 Linux
初级程序员必备的十大技能之 Git 版本控制(一)
教程来源 http://xcfsr.cn Git是程序员的“后悔药”与“时光机”:可随时回退错误修改、隔离并行开发、一键恢复稳定版本。作为分布式版本控制系统,它本地全量存储、离线可用、安全可靠,支撑全球90%以上团队高效协作。
|
4月前
|
Linux 程序员 网络安全
初级程序员必备的十大技能之基础 Linux 命令(一)
教程来源 https://qcycj.cn/ 本文系统讲解程序员必备的Linux核心命令,涵盖文件操作、文本处理、权限管理、进程与网络工具等,结合原理、参数详解及实战案例,助你高效部署、排查与运维——无论用Windows还是macOS,Linux都是程序员不可或缺的“第二操作系统”。
|
4月前
|
自然语言处理 JavaScript 前端开发
初级程序员必备的十大技能之计算机基础必备(五)
教程来源 http://vbzcj.cn 本节详解代码运行本质:从C/Java的静态编译(词法→语法→语义→中间码→优化→目标码),到JS的JIT动态编译(AST→字节码→热点优化);并结合CPU 100%、内存泄漏等线上案例,贯通编译原理与实战排障。
|
4月前
|
数据采集 人工智能 自然语言处理
淄博企业布局GEO(AI优化):技术层面的思考框架与落地指南
本文聚焦淄博制造业、本地服务及跨境企业,解析生成式引擎优化(GEO)落地路径:破除“GEO=AI版SEO”误区,强调语义理解、结构化呈现与权威信源建设;提供“基础搭建—核心优化—迭代升级”三步技术方案,并针对地域特性给出本地语义适配、多模态呈现等实操指南,助力企业抢占AI决策链“答案主权”。
266 1
|
3月前
|
缓存 API 调度
DeepSeekFlash 批处理偶发超时,​D​М‌X​Α‌РΙ 调稳记录
DeepSeekFlash因高并发下偶发超时,需工程化调用保障稳定性;DМXΑРΙ提供统一API底座,实现鉴权、重试、上下文裁剪、可观测性等能力,助力deepseek-v4-flash从“可用”迈向“可规模化默认部署”。
|
10月前
|
人工智能 边缘计算 监控
AR眼镜在核电操作智能监护应用技术方案|阿法龙XR云平台
基于AR眼镜的多模态智能监护系统,融合视觉、语音与AI技术,实现核电操纵员“唱票-操作-复核”全流程实时监控与智能干预。通过工业级AR设备与“边缘+云端”架构,提供设备识别、语音交互、程序解析与声光报警功能,提升操作准确性与安全性,助力核电数字化转型。(238字)

热门文章

最新文章