数据结构 day01

大纲

1.数据结构

2.算法

3.线性表

        顺序表:数组

        链表:单向链表,单向循环链表,双向链表,双向循环链表

        栈:顺序栈,链式栈

        队列:顺序队列,链式队列

4.树:特性

        二叉树:性质,创建,遍历

5.排序方法,查询方法:原理,思路

为什么学数据结构

1.C语言学习如何写程序,数据结构是为了简洁高效的写程序

2.如果遇到一个实际问题,需要写代码实现相应功能,需要解决两方面问题:

1)如何表达数据之间的逻辑关系,以及怎样储存在计算机中

        数据结构:数据的逻辑结构,存储结构,操作(数据的运算)

        数据:不是单纯的数字,更类似于集合的概念

        结构:表达数据之间的关系

2)采用什么方法解决

        采用算法解决

程序 = 数据结构 + 算法

问题—》数据结构 + 算法 == 程序—》解决问题

1.什么是数据结构

        数据结构:数据逻辑结构存储结构操作(数据的运算)

1.1. 数据

数据:类似于集合的概念

数据元素(节点):数据的基本单位,由若干数据项组成

数据项:数据的最小单位,描述数据元素的信息

计算机处理对象不是单纯的数值

图书管理中的数据:

1.2. 逻辑结构

        数据元素并不是孤立存在的,其间存在某种关系(联系和结构 )

1.2.1. 线性关系

        逻辑结构:线性结构

        特点:一对一

        线性结构:顺序表,链表,栈,队列

1.2.2. 层次关系

        逻辑结构:树形结构

        特点:一对多

        树形结构:二叉树

1.2.3. 网状关系

        逻辑结构:图状结构

        特点:多对多

        图状结构:图

1.3. 存储结构

        数据的逻辑结构在计算机中具体实现

1.3.1. 顺序存储

数组:连续存储

特点:内存连续,随机存储,每个元素占空间较少

缺点:只能用一块大的且连续的空间,会产生空间的浪费

1.3.2. 链式存储

特点:内存不连续,使用指针实现

链表实现

结构体:

 

#include <stdio.h>

struct node_t
{
    int data;               // 数据域:存放节点的数据
    struct node_t *next;    // 指针域:结构体指针指向下一个节点
};

int main(int argc, char const *argv[])
{
    struct node_t A = {1, NULL};
    struct node_t B = {2, NULL};
    struct node_t C = {3, NULL};

    A.next = &B;
    B.next = &C;
    return 0;
}

1.3.3. 索引存储结构

在存储数据的同时,建立索引表。即索引存储结构 = 索引表 + 数据文件。

特点:提高查找速度,检索速度快

缺点:占用内存多,删除数据文件要及时更改索引表

 1.3.4. 散列存储

数据存储按照和关键码之间的关系进行存取。关系由自己决定。

例如关键码为key,下一个存储的关键码是key+1。

获取关键数据,通过元素的关键码的返回值来获取,存取都按照相应的关系存取

与商场的储物柜类似,给你一个号码,存取物品时查找号码来存取

1.4. 操作

增, 删, 改,查

2. 什么是算法

        算法是解决问题的思想方法,数据结构是算法的基础

2.1. 算法的设计

        设计取决于数据的逻辑结构

        实现依赖于数据的存储结构

2.2. 特性

有穷性:步骤是有限的

确定性:每一步有明确的含义,不能有争议

可行性:规定时间内能完成

输入        输出

2.3. 评价算法的好坏

1)正确性

2)易读性

3)健壮性:有一定容错处理

4)高效性:执行效率,通过重复执行的次数来判断,也就是通过时间复杂度(时间处理函数)来判断

时间复杂度

语句频度:用时间规模函数表达

时间规模函数:T(n) = O(f(n))

T(n)        // 时间规模函数

O        // 时间数量级

n        // 问题规模,a[100], n = 100

f(n)        // 算法可执行语句重复执行次数

例题1:求1+2+3+4+……+n 的和

算法1

int sum = 0;
for(int i = 1; i <= n; i++)
{
	sum+=i;
}

n = 100

f(n) = 100

T(n) = O(n)

算法2

利用等差数列前n项和公式

int sum = n*(1+n)/2;

n = 100,执行一次

f(n) = 1

T(n) = O(1)

例题2

int i, j;
for(i = 0; i < n; i++)
{
    for(j = 0; j < n; j++)
    {
        printf("ok\n");
    }
}

n*n 次

f(n) = n^2

T(n) = O(n^2)

例题3

int i, j;
for(i = 0; i < n; i++)
{
    for(j = 0; j <= i; j++)
    {
        printf("ok\n");
    }
}

执行次数: 1+2+3+……+n

f(n) = n*(1+n)/2 = n^2/2 + n/2

T(n) = O(n^2)

计算方法:

1)根据问题规模 n 写出表达式

2)有常数项时,常数项置1

3)只保留最高项,最高项系数置1

f(n) = 3*n^4 + 2*n^3 + 6*n^7 +10

T(n) = O(n^7)

3. 线性表

线性表是最基本,最简单,最常用的数据结构,可以存储逻辑关系为线性的数据。一个线性表是 n 个具有相同特性的数据元素的有限序列。

包含:

        顺序表:数组

        链表:单向链表,单向循环链表,双向链表,双向循环链表

        栈:顺序栈,链式栈

        队列:顺序队列,链式队列

逻辑结构:线性结构

存储结构:顺序存储(数组),链式存储(指针)

特点:一对一,每个节点最多一个前驱,一个后继

        首节点无前驱,尾节点无后继

3.1. 顺序表

顺序表存储数据的具体实现方案:将数据全部存储到一整块内存中,数据元素之间按照次序挨个存放。

 举个简单的例子,将 {1,2,3,4,5} 这些数据使用顺序表存储,数据最终的存储状态如下

3.1.1. 顺序表的特性

特点:内存连续

逻辑结构:线性结构

存储结构:顺序存储

操作:增删改查

3.1.2. 操作数组

例题

int a[100] = {1, 2, 3, 4, 5, 6, 7, 8};

int last = 7;        // 代表最后一个有效元素下标 last = 有效元素个数-1

全局变量 last 表示有效元素的下标

1)插入数组元素

函数:void insetIntoA( int *p, int post, int data);

功能:向数组的第几个位置插入数据

参数:

        int *p        // 保存数组首地址

        int post        // 插入元素下标

        int data        // 数据

#include <stdio.h>

// 向数组的第几个位置插数据
void insetIntoA(int *p, int post, int data)
{
    // 1. 把从最后一个元素p[n-1]开始到插入元素p[post]向后移动一个位置
    for (int i = last; i >= post; i--)
    {
        p[i+1] = p[i];
    }
    // 插入新元素 data 到定义位置
    p[post] = data;
    last++;
}

2)遍历数组中的有效元素

函数:void showA( int *p);

功能:遍历数组中的有效元素

参数:

        int *p        // 保存数组首地址

// 遍历数组中的有效元素
void showA(int *p, int n)
{
    for (int i = 0; i < last+1; i++)
    {
        printf("%d ", p[i]);
    }
    printf("\n");
}

3)删除数组元素

函数:void deleteIntoA( int *p, int post);

功能:删除数组中指定元素

参数:

        int *p        // 保存数组首地址

        int post        // 删除元素下标

void deleteIntoA(int *p, int n, int post)
{
    // 从删除位置后一个元素p[post+1]到p[n-1]往前移动一个单位
    for (int i = post + 1; i < last+1; i++)
    {
        p[i-1] = p[i];
    }
    last--;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 系统搭建 Python 开发环境全流程

Linux 系统搭建 Python 开发环境全流程 Python 解释器下载 Pycharm 对应版本解压安装包进入解压后的目录启动 Pycharm创建桌面快捷方式&#xff08;可选&#xff09;Pycharm 配置创建第一个目录第一个程序运行补充 Python 解释器 确保电脑里已经有了python解释器&#xff0c;没…

SQL Server查询计划操作符(7.3)——查询计划相关操作符(6)

7.3. 查询计划相关操作符 48)Key Lookup:该操作符对一个有簇索引的表进行书签查找。参数列包含簇索引的名字和用于查找簇索引中数据行的簇键。该操作符总是伴随一个Nested Loops操作符。如果其参数列中出现WITH PREFETCH子句,则查询处理器已决定使用异步预取(预读,read-ah…

如何通过 ESPN API 获取 NBA 球队的赛程表

对于 NBA 爱好者和开发者来说&#xff0c;通过 API 获取球队赛程表是一项非常实用的功能&#xff0c;尤其是如果你正在构建一个应用或网站&#xff0c;需要自动化获取比赛安排的情况下。今天&#xff0c;我将为大家介绍如何通过 ESPN 提供的 API 获取 NBA 球队的赛程表。 1. ES…

LMM-3DP:集成 LMM 规划器和 3D 技能策略实现可泛化操作

25年1月来自UCSD的论文“Integrating LMM Planners and 3D Skill Policies for Generalizable Manipulation”。 大型多模态模型 (LMM) 的视觉推理能力和 3D 特征场语义丰富性的最新进展&#xff0c;拓展了机器人能力的范围。这些发展对于弥合 LMM 高级推理与利用 3D 特征场低…

idea整合deepseek实现AI辅助编程

1.File->Settings 2.安装插件codegpt 3.注册deepseek开发者账号&#xff0c;DeepSeek开放平台 4.按下图指示创建API KEY 5.回到idea配置api信息&#xff0c;File->Settings->Tools->CodeGPT->Providers->Custom OpenAI API key填写deepseek的api key Chat…

2025年日祭

本文将同步发表于洛谷&#xff08;暂无法访问&#xff09;、CSDN 与 Github 个人博客&#xff08;暂未发布&#xff09; 本蒟自2025.2.8开始半停课。 任务计划&#xff08;站外题与专题&#xff09; 数了一下&#xff0c;通过人数比较高的题&#xff0c;也就是我准备补的题&a…

重学SpringBoot3-Spring WebFlux之SSE服务器发送事件

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞??收藏评论 Spring WebFlux之SSE服务器发送事件 1. 什么是 SSE&#xff1f;2. Spring Boot 3 响应式编程与 SSE 为什么选择响应式编程实现 SSE&#xff1f; 3. 实现 SSE 的基本步骤 3.1 创建 Spr…

HarmonyNext当自定义Dialog有TextInput输入框组件时,弹出软键盘时,dialog布局与软键盘之间有16vp间隙,如何解决,正宗方案

网上的解决方案都是在Dialog组件的根容器中设置偏移量.offset({x:0,y:16}) 大概这种的&#xff0c;这种垃圾解决方式最不可靠&#xff0c;倘若dialog输入框时根据状态变量动态显示的话&#xff0c;即使设置了也没有用 正宗解决方案 首先自定义dialog 三个地方需要注意 1、cu…

idea 如何使用deepseek 保姆级教程

1.安装idea插件codegpt 2.注册deepseek并生成apikey deepseek 开发平台&#xff1a; DeepSeek​​​​​​​ 3.在idea进行codegpt配置 打开idea的File->Settings->Tools->CodeGPT->Providers->Custom OpenAI Chat Completions的URL填写 https://api.deepseek…

响应式编程库(三) -r2dbc

r2dbc整合 什么是r2dbc版本选择简单试用整合springbootDatabaseClient 进行查询使用Repository接口(对应mapper)实体类复杂查询&#xff08;一对一&#xff09;实体类转换器测试代码一对多关系 什么是r2dbc 反应式关系数据库连接&#xff08;R2DBC&#xff09;项目为关系数据库…

第26场蓝桥入门赛

5.扑克较量【算法赛】 - 蓝桥云课 C&#xff1a; #include <iostream> #include <algorithm> using namespace std;int a[100005];int main() {int n,k;cin>>n>>k;for (int i1; i<n; i)cin>>a[i], a[i] % k;sort(a1, a1n);int mx a[1]k-a…

封装descriptions组件,描述,灵活

效果 1、组件1&#xff0c;dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…

【专题】2025年我国机器人产业发展形势展望:人形机器人量产及商业化关键挑战报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39668 机器人已广泛融入我们生活的方方面面。在工业领域&#xff0c;它们宛如不知疲倦的工匠&#xff0c;精准地完成打磨、焊接等精细工作&#xff0c;极大提升了生产效率和产品质量&#xff1b;在日常生活里&#xff0c;它们是贴心…

能够从优秀工控app中学到什么?

美的工控类APP设计在多个方面都有值得学习的地方&#xff0c;包括用户体验、视觉设计、功能布局等&#xff0c;以下是具体内容&#xff1a; 用户体验方面 精准的用户需求洞察&#xff1a;工控类APP的目标用户通常是专业的工程师、技术人员等&#xff0c;其设计会深入了解这些…

334递增的三元子序列贪心算法(思路解析+源码)

文章目录 题目思路解析源码总结题目 思路解析 有两种解法:解法一:动态规划(利用dp找到数组最长递增序列长度,判断是否大于3即可)本题不适用,因为时间复杂度为O(n^2),超时。 解法二:贪心算法:解法如上图,题目要求长度为三,设置第一个元素为长度1的值,是指长度二的…

深入探究 C++17 std::is_invocable

文章目录 一、引言二、std::is_invocable 概述代码示例输出结果 三、std::is_invocable 的工作原理简化实现示例 四、std::is_invocable 的相关变体1. std::is_invocable_r2. std::is_nothrow_invocable 和 std::is_nothrow_invocable_r 五、使用场景1. 模板元编程2. 泛型算法 …

P1049 装箱问题(dp)

#include<bits/stdc.h> using namespace std;int main() {int v,n;cin>>v>>n;int a[30];int dp[20005];for(int i0;i<n;i){cin>>a[i];}memset(dp,0,sizeof(dp));// 设置所有元素为0&#xff0c;表示最大体积为0for(int i0;i<n;i){for(int jv;j&…

Groovy基础

引言&#xff1a; Groovy 是一种基于 Java 平台的动态编程语言&#xff08;指在运行时进行类型检查的语言。在使用动态语言编写程序时&#xff0c;变量的类型不需要在声明时明确指定&#xff0c;而是在运行时根据赋给变量的值来确定类型。动态语言在代码执行过程中会进行类型检…

Flink CDC YAML:面向数据集成的 API 设计

摘要&#xff1a;本文整理自阿里云智能集团 、Flink PMC Member & Committer 徐榜江&#xff08;雪尽&#xff09;老师在 Flink Forward Asia 2024 数据集成&#xff08;一&#xff09;专场中的分享。主要分为以下四个方面&#xff1a; Flink CDC YAML API Transform A…

OpenCV:视频背景减除

目录 简述 1. MOG &#x1f537;1.1 主要特点 &#x1f537;1.2 代码示例 &#x1f537;1.3 运行效果 2. MOG2 &#x1f537;2.1 主要特点 &#x1f537;2.2 代码示例 &#x1f537;2.3 运行效果 3. KNN 4. GMG 5. CNT 6. LSBP 7. 如何选择适合的接口&#xff…