数据结构学习笔记 :基本概念、算法特性与线性表实现

news2025/4/18 23:38:03

目录

  1. 数据的逻辑结构
  2. 数据的物理结构
  3. 算法的五大特性
  4. 好的算法目标
  5. 时间复杂度与空间复杂度
  6. 线性表的顺序存储(顺序表)
    6.1 静态分配
    6.2 动态分配
    6.3 基本操作及时间复杂度

一、数据的逻辑结构

数据的逻辑结构描述数据元素之间的逻辑关系,分为以下四类:

1. 集合结构

  • 特点:元素仅属于同一集合,无其他关系。
  • 示例:学生成绩表中的所有学生。

2. 线性结构

  • 特点:元素间存在一对一关系。
    • 除首元素外,每个元素有唯一前驱;
    • 除尾元素外,每个元素有唯一后继。
  • 示例:数组、链表。

3. 树形结构

  • 特点:元素间存在一对多关系。
  • 示例:文件系统目录、组织架构。

4. 图形结构

  • 特点:元素间存在多对多关系。
  • 示例:社交网络、交通网络。

二、数据的物理结构

数据的物理结构描述数据在计算机中的存储方式,分为以下四类:

存储方式特点
顺序存储逻辑相邻的元素物理位置相邻(如数组)。
链式存储逻辑相邻的元素物理位置可不相邻,通过指针关联(如链表)。
索引存储建立索引表,通过关键字快速定位(如数据库索引)。
散列存储根据关键字直接计算存储地址(哈希表)。

三、算法的五大特性

  1. 有穷性:算法必须在有限步骤内终止。
  2. 确定性:相同输入必得相同输出,无歧义。
  3. 可行性:每一步操作可通过基本运算实现。
  4. 输入:0个或多个输入。
  5. 输出:至少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 10

typedef 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 10

typedef 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode hot 100 136】只出现一次的数字

解法一&#xff1a;&#xff08;异或XOR&#xff09;相同的数字出现两次则归零 class Solution {public int singleNumber(int[] nums) {int result 0;for(int num:nums){result ^ num;}return result;} }注意&#xff1a; 其他方法&#xff1a;HashList记录次数再查找数组&a…

QEMU学习之路(8)— ARM32通过u-boot 启动Linux

QEMU学习之路&#xff08;8&#xff09;— ARM32通过u-boot 启动Linux 一、前言 参考文章&#xff1a; Linux内核学习——内核的编译和启动 Linux 内核的编译和模拟执行 Linux内核运行——根文件系统 Linux 内核学习——使用 uboot 加载内核 二、构建Linux内核 1、获取Linu…

AgentOps - 帮助开发者构建、评估和监控 AI Agent

文章目录 一、关于 AgentOps二、关键集成 &#x1f50c;三、快速开始 ⌨️2行代码中的Session replays 首类开发者体验 四、集成 &#x1f9be;OpenAI Agents SDK &#x1f587;️CrewAI &#x1f6f6;AG2 &#x1f916;Camel AI &#x1f42a;Langchain &#x1f99c;&#x1…

leetcode 122. Best Time to Buy and Sell Stock II

题目描述 这道题可以用贪心思想解决。 本文介绍用动态规划解决。本题分析方法与第121题一样&#xff0c;详见leetcode 121. Best Time to Buy and Sell Stock 只有一点区别。第121题全程只能买入1次&#xff0c;因此如果第i天买入股票&#xff0c;买之前的金额肯定是初始金额…

【ROS】代价地图

【ROS】代价地图 前言代价地图&#xff08;Costmap&#xff09;概述代价地图的参数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》 突破阿基里斯之踵&#xff1a;生成模型红队对抗综述 摘要 生成模型正迅速流行并被整合到日常应用中&#xff0c;随着各种漏洞暴露&#xff0c;其安全使用引发担忧。鉴于此&#xff0c;红队…

datagrip连接mysql问题5.7.26

1.Case sensitivity: plainmixed, delimitedexac Remote host terminated the handshake. 区分大小写&#xff1a;plain混合&#xff0c;分隔exac 远程主机终止了握手。 原因:usessl 参数用于指定是否使用 SSL&#xff08;Secure Sockets Layer&#xff09;加密来保护数据传…

探索亮数据Web Unlocker API:让谷歌学术网页科研数据 “触手可及”

本文目录 一、引言二、Web Unlocker API 功能亮点三、Web Unlocker API 实战1.配置网页解锁器2.定位相关数据3.编写代码 四、Web Scraper API技术亮点 五、SERP API技术亮点 六、总结 一、引言 网页数据宛如一座蕴藏着无限价值的宝库&#xff0c;无论是企业洞察市场动态、制定…

【本地MinIO图床远程访问】Cpolar TCP隧道+PicGo插件,让MinIO图床一键触达

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言MinIO本地安装与配置cpolar 内网穿透PicGo 安装MinIO远程访问总结互动致谢参考目录…

Policy Gradient思想、REINFORCE算法,以及贪吃蛇小游戏(一)

文章目录 Policy Gradient思想论文REINFORCE算法论文Policy Gradient思想和REINFORCE算法的关系用一句人话解释什么是REINFORCE算法策略这个东西实在是太抽象了,它可以是一个什么我们能实际感受到的东西?你说的这个我理解了,但这个东西,我怎么优化?在一堆函数中,找到最优…

Profibus DP主站转modbusTCP网关与dp从站通讯案例

Profibus DP主站转modbusTCP网关与dp从站通讯案例 在当前工业自动化的浪潮中&#xff0c;不同协议之间的通讯转换成为了提升生产效率和实现设备互联的关键。Profibus DP作为一种广泛应用的现场总线技术&#xff0c;与Modbus TCP的结合&#xff0c;为工业自动化系统的集成带来了…

快速部署大模型 Openwebui + Ollama + deepSeek-R1模型

背景 本文主要快速部署一个带有web可交互界面的大模型的应用&#xff0c;主要用于开发测试节点&#xff0c;其中涉及到的三个组件为 open-webui Ollama deepSeek开放平台 首先 Ollama 是一个开源的本地化大模型部署工具,提供与OpenAI兼容的Api接口&#xff0c;可以快速的运…

H.265硬件视频编码器xk265代码阅读 - 帧内预测

源代码地址&#xff1a; https://github.com/openasic-org/xk265 帧内预测具体逻辑包含在代码xk265\rtl\rec\rec_intra\intra_pred.v 文件中。 module intra_pred() 看起来是每次计算某个4x4块的预测像素值。 以下代码用来算每个pred_angle的具体数值&#xff0c;每个mode_i对应…

Arcgis经纬线标注设置(英文、刻度显示)

在arcgis软件中绘制地图边框&#xff0c;添加经纬度度时常常面临经纬度出现中文&#xff0c;如下图所示&#xff1a; 解决方法&#xff0c;设置一下Arcgis的语言 点击高级--确认 这样Arcgis就转为英文版了&#xff0c;此时在来看经纬线刻度的标注&#xff0c;自动变成英文

Windows安装Ollama并指定安装路径(默认C盘)

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;http://blog.csdn.net/q258523454/article/details/147289192 一、下载Ollama 访问Ollama官网 打开浏览器&#xff0c;访问Ollama的官方网站&#xff1a;https://ollama.ai/。 在官网首页…

Python自动化处理奖金分摊:基于连续空值的智能分配算法升级

Python自动化处理奖金分摊&#xff1a;基于连续空值的智能分配算法升级 原创 IT小本本 IT小本本 2025年04月04日 02:00 北京 引言 在企业薪酬管理中&#xff0c;团队奖金分配常涉及复杂的分摊规则。传统手工分摊不仅效率低下&#xff0c;还容易因人为疏漏导致分配不公。 本文…

AI工具箱源码+成品网站源码+springboot+vue

大家好&#xff0c;今天给大家分享一个靠AI广告赚钱的项目&#xff1a;AI工具箱成品网站源码&#xff0c;源码支持二开&#xff0c;但不允许转售&#xff01;&#xff01; 本人专门为小型企业和个人提供的解决方案。 不懂技术的也可以直接部署工具箱网站&#xff0c;成为站长&…

如何下载免费地图数据?

按照以下步骤下载免费地图数据。 1、安装GIS地图下载器 从GeoSaaS&#xff08;.COM&#xff09;官网下载“GIS地图下载器”软件&#xff1a;&#xff0c;安装完成后桌面上出现”GIS地图下载器“图标。 双击桌面图标打开”GIS地图下载器“ 2、下载地图数据 点击主界面底部的“…

IO 口作为外部中断输入

外部中断 1. NVIC2. EXTI 1. NVIC NVIC即嵌套向量中断控制器&#xff0c;它是内核的器件&#xff0c;M3/M4/M7 内核都是支持 256 个中断&#xff0c;其中包含了 16 个系统中断和 240 个外部中断&#xff0c;并且具有 256 级的可编程中断设置。然而芯片厂商一般不会把内核的这些…

《MySQL基础:了解MySQL周边概念》

1.登录选项的认识 -h&#xff1a;指明登录部署了mysql服务的主机&#xff0c;默认为127.0.0.1-P&#xff1a;指明要访问的端口号&#xff0c;默认为3306-u&#xff1a;指明登录用户-p&#xff1a;指明登录密码 2.什么是数据库 2.1认识数据库 第一点理解。 mysql是数据库的客户…