数据结构学习笔记 :基本概念、算法特性与线性表实现
目录
- 数据的逻辑结构
- 数据的物理结构
- 算法的五大特性
- 好的算法目标
- 时间复杂度与空间复杂度
- 线性表的顺序存储(顺序表)
6.1 静态分配
6.2 动态分配
6.3 基本操作及时间复杂度
一、数据的逻辑结构
数据的逻辑结构描述数据元素之间的逻辑关系,分为以下四类:
1. 集合结构
- 特点:元素仅属于同一集合,无其他关系。
- 示例:学生成绩表中的所有学生。
2. 线性结构
- 特点:元素间存在一对一关系。
- 除首元素外,每个元素有唯一前驱;
- 除尾元素外,每个元素有唯一后继。
- 示例:数组、链表。
3. 树形结构
- 特点:元素间存在一对多关系。
- 示例:文件系统目录、组织架构。
4. 图形结构
- 特点:元素间存在多对多关系。
- 示例:社交网络、交通网络。
二、数据的物理结构
数据的物理结构描述数据在计算机中的存储方式,分为以下四类:
| 存储方式 | 特点 |
|---|---|
| 顺序存储 | 逻辑相邻的元素物理位置相邻(如数组)。 |
| 链式存储 | 逻辑相邻的元素物理位置可不相邻,通过指针关联(如链表)。 |
| 索引存储 | 建立索引表,通过关键字快速定位(如数据库索引)。 |
| 散列存储 | 根据关键字直接计算存储地址(哈希表)。 |
三、算法的五大特性
- 有穷性:算法必须在有限步骤内终止。
- 确定性:相同输入必得相同输出,无歧义。
- 可行性:每一步操作可通过基本运算实现。
- 输入:0个或多个输入。
- 输出:至少1个输出。
四、好的算法目标
- 正确性 ✅:算法能正确解决问题.
- 可读性 📖:代码易于理解与维护.
- 健壮性 🛡️:对非法输入有合理处理机制.
- 高效性 ⚡:时间与空间复杂度低.
五、时间复杂度与空间复杂度
1. 时间复杂度
- 计算规则:
- 保留最高阶项,忽略系数(例如,
T(n) = 3n + 3 → O(n))。 - 嵌套循环关注最深层循环次数.
- 保留最高阶项,忽略系数(例如,
- 常见复杂度排序:
O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!)
示例代码:
void fun(int n) {int i = 1; while (i <= n) { i++;printf("hello"); }printf("linux");
}
// 时间复杂度 T(n) = 3n + 3 → O(n)
2. 空间复杂度
- 定义:算法运行所需的辅助空间大小.
- 原地工作:空间复杂度为
O(1)(例如,变量交换).
六、线性表的顺序存储(顺序表)
顺序表通过数组实现,支持快速随机访问,但增删操作效率较低.
静态分配
#include <stdio.h>
#define MaxSize 10typedef struct {int data[MaxSize]; int length;
} SqList;// 初始化
void InitList(SqList *L) {for (int i = 0; i < MaxSize; i++) L->data[i] = 0;L->length = 0;
}int main() {SqList L;InitList(&L);return 0;
}
动态分配
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10typedef struct {int *data; int MaxSize; int length;
} SqList;// 初始化
void InitList(SqList *L) {L->data = (int *)malloc(InitSize * sizeof(int));L->MaxSize = InitSize;L->length = 0;
}// 扩容
void IncreaseSize(SqList *L, int len) {L->data = (int *)realloc(L->data, (L->MaxSize + len) * sizeof(int));L->MaxSize += len;
}int main() {SqList L;InitList(&L);IncreaseSize(&L, 5); return 0;
}
基本操作及时间复杂度
| 操作 | 时间复杂度 | 说明 |
|---|---|---|
| 按位查找 | O(1) | 直接通过下标访问元素. |
| 按值查找 | O(n) | 遍历数组查找目标值. |
| 插入 | O(n) | 需移动后续元素(平均n/2次). |
| 删除 | O(n) | 需移动后续元素. |
代码示例(插入与删除):
// 插入元素
bool ListInsert(SqList *L, int i, int e) {if (i < 0 || i > L->length || L->length >= L->MaxSize) return false;for (int j = L->length; j > i; j--) L->data[j] = L->data[j - 1];L->data[i] = e;L->length++;return true;
}// 删除元素
bool ListDelete(SqList *L, int i, int *e) {if (i < 0 || i >= L->length) return false;*e = L->data[i];for (int j = i; j < L->length - 1; j++) L->data[j] = L->data[j + 1];L->length--;return true;
}
相关文章:
数据结构学习笔记 :基本概念、算法特性与线性表实现
目录 数据的逻辑结构数据的物理结构算法的五大特性好的算法目标时间复杂度与空间复杂度线性表的顺序存储(顺序表) 6.1 静态分配 6.2 动态分配 6.3 基本操作及时间复杂度 一、数据的逻辑结构 数据的逻辑结构描述数据元素之间的逻辑关系,分为…...
【leetcode hot 100 136】只出现一次的数字
解法一:(异或XOR)相同的数字出现两次则归零 class Solution {public int singleNumber(int[] nums) {int result 0;for(int num:nums){result ^ num;}return result;} }注意: 其他方法:HashList记录次数再查找数组&a…...
QEMU学习之路(8)— ARM32通过u-boot 启动Linux
QEMU学习之路(8)— ARM32通过u-boot 启动Linux 一、前言 参考文章: Linux内核学习——内核的编译和启动 Linux 内核的编译和模拟执行 Linux内核运行——根文件系统 Linux 内核学习——使用 uboot 加载内核 二、构建Linux内核 1、获取Linu…...
AgentOps - 帮助开发者构建、评估和监控 AI Agent
文章目录 一、关于 AgentOps二、关键集成 🔌三、快速开始 ⌨️2行代码中的Session replays 首类开发者体验 四、集成 🦾OpenAI Agents SDK 🖇️CrewAI 🛶AG2 🤖Camel AI 🐪Langchain 🦜…...
leetcode 122. Best Time to Buy and Sell Stock II
题目描述 这道题可以用贪心思想解决。 本文介绍用动态规划解决。本题分析方法与第121题一样,详见leetcode 121. Best Time to Buy and Sell Stock 只有一点区别。第121题全程只能买入1次,因此如果第i天买入股票,买之前的金额肯定是初始金额…...
【ROS】代价地图
【ROS】代价地图 前言代价地图(Costmap)概述代价地图的参数costmap_common_params.yaml 参数说明costmap_common_params.yaml 示例说明global_costmap.yaml 参数说明global_costmap.yaml 示例说明local_costmap.yaml 参数说明local_costmap.yaml 示例说明…...
《Against The Achilles’ Heel: A Survey on Red Teaming for Generative Models》全文阅读
《Against The Achilles’ Heel: A Survey on Red Teaming for Generative Models》 突破阿基里斯之踵:生成模型红队对抗综述 摘要 生成模型正迅速流行并被整合到日常应用中,随着各种漏洞暴露,其安全使用引发担忧。鉴于此,红队…...
datagrip连接mysql问题5.7.26
1.Case sensitivity: plainmixed, delimitedexac Remote host terminated the handshake. 区分大小写:plain混合,分隔exac 远程主机终止了握手。 原因:usessl 参数用于指定是否使用 SSL(Secure Sockets Layer)加密来保护数据传…...
文件内容课堂总结
Spark-SQL连接Hive Apache Hive是Hadoop上的SQL引擎,Spark SQL编译时可选择是否包含Hive支持。包含Hive支持的版本支持Hive表访问、UDF及HQL。生产环境推荐编译时引入Hive支持。 内嵌Hive 直接使用无需配置,但生产环境极少采用。 外部Hive 需完成以下配置…...
探索亮数据Web Unlocker API:让谷歌学术网页科研数据 “触手可及”
本文目录 一、引言二、Web Unlocker API 功能亮点三、Web Unlocker API 实战1.配置网页解锁器2.定位相关数据3.编写代码 四、Web Scraper API技术亮点 五、SERP API技术亮点 六、总结 一、引言 网页数据宛如一座蕴藏着无限价值的宝库,无论是企业洞察市场动态、制定…...
AF3 create_alignment_db_sharded脚本process_chunk函数解读
AlphaFold3 create_alignment_db_sharded 脚本在源代码的scripts/alignment_db_scripts文件夹下。该脚本中的 process_chunk 函数通过调用 read_chain_dir 函数,读取每个链的多序列比对(MSA)文件并整理成统一格式的字典结构chunk_data 返回。 函数功能: read_chain_dir:读…...
【本地MinIO图床远程访问】Cpolar TCP隧道+PicGo插件,让MinIO图床一键触达
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言MinIO本地安装与配置cpolar 内网穿透PicGo 安装MinIO远程访问总结互动致谢参考目录…...
PyTorch的benchmark模块
PyTorch的benchmark模块主要用于性能测试和优化,包含核心工具库和预置测试项目两大部分。以下是其核心功能与使用方法的详细介绍: 1. 核心工具:torch.utils.benchmark 这是PyTorch内置的性能测量工具,主要用于代码片段的执行时间…...
Spring Boot 参数校验 Validation 终极指南
1. 概述 Spring Validation 基于 JSR-303(Bean Validation)规范,通过Validated注解实现声明式校验。核心优势: 零侵入性:基于 AOP 实现方法拦截校验规范统一:兼容 Bean Validation 标准注解功能扩展&…...
Policy Gradient思想、REINFORCE算法,以及贪吃蛇小游戏(一)
文章目录 Policy Gradient思想论文REINFORCE算法论文Policy Gradient思想和REINFORCE算法的关系用一句人话解释什么是REINFORCE算法策略这个东西实在是太抽象了,它可以是一个什么我们能实际感受到的东西?你说的这个我理解了,但这个东西,我怎么优化?在一堆函数中,找到最优…...
Angular 框架详解:从入门到进阶
Hi,我是布兰妮甜 !在当今快速发展的 Web 开发领域,Angular 作为 Google 主导的企业级前端框架,以其完整的解决方案、强大的类型系统和丰富的生态系统,成为构建大型复杂应用的首选。不同于其他渐进式框架,An…...
Profibus DP主站转modbusTCP网关与dp从站通讯案例
Profibus DP主站转modbusTCP网关与dp从站通讯案例 在当前工业自动化的浪潮中,不同协议之间的通讯转换成为了提升生产效率和实现设备互联的关键。Profibus DP作为一种广泛应用的现场总线技术,与Modbus TCP的结合,为工业自动化系统的集成带来了…...
快速部署大模型 Openwebui + Ollama + deepSeek-R1模型
背景 本文主要快速部署一个带有web可交互界面的大模型的应用,主要用于开发测试节点,其中涉及到的三个组件为 open-webui Ollama deepSeek开放平台 首先 Ollama 是一个开源的本地化大模型部署工具,提供与OpenAI兼容的Api接口,可以快速的运…...
Ethan独立开发产品日报 | 2025-04-15
1. Whatting 专属于你的iPad日记 还在Goodnotes里使用PDF模板吗?是时候告别到处翻找PDF的日子了——来试试Whatting吧!在Whatting中,你可以根据自己的喜好,灵活组合小部件,打造专属的日记布局。今天就免费开始吧&…...
H.265硬件视频编码器xk265代码阅读 - 帧内预测
源代码地址: https://github.com/openasic-org/xk265 帧内预测具体逻辑包含在代码xk265\rtl\rec\rec_intra\intra_pred.v 文件中。 module intra_pred() 看起来是每次计算某个4x4块的预测像素值。 以下代码用来算每个pred_angle的具体数值,每个mode_i对应…...
Arcgis经纬线标注设置(英文、刻度显示)
在arcgis软件中绘制地图边框,添加经纬度度时常常面临经纬度出现中文,如下图所示: 解决方法,设置一下Arcgis的语言 点击高级--确认 这样Arcgis就转为英文版了,此时在来看经纬线刻度的标注,自动变成英文...
MCP协议,.Net 使用示例
服务器端示例 基础服务器 以下是一个基础的 MCP 服务器示例,它使用标准输入输出(stdio)作为传输方式,并实现了一个简单的回显工具: using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.H…...
Windows安装Ollama并指定安装路径(默认C盘)
手打不易,如果转摘,请注明出处! 注明原文:http://blog.csdn.net/q258523454/article/details/147289192 一、下载Ollama 访问Ollama官网 打开浏览器,访问Ollama的官方网站:https://ollama.ai/。 在官网首页…...
微信小程序中大型项目开发实战指南
🌐从架构设计到性能优化:微信小程序中大型项目开发实战指南 本文将深入探讨微信小程序在中大型项目开发中的架构设计、组件化方案、状态管理、性能优化策略、网络请求封装等核心内容,帮助你构建高质量、可维护、易扩展的小程序工程。 &#x…...
读《思考的框架有感》
书名 :《思考的框架》一沙恩.帕里什 汉隆剃刀定律目前已经难以溯源。它指的是,能解释为愚蠢的,就不要解释为恶意。在复杂的世界中,使用这一模型有助于我们避免妄想和偏执。如果我们拒绝假定一切糟糕的结果都是坏人的错…...
Python自动化处理奖金分摊:基于连续空值的智能分配算法升级
Python自动化处理奖金分摊:基于连续空值的智能分配算法升级 原创 IT小本本 IT小本本 2025年04月04日 02:00 北京 引言 在企业薪酬管理中,团队奖金分配常涉及复杂的分摊规则。传统手工分摊不仅效率低下,还容易因人为疏漏导致分配不公。 本文…...
AI工具箱源码+成品网站源码+springboot+vue
大家好,今天给大家分享一个靠AI广告赚钱的项目:AI工具箱成品网站源码,源码支持二开,但不允许转售!! 本人专门为小型企业和个人提供的解决方案。 不懂技术的也可以直接部署工具箱网站,成为站长&…...
centos7停服yum更新kernel失败解决办法
yum更新kernel均失败 由于centos停服,使用yum源安装内核失败 # rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org# yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm Loaded plugins: fastestmirror elrepo-release…...
如何下载免费地图数据?
按照以下步骤下载免费地图数据。 1、安装GIS地图下载器 从GeoSaaS(.COM)官网下载“GIS地图下载器”软件:,安装完成后桌面上出现”GIS地图下载器“图标。 双击桌面图标打开”GIS地图下载器“ 2、下载地图数据 点击主界面底部的“…...
IO 口作为外部中断输入
外部中断 1. NVIC2. EXTI 1. NVIC NVIC即嵌套向量中断控制器,它是内核的器件,M3/M4/M7 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。然而芯片厂商一般不会把内核的这些…...
