当前位置: 首页 > article >正文

数据结构与算法入门 Day 0:程序世界的基石与密码

🌟数据结构与算法入门 Day 0:程序世界的基石与密码🔑

ps:接受到了不少的私信反馈,说应该先把前置的知识内容做一个梳理,所以把昨天的文章删除了,重新开启今天的博文写作

Hey 小伙伴们!今天我们要一起推开数据结构与算法的大门啦!🚪✨这篇笔记特别适合:

- 刚接触编程的小白🐣

- 想系统巩固基础的同学📚

- 面试前需要快速复习的勇者💪

一、数据结构的DNA🧬

🌱 先导概念:程序世界的原子与分子

1.1 数据 vs 算法(生命体的物质与灵魂)
// 数据就像细胞
int student_scores[] = {90, 85, 78}; // 算法如同基因表达过程
// 算法的设计取决于所选定的逻辑结构,而算法的实现则要考虑到所用的存储结构
void calculate_avg(int arr[], int size) {int sum = 0;for(int i=0; i<size; i++) {sum += arr[i];  // 数据加工}printf("平均分:%d", sum/size);  // 信息输出
}
1.2 五层概念解剖

在这里插入图片描述

1.3 数据结构的组成要素

在这里插入图片描述


🧪 综合实验:学生管理系统DNA拆解

1 系统要素映射表
概念具体实现C语言对应
数据学生信息原始值int student_id
数据元素单个学生完整档案struct Student
数据项学号/姓名/成绩结构体成员变量
数据对象全体学生数据库Student class1[50]
数据结构按学号组织的存储方式结构体数组+排序算法
数据类型学生信息抽象模板typedef struct

2 算法实例:成绩查询系统

// 结构定义
typedef struct {long id;char name[20];float score;
} Student;// 线性查找算法
int find_student(Student arr[], int size, long target_id) {for(int i=0; i<size; i++) {if(arr[i].id == target_id) {  // 数据比对printf("找到学生:%s,分数:%.1f", arr[i].name, arr[i].score);return i;}}return -1;
}

二、算法五性验证🔍

特性内涵解析验证要点
有穷性 🕒执行步骤有限,时间可接受循环终止条件、递归深度控制
确定性 🎯无二义性,相同输入必得相同输出条件判断明确,无随机因素
可行性 ⚙️可通过基本操作实现使用语言支持的数据类型和运算
输入 📥零个或多个外部输入参数合法性检查
输出 📤至少一个有效输出返回值/参数输出/文件写入等形式

2.1 学生管理系统DNA验证实验 🧪

系统核心代码回顾
typedef struct {long id;          // 学号(数据项)char name[20];    // 姓名(数据项)float score;      // 成绩(数据项)
} Student;           // 数据元素Student class[50];   // 数据对象(50人班级)// 查找算法
int find_student(long target_id) {for(int i=0; i<50; i++) {  // 明确循环边界if(class[i].id == target_id) {  // 确定比较条件printf("找到学生:%s", class[i].name);return i;  // 有效输出}}return -1;  // 异常输出
}
五性验证表
特性验证过程测试用例结果
有穷性循环最多执行50次 → 有限步骤target_id=不存在学号
确定性相同学号必定定位到同一学生重复输入相同学号
可行性仅使用数组遍历和数值比较基本操作正常学号输入
输入接受long型参数输入"20231234"
输出返回int型索引或-1找到返回位置,未找到返回-1

2.2 经典算法三重验证 🏋️♂️

2.2.1 二分查找(确定性典范)
int binary_search(int arr[], int size, int target) {int left = 0, right = size-1;  // 明确初始条件while(left <= right) {        // 循环终止条件int mid = left + (right-left)/2;  // 防止溢出if(arr[mid] == target) return mid;else if(arr[mid] < target) left = mid+1;  // 确定路径else right = mid-1;}return -1;  // 必有输出
}
2.2.2 递归算法(有穷性挑战)
int factorial(int n) {if(n <= 1) return 1;              // 递归基确保终止else return n * factorial(n-1);    // 规模递减
}
特性风险点解决方案
有穷性未处理负数导致无限递归添加参数校验 if(n<0) return -1;
可行性阶乘值可能溢出int范围改用long类型
输出未定义非法输入的返回值明确错误码机制
2.2.3 动态规划(可行性示范)
int fib(int n) {int dp[n+1];                 // 辅助空间dp[0] = 0; dp[1] = 1;        // 明确初始值for(int i=2; i<=n; i++){     // 严格递增dp[i] = dp[i-1] + dp[i-2]; // 状态转移}return dp[n];                // 确定输出
}

2.3 算法特性关系图谱 🔗

在这里插入图片描述

💡 避坑指南:在实现递归算法时,建议画出递归树验证有穷性;对浮点运算要特别注意确定性问题(如0.1+0.2≠0.3)!


三、复杂度计算手册📚(C语言特供版)

3.1、复杂度运算方法论 🧮

在这里插入图片描述

3.1.1 大O表示法黄金法则
  • 去常原则O(3n²+5n) → O(n²)
  • 去低阶项O(n³ + 2n²) → O(n³)
  • 系数归一O(2n) → O(n)
  • 对数底数忽略O(log₂n) → O(log n)
3.1.2 复杂度计算四步法
  1. 识别基本操作:找出最频繁执行的核心语句
  2. 确定输入规模n:数组长度/链表节点数等
  3. 计算执行次数f(n):建立数学表达式
  4. 简化表达式:应用大O法则

3.2、时间复杂度实战演练 💻

3.2.1 新手村:线性结构复杂度
// 案例1:O(1) 数组随机访问
int get_first(int arr[], int n) {return arr[0];  // 仅执行1次访问
}// 案例2:O(n) 顺序查找
int linear_search(int arr[], int n, int target) {for(int i=0; i<n; i++) {  // 循环n次if(arr[i] == target) return i;}return -1;
}// 案例3:O(n²) 冒泡排序
void bubble_sort(int arr[], int n) {for(int i=0; i<n-1; i++) {       // 外层n次for(int j=0; j<n-i-1; j++) {  // 内层n-i次if(arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}} // 总次数 = Σ(n-i) ≈ n²/2 → O(n²)
}
2.2 进阶区:递归与分治复杂度
// 案例4:O(2ⁿ) 斐波那契(递归版)
int fib(int n) {if(n <= 1) return n;return fib(n-1) + fib(n-2);  // 每层分裂2个子问题
}// 案例5:O(n) 斐波那契(动态规划版)
int dp_fib(int n) {int dp[n+1];dp[0]=0; dp[1]=1;for(int i=2; i<=n; i++){  // 单层循环dp[i] = dp[i-1]+dp[i-2];}return dp[n];
}// 案例6:O(n log n) 归并排序
void merge_sort(int arr[], int l, int r) {if(l < r) {int mid = l + (r-l)/2;merge_sort(arr, l, mid);    // T(n/2)merge_sort(arr, mid+1, r);  // T(n/2)merge(arr, l, mid, r);      // O(n)} // 递归方程:T(n)=2T(n/2)+O(n) → O(n log n)
}

3.3、空间复杂度深度解析 🧠

在这里插入图片描述

3.3.1 空间复杂度类型
类型特征示例
O(1)固定大小的额外空间临时变量、指针
O(n)与输入规模成线性关系动态数组、哈希表
O(n²)二维数据结构邻接矩阵、二维数组
O(log n)递归栈空间二分查找递归版
3.3.2 空间复杂度对比实验
// 实验1:O(1) 原地反转数组
void reverse_array(int arr[], int n) {  // 仅用1个临时变量for(int i=0; i<n/2; i++) {int temp = arr[i];arr[i] = arr[n-1-i];arr[n-1-i] = temp;}
}// 实验2:O(n) 斐波那契DP版(见案例5)// 实验3:O(n) 递归阶乘
int factorial(int n) {if(n <= 1) return 1;return n * factorial(n-1);  // 递归深度n → 栈空间O(n)
}

3.4 复杂度速查表(程序员必备)

操作场景时间复杂度空间复杂度典型场景
数组随机访问O(1)O(1)arr[i]
链表插入节点O(1)O(1)已知插入位置
哈希表查找O(1)O(n)无冲突的理想情况
平衡树操作O(log n)O(n)AVL树、红黑树
图的邻接矩阵遍历O(n²)O(n²)存储所有顶点关系

四、终极知识图谱🗺️

在这里插入图片描述


🔜下期剧透:顺序表的奇幻之旅

明天我们将深入:

  • 🧩顺序表的底层内存原理
  • ⚡C语言实现动态数组
  • 💣内存管理的常见陷阱
  • 🔥时间复杂度实测对比(附性能测试代码)

准备好你的编译器,我们明天一起coding!🚀

💡学习小贴士:建议在本地IDE中运行所有代码示例,尝试修改参数观察运行结果的变化。复杂度分析部分可以尝试画出「语句执行频度表」辅助理解哦~

相关文章:

数据结构与算法入门 Day 0:程序世界的基石与密码

&#x1f31f;数据结构与算法入门 Day 0&#xff1a;程序世界的基石与密码&#x1f511; ps&#xff1a;接受到了不少的私信反馈&#xff0c;说应该先把前置的知识内容做一个梳理&#xff0c;所以把昨天的文章删除了&#xff0c;重新开启今天的博文写作 Hey 小伙伴们&#xff…...

vscode终端运行windows服务器的conda出错

远程windows服务器可以运行&#xff0c;本地vscode不能。 打开vscode settings.json文件 添加conda所在路径...

Elasticsearch 查询排序报错总结

Elasticsearch 查询sort报错总结 文章目录 Elasticsearch 查询`sort`报错总结错误1、使用Es对 `sort` 进行排序字段类型的要求1.1、数值类型(如 `integer`、`long`、`float`、`double`)1.2、日期类型(如 `date`)1.3、字符串类型(如 `keyword`、`text`)1.4、布尔类型(`bo…...

“大湾区珠宝艺境花园”璀璨绽放第五届消博会

2025年4月13日&#xff0c;第五届中国国际消费品博览会&#xff08;以下简称"消博会"&#xff09;重要主题活动——《大湾区珠宝艺境花园》启动仪式在海南国际会展中心2号馆隆重举行。由广东省金银珠宝玉器业厂商会组织带领粤港澳大湾区优秀珠宝品牌&#xff0c;以“…...

十、自动化函数+实战

Maven环境配置 1.设计测试用例 2.创建空项目 1&#xff09;添加需要的依赖pom.xml <dependencies> <!-- 截图配置--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</…...

Day09【基于jieba分词和RNN实现的简单中文分词】

基于jieba分词和RNN实现的中文分词 目标数据准备主程序预测效果 目标 本文基于给定的中文词表&#xff0c;将输入的文本基于jieba分词分割为若干个词&#xff0c;词的末尾对应的标签为1&#xff0c;中间部分对应的标签为0&#xff0c;同时将分词后的单词基于中文词表做初步序列…...

自动化测试——selenium

简介 Selenium 是一个广泛使用的自动化测试工具&#xff0c;主要用于 Web 应用程序的自动化测试。它能实现的功能是网页的自动化操作&#xff0c;例如自动抢票刷课等。同时你应该也见到过有些网站在打开之后并没有直接加载出网站的所有内容&#xff0c;比如一些图片等等&#x…...

java和python实现mqtt

说明&#xff1a; MQTT 异步通信系统功能文档 系统概述 本系统基于 MQTT 协议实现异步通信&#xff0c;包含三个核心组件&#xff1a; Broker&#xff08;消息代理&#xff09;&#xff1a;负责消息的路由和转发。 Client&#xff08;主客户端&#xff09;&#xff1a;定时发…...

5.9 《GPT-4调试+测试金字塔:构建高可靠系统的5大实战策略》

5.4 测试与调试:构建企业级质量的保障体系 关键词:测试金字塔模型、GPT-4调试助手、LangChain调试模式、异步任务验证 测试策略设计(测试金字塔实践) #mermaid-svg-RblGbJVMnCIShiCW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…...

Linux——进程通信

我们知道&#xff0c;进程具有独立性&#xff0c;各进程之间互不干扰&#xff0c;但我们为什么还要让其联系&#xff0c;建立通信呢&#xff1f;比如&#xff1a;数据传输&#xff0c;资源共享&#xff0c;通知某个事件&#xff0c;或控制某个进程。因此&#xff0c;让进程间建…...

学习笔记十三—— 理解 Rust 闭包:从语法到 impl Fn vs Box<dyn Fn>

&#x1f9e0; 理解 Rust 闭包&#xff1a;从语法到 impl Fn vs Box &#x1f4da; 目录 闭包是什么&#xff1f;和普通函数有什么不同&#xff1f;闭包的语法长什么样&#xff1f;闭包“捕获变量”是什么意思&#xff1f;闭包和所有权的关系Fn、FnMut、FnOnce 三种闭包类型的…...

【免费参会合集】2025年生物制药行业展会会议表格整理

全文精心整理, 建议今年参会前都好好收藏着&#xff0c;记得点赞&#xff01; 医药人非常吃资源&#xff0c;资源从何而来&#xff1f;作为一名从事医药行业的工作者&#xff0c;可以很负责任的告诉诸位&#xff0c;其中非常重要的一个渠道就是会议会展&#xff01; 建议所有医…...

腾讯云开发+MCP:旅游规划攻略

1.登录注册好之后进入腾讯云开发 2.创建环境 4.创建好环境之后点击去开发 5.进入控制台后&#xff0c;选择AI&#xff0c;找到MCP 6.点击创建MCP Server 使用腾讯云开发创建MCP目前需要云开发入门版99/月&#xff0c;我没开通&#xff0c;所以没办法往下进行。...

银河麒麟系统 达梦8 安装 dlask 框架后端环境

适配的一套环境为 dmPython2.5.8 dmSQLAlchemy1.4.39 Flask2.0.3 Flask-Cors3.0.10 Flask-SQLAlchemy2.5.1 SQLAlchemy1.4.54 Werkzeug2.2.2其中 # sqlalchemy-dm1.4.39 通过dmdbms目录内文件进行源码安装 (MindSpore) [ma-user python]$pwd /home/syl/dmdbms/drivers/python…...

Cribl (实验) vpc-flow 数据抽样

先看文档: Firewall Logs: VPC Flow Logs, Cisco ASA, Etc. | Cribl Docs Firewall Logs: VPC Flow Logs, Cisco ASA, Etc. Recipe for Sampling Firewall Logs Firewall logs are another source of important operational (and security) data. Typical examples include Ama…...

Sklearn入门之数据预处理preprocessing

、 Sklearn全称:Scipy-toolkit Learn是 一个基于scipy实现的的开源机器学习库。它提供了大量的算法和工具&#xff0c;用于数据挖掘和数据分析&#xff0c;包括分类、回归、聚类等多种任务。本文我将带你了解并入门Sklearn下的preprocessing在机器学习中的基本用法。 获取方式…...

我想自己组装一台服务器,微调大模型通义千问2.5 Omni 72B,但是我是个人购买,资金非常有限,最省的方案

目录 🧠 首先我们要搞清楚几个核心点: 🎯 目标:微调 Qwen2.5-Omni-72B 🚨 现实问题:作为个人用户,72B 模型几乎无法负担全量微调 💸 全量微调硬件需求: ✅ 最省的个人方案:不组 72B,只训练 Qwen2.5-Omni-7B 或 14B 💡 推荐方案 A:个人桌面级多卡训练服…...

家用打印机性价比排名及推荐

文章目录 品牌性价比一、核心参数对比与场景适配二、技术类型深度解析三、不同场景选择 相关文章 品牌 性价比 一、核心参数对比与场景适配 兄弟T436W 优势&#xff1a; 微压电技术&#xff0c;打印头寿命长&#xff0c;堵头率低。 支持A4无边距和5G WiFi&#xff0c;适合照片…...

KWDB(Knowledge Worker Database)基础概念与原理完整指南

KWDB&#xff08;Knowledge Worker Database&#xff09;基础概念与原理完整指南—目录 前言一、背景1.1 知识工作者的痛点1.2 技术演进推动 二、定义与定位2.1 什么是KWDB&#xff1f;2.2 KWDB与传统数据库的对比与传统关系型数据库&#xff08;如MySQL&#xff09;的对比与分…...

数字电子技术基础(四十七)——使用Mutlisim软件来模拟74LS85芯片

目录 1 使用74LS85N芯片完成四位二进制数的比较 1.1原理介绍 1.2 器件选择 1.3 运行电路 2 使用74LS85N完成更多位的二进制比较 1 使用74LS85N芯片完成四位二进制数的比较 1.1原理介绍 对于74LS85 是一款 4 位数值比较器集成电路&#xff0c;用于比较两个 4 位二进制数&…...

关于STM32创建工程文件启动文件选择

注意启动文件只要选择这几个 而不是要把所有都选上...

LLC电路工作在容性区的风险

在t0时刻之前&#xff0c;Q6Q7导通&#xff0c;回路如下所示&#xff0c;此时A点电压是低压&#xff0c;B点电压是高压 在t0时刻时&#xff0c;谐振电流相位发生变换&#xff0c;在t1时刻&#xff0c;Q5&#xff0c;Q8导通&#xff0c;对于Q8MOS管来说&#xff0c;B点电压在Q6Q…...

Linux Kernel 6

clone 系统调用&#xff08;The clone system call&#xff09; 在 Linux 中&#xff0c;使用 clone() 系统调用来创建新的线程或进程。fork() 系统调用和 pthread_create() 函数都基于 clone() 的实现。 clone() 系统调用允许调用者决定哪些资源应该与父进程共享&#xff0c…...

【开源项目】Excel手撕AI算法深入理解(四):AlphaFold、Autoencoder

项目源码地址&#xff1a;https://github.com/ImagineAILab/ai-by-hand-excel.git 一、AlphaFold AlphaFold 是 DeepMind 开发的突破性 AI 算法&#xff0c;用于预测蛋白质的三维结构。它的出现解决了生物学领域长达 50 年的“蛋白质折叠问题”&#xff0c;被《科学》杂志评为…...

第IV部分有效应用程序的设计模式

第IV部分有效应用程序的设计模式 第IV部分有效应用程序的设计模式第23章:应用程序用户界面的架构设计23.1设计考量23.2示例1:用于非分布式有界上下文的一个基于HTMLAF的、服务器端的UI23.3示例2:用于分布式有界上下文的一个基于数据API的客户端UI23.4要点第24章:CQRS:一种…...

如何编制实施项目管理章程

本文档概述了一个项目管理系统的实施计划,旨在通过统一的业务规范和技术架构,加强集团公司的业务管控,并规范业务管理。系统建设将遵循集团统一模板,确保各单位项目系统建设的标准化和一致性。 实施范围涵盖投资管理、立项管理、设计管理、进度管理等多个方面,支持项目全生…...

排序(java)

一.概念 排序&#xff1a;对一组数据进行从小到大/从大到小的排序 稳定性&#xff1a;即使进行排序相对位置也不受影响如&#xff1a; 如果再排序后 L 在 i 的前面则稳定性差&#xff0c;像图中这样就是稳定性好。 二.常见的排序 三.常见算法的实现 1.插入排序 1.1 直…...

嵌入式C语言进阶(二+)内存管理补充版

C语言内存管理:从小白到大神的完全指南 前言:为什么需要理解内存管理 C语言以其高效性和灵活性著称,但这也意味着程序员需要手动管理内存。与Java、Python等高级语言不同,C语言没有自动垃圾回收机制,内存管理的重担完全落在开发者肩上。理解C语言的内存管理机制不仅能帮…...

【HDFS入门】HDFS副本策略:深入浅出副本机制

目录 1 HDFS副本机制概述 2 HDFS副本放置策略 3 副本策略的优势 4 副本因子配置 5 副本管理流程 6 最佳实践与调优 7 总结 1 HDFS副本机制概述 Hadoop分布式文件系统(HDFS)的核心设计原则之一就是通过数据冗余来保证可靠性&#xff0c;而这一功能正是通过副本策略实现的…...

Excel自定义函数取拼音首字母

1.启动Excel 2003&#xff08;其它版本请仿照操作&#xff09;&#xff0c;打开相应的工作表&#xff1b; 2.执行“工具 > 宏 > Visual Basic编辑器”命令&#xff08;或者直接按“AltF11”组合键&#xff09;&#xff0c;进入Visual Basic编辑状态&#xff1b; 3.执行“…...