插入排序计数排序数据库的三范式是什么?

插入排序

#include <iostream>
#include <vector>

// 插入排序函数
void insertionSort(std::vector<int>& arr) {
    int n = arr.size();
    for (int i = 1; i < n; ++i) {
        int key = arr[i];  // 当前要插入的元素
        int j = i - 1;    // 从已排序序列的最后一个元素开始比较
        // 将大于 key 的元素向后移动
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;  // 插入 key 到正确的位置
    }
}

int main() {
    std::vector<int> arr = {5, 4, 3, 2, 1};
    std::cout << "Original array: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    insertionSort(arr);

    std::cout << "Sorted array: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

时间复杂度:最好on,最差on方

空间复杂度:o1

稳定性:稳定

是否能对代码进行提升:可以使用二分查找优化寻找位置环节

计数排序

#include <iostream>
#include <vector>
#include <algorithm>

// 计数排序函数
void countingSort(std::vector<int>& arr) {
    if (arr.empty()) return;
    int maxVal = *std::max_element(arr.begin(), arr.end());
    int minVal = *std::min_element(arr.begin(), arr.end());
    int range = maxVal - minVal + 1;
    std::vector<int> count(range, 0);
    std::vector<int> output(arr.size());

    // 统计每个元素出现的次数
    for (int num : arr) {
        count[num - minVal]++;
    }

    // 计算累计频率
    for (int i = 1; i < range; ++i) {
        count[i] += count[i - 1];
    }

    // 构建输出数组
    for (int i = arr.size() - 1; i >= 0; --i) {
        output[count[arr[i] - minVal] - 1] = arr[i];
        count[arr[i] - minVal]--;
    }

    // 将排序好的元素复制回原数组
    for (int i = 0; i < arr.size(); ++i) {
        arr[i] = output[i];
    }
}

int main() {
    std::vector<int> arr = {5, 4, 3, 2, 1};
    std::cout << "Original array: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    countingSort(arr);

    std::cout << "Sorted array: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

时间复杂度:最好on+k,最差on+k

空间复杂度:on+k

稳定性:稳定

是否能对代码进行提升:可以考虑使用 std::unordered_map 来存储元素及其出现的次数,当元素范围很大但元素个数较少时,可减少空间开销。

数据库的三范式是什么?

数据库的三范式(3NF)是数据库设计中用于规范关系型数据库表结构的一系列规则,旨在减少数据冗余,提高数据完整性和一致性。

一、第一范式(1NF)

定义

  • 要求数据库表的每一列都是不可再分的原子数据项,即表中的每个属性都不能再拆分成多个子属性。

示例

  • 不满足 1NF 的表:
    | 学生信息 |
    | 张三,20 岁,男 |
  • 满足 1NF 的表:
    | 姓名 | 年龄 | 性别 |
    | 张三 | 20 | 男 |

二、第二范式(2NF)

定义

  • 在满足第一范式的基础上,非主属性完全依赖于主键。这意味着如果表有复合主键,其他属性必须完全依赖于整个主键,而不是主键的一部分。

示例

  • 不满足 2NF 的表(假设主键是 (学生ID, 课程ID)):
    | 学生 ID | 课程 ID | 学生姓名 | 课程名称 | 成绩 |
    | 001 | 001 | 张三 | 数学 | 85 |
    | 001 | 002 | 张三 | 语文 | 90 |
  • 这里 学生姓名 只依赖于 学生ID,而不依赖于 (学生ID, 课程ID),存在部分依赖。
  • 满足 2NF 的表可以拆分成:
  • 学生表(学生ID 为主键):
    | 学生 ID | 学生姓名 |
    | 001 | 张三 |
  • 成绩表((学生ID, 课程ID) 为主键):
    | 学生 ID | 课程 ID | 课程名称 | 成绩 |
    | 001 | 001 | 数学 | 85 |
    | 001 | 002 | 语文 | 90 |

三、第三范式(3NF)

定义

  • 在满足第二范式的基础上,任何非主属性不传递依赖于主键。即非主属性之间不能存在依赖关系,它们只能直接依赖于主键。

示例

  • 不满足 3NF 的表(假设主键是 学生ID):
    | 学生 ID | 学生姓名 | 系名 | 系主任 |
    | 001 | 张三 | 计算机系 | 李四 |
  • 这里 系主任 依赖于 系名,而 系名 依赖于 学生ID,存在传递依赖。
  • 满足 3NF 的表可以拆分成:
  • 学生表(学生ID 为主键):
    | 学生 ID | 学生姓名 | 系名 |
    | 001 | 张三 | 计算机系 |
  • 系表(系名 为主键):
    | 系名 | 系主任 |
    | 计算机系 | 李四 |

使用三范式的优点

  • 减少数据冗余:避免了重复存储数据,节省了存储空间。
  • 提高数据完整性:降低了数据更新、插入和删除时出现不一致的风险。
  • 方便维护:使数据库结构更清晰,易于理解和维护。

使用三范式的局限性

  • 有时为了提高性能,可能需要反规范化(denormalization)。例如在数据仓库中,经常会为了查询性能而牺牲一些范式规则,通过冗余数据来减少多表连接的操作,提高查询效率。

总之,三范式是数据库设计的重要指导原则,但在实际应用中,需要根据具体的业务需求和性能要求灵活调整,以达到性能和数据一致性之间的平衡。

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

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

相关文章

腾讯云智能结构化OCR:以多模态大模型技术为核心,推动跨行业高效精准的文档处理与数据提取新时代

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

SD ComfyUI工作流 根据图像生成线稿草图

文章目录 线稿草图生成SD模型Node节点工作流程工作流下载效果展示线稿草图生成 该工作流的设计目标是将输入的图像转换为高质量的线稿风格输出。其主要流程基于 Stable Diffusion 技术,结合文本和图像条件,精确生成符合预期的线条艺术图像。工作流的核心是通过模型的条件设置…

Zabbix6.0升级为6.4

为了体验一些新的功能&#xff0c;比如 Webhook 和问题抑制等&#xff0c;升级个小版本。 一、环境信息 1. 版本要求 一定要事先查看官方文档&#xff0c;确认组件要求的版本&#xff0c;否则版本过高或者过低都会出现问题。 2. 升级前后信息 环境升级前升级后操作系统CentOS…

网络安全概论——身份认证

一、身份证明 身份证明可分为以下两大类 身份验证——“你是否是你所声称的你&#xff1f;”身份识别——“我是否知道你是谁&#xff1f;” 身份证明系统设计的三要素&#xff1a; 安全设备的系统强度用户的可接受性系统的成本 实现身份证明的基本途径 所知&#xff1a;个…

LabVIEW中的“Synchronize with Other Application Instances“

在LabVIEW中&#xff0c;“Synchronize with Other Application Instances”是一个常见的提示或错误&#xff0c;通常出现在尝试并行运行多个LabVIEW实例时&#xff0c;特别是当你打开多个VI或项目时。这个问题可能影响程序的执行流程&#xff0c;导致不同实例之间的数据同步或…

OpenGL ES 01 渲染一个四边形

项目架构 着色器封装 vertex #version 300 es // 接收顶点数据 layout (location 0) in vec3 aPos; // 位置变量的属性位置值为0 layout (location 1) in vec4 aColors; // 位置变量的属性位置值为1 out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main() {gl…

Maven 生命周期

文章目录 Maven 生命周期- Clean 生命周期- Build 生命周期- Site 生命周期 Maven 生命周期 Maven 有以下三个标准的生命周期&#xff1a; Clean 生命周期&#xff1a; clean&#xff1a;删除目标目录中的编译输出文件。这通常是在构建之前执行的&#xff0c;以确保项目从一个…

力学笃行(二)Qt 示例程序运行

Qt 示例程序运行 1. Qt 示例程序简介1.1 编译报错问题: qt: error: cannot open C:\Users\我的电脑\AppData\Local\Temp\main.obj.34588.15.jom for write 2. Qt 示例程序主要分类2.1 Widgets 示例2.2 Qt Quick 示例2.3 3D 示例2.4 多媒体示例2.5 网络示例2.6 数据库示例2.7 图…

机器学习基础算法 (二)-逻辑回归

python 环境的配置参考 从零开始&#xff1a;Python 环境搭建与工具配置 逻辑回归是一种用于解决二分类问题的机器学习算法&#xff0c;它可以预测输入数据属于某个类别的概率。本文将详细介绍逻辑回归的原理、Python 实现、模型评估和调优&#xff0c;并结合垃圾邮件分类案例进…

《机器学习》支持向量机

目录 结构风险&#xff08;Structural Risk&#xff09;和经验风险&#xff08;Empirical Risk&#xff09; 经验风险&#xff08;Empirical Risk&#xff09;&#xff1a; 结构风险&#xff08;Structural Risk&#xff09;&#xff1a; L0范数&#xff1a; L0范数是指向…

Converseen:全能免费批量图像处理专家

还在为繁琐的图像处理任务而烦恼吗&#xff1f;Converseen 是一款功能卓越且完全免费的批量图像处理软件&#xff0c;它以其卓越的易用性、惊人的处理速度和强大的实用性赢得了用户的广泛赞誉。无论您是专业摄影师、设计师&#xff0c;还是仅仅需要处理大量图片&#xff0c;Con…

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-信号量【入门三】

继续上一篇任务创建 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务创建【入门二】-CSDN博客】 今天要实现再创建一个任务。【二值和互斥都进行测试】 ①、通过任务A发送一个信号量&#xff0c;另一个任务得到信号量后再发送helloworld。 ②、两个任务通过互斥信…

windows安装Elasticsearch及增删改查操作

1.首先去官网下载Elasticsearch 下载地址 我这里选择的是7.17.18 选择windows版本 下载完成后解压是这样的 下载完成后点击elasticsearch.bat启动elasticsearch服务 输入http://localhost:9200看到如下信息说明启动成功。 还有记得修改elasticsearch.yml文件&#xff0c;…

虚拟机VMware的安装问题ip错误,虚拟网卡

要么没有虚拟网卡、有网卡远程连不上等 一般出现在win11 家庭版 1、是否IP错误 ip addr 2、 重置虚拟网卡 3、查看是否有虚拟网卡 4、如果以上检查都解决不了问题 如果你之前有vmware 后来卸载了&#xff0c;又重新安装&#xff0c;一般都会有问题 卸载重装vmware: 第一…

户籍管理系统的设计与实现【源码+文档+部署讲解】

目 录 摘 要 Abstract 1 系统大概 1.1 系统背景 1.2 研究意义 1.3 本文结构 1.4 开发平台简介 1.4.1 Java语言的特点 1.4.2 J2EE概述 1.4.3 B/S结构概述 1.4.4 MySQL 1.4.5 Tomcat 1.4.6 JSP.NET 1.4.7 开发流程 1.4.8 Eclipse简介 1.4.9 of…

【Rust自学】5.1. 定义并实例化struct

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 5.1.1. 什么是struct struct的中文意思为结构体&#xff0c;它是一种自定义的数据类型&#xff0c;它允许程序为相关联的值命名和打包&am…

【自动驾驶】单目摄像头实现自动驾驶3D目标检测

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 概述算法介绍演示效果图像推理视频推理 核心代码算法处理过程使用方式环境搭建下载权重文件pytorch 推理&#xff08;自动选择CPU或GPU&#x…

Python+OpenCV系列:AI看图识人、识车、识万物

在人工智能风靡全球的今天&#xff0c;用 Python 和 OpenCV 结合机器学习实现物体识别&#xff0c;不仅是酷炫技能&#xff0c;更是掌握未来的敲门砖。本篇博文手把手教你如何通过摄像头或图片输入&#xff0c;识别人、动物、车辆及其他物品&#xff0c;让你的程序瞬间具备 AI …

永磁同步电机负载估计算法--自适应扩张状态观测器

一、 原理介绍 在线性扩张观测器中&#xff0c;LESO观测器增益ω0 决定了观测器的跟踪速度&#xff0c;ω0 越大&#xff0c;观测器估计精度越高&#xff0c; 抗干扰能力越强&#xff0c;瞬态响应速度加快&#xff0c;过大则会引入高频噪声使系统不稳定。为使观测器在全速域内…

【Spring事务】深入浅出Spring事务从原理到源码

什么是事务 保证业务操作完整性的一种数据库机制 &#xff08;driver 驱动&#xff09;事务特定 ACID A 原子性 &#xff08;多次操作 要不一起成功 要不一起失败 &#xff08;部分失败 savepoint&#xff09;&#xff09; C 一致性 &#xff08;事务开始时数据状态&#xff0c…