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

news2024/12/23 15:35:59

插入排序

#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)。例如在数据仓库中,经常会为了查询性能而牺牲一些范式规则,通过冗余数据来减少多表连接的操作,提高查询效率。

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

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

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

相关文章

米思奇图形化编程之ESP32控制LED灯闪烁方案实现

目录 一、项目概述 二、硬件准备 三、硬件连接 四、软件编程 五、验证效果 六、总结 一、项目概述 本项目使用米思奇图形化编程环境&#xff0c;编写micropython软件代码&#xff0c;实现了控制ESP32开发板上LED灯闪烁效果。该项目可为后续更复杂的物联网项目打下基础。…

完全离线使用,效率直接拉满

现在越来越多的人使用OCR软件来提高自己的工作效率&#xff0c;今天给大家推荐一款电脑端的文字识别工具&#xff0c;对比以往的软件来说&#xff0c;功能更加丰富全面。 Umi-OCR 美术、舞蹈、音乐 打开软件之后需要安装一下。 软件主要有截图OCR识别、批量OCR识别、批量文档识…

CSDN外链失效3:

参考我之前的博客&#xff1a; 外链失效博客1&#xff1a;随想笔记1&#xff1a;CSDN写博客经常崩溃&#xff0c;遇到外链图片转存失败怎么办_csdn外链图片转存失败-CSDN博客 外链失效博客2&#xff1a;网络随想2&#xff1a;转语雀_md格式转语雀lake格式-CSDN博客 markdown…

Java 中的字符串

目录 Java 中的字符串字符串的创建字符串的比较字符串的拼接如何定义一个空的字符串 Java 中的字符串 字符串的创建 在 Java 中&#xff0c;可以通过以下几种方式创建字符串&#xff1a; 1.使用字符串字面量&#xff1a; String str "Hello, World!";2.使用 new…

U盘结构损坏且无法访问:原因、恢复方案与预防措施

U盘结构损坏现象描述 U盘&#xff0c;这一小巧便捷的存储设备&#xff0c;在日常工作和学习中扮演着重要角色。然而&#xff0c;当U盘出现结构损坏且无法访问时&#xff0c;用户往往会陷入焦虑与困惑。具体表现为&#xff0c;将U盘插入电脑后&#xff0c;系统无法识别U盘&…

basic_ios及其衍生库(附 GCC libstdc++源代码)

basic_ios及其衍生库(附 GCC libstdc源代码) 我们由这张图展开我们的讨论 对于Date对象&#xff0c;只有实现了<<重载到输出流才可以插入到stringstream ss中 现在我有疑问stringstream是怎么做到既能输出又能输入的&#xff1f; 而且为什么stringstream对象能传给ostre…

【开源库 | minizip】Linux(Ubuntu18.04)下,minizip的编译、交叉编译

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-12-20 …

Gin-vue-admin(1):环境配置和安装

目录 环境配置如果443网络连接问题&#xff0c;需要添加代理服务器 后端运行前端运行 环境配置 git clone https://gitcode.com/gh_mirrors/gi/gin-vue-admin.git到server文件目录下 go mod tidygo mod tidy 是 Go 语言模块系统中的一个命令&#xff0c;用于维护 go.mod 文件…

java: 无效的目标发行版: xx

java: 无效的目标发行版: xx 背景java: 无效的目标发行版: xx 在 Intellij 的修复 背景 这里单独针对Intellij开发工具对 “java: 无效的目标发行版: xx”错误的修复。 java: 无效的目标发行版: xx 在 Intellij 的修复 同一台电脑使用多个JDK的时候容易出现在运行程序时容易…

vscode+编程AI配置、使用说明

文章目录 [toc]1、概述2、github copilot2.1 配置2.2 使用文档2.3 使用说明 3、文心快码&#xff08;Baidu Comate&#xff09;3.1 配置3.2 使用文档3.3 使用说明 4、豆包&#xff08;MarsCode&#xff09;4.1 配置4.2 使用文档4.3 使用说明 5、通义灵码&#xff08;TONGYI Lin…

leetcode-80.删除有序数组的重复项II-day12

总结&#xff1a;不必过于死磕一道题目&#xff0c;二十分钟没做出来就可参考题解

Docker 入门:如何使用 Docker 容器化 AI 项目(一)

引言 在人工智能&#xff08;AI&#xff09;项目的开发和部署过程中&#xff0c;环境配置和依赖管理往往是开发者遇到的挑战之一。开发者通常需要在不同的机器上运行同样的代码&#xff0c;确保每个人使用的环境一致&#xff0c;才能避免 “在我的机器上可以运行”的尴尬问题。…

EdgeX Core Service 核心服务之 Core Command 命令

EdgeX Core Service 核心服务之 Core Command 命令 一、概述 Core-command(通常称为命令和控制微服务)可以代表以下角色向设备和传感器发出命令或动作: EdgeX Foundry中的其他微服务(例如,本地边缘分析或规则引擎微服务)EdgeX Foundry与同一系统上可能存在的其他应用程序…

Keil5 STM32库函数的工程

库函数来间接的操作寄存器 条件编译&#xff0c;如果你定义了USE_STDPERIPH_DRIVER &#xff08;使用标准外设驱动&#xff09;这个字符串&#xff0c;stm32f10x_conf.h才有效

Vue2五、自定义指令,全局局部注册、指令的值 ,插槽--默认插槽,具名插槽 ( 作用域插槽)

一、自定义指令 使用步骤 1. 注册 (全局注册 或 局部注册) &#xff0c;在 inserted 钩子函数中&#xff0c;配置指令dom逻辑 2. 标签上 v-指令名 使用 1、自定义指令&#xff08;全局&#xff09; Vue.directive("指令名"&#xff0c;{ 指令的配置项 insert…

Docker部署GitLab服务器

一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台&#xff0c;集成了版本控制、代码审查、问题跟踪、持续集成与持续交付&#xff08;CI/CD&#xff09;等多种功能&#xff0c;旨在为团队提供一站式的项目管理解决方案。借助 GitLab&#xff0c;开发…

MySQL基础笔记(三)

在此特别感谢尚硅谷-康师傅的MySQL精品教程 获取更好的阅读体验请前往我的博客主站! 如果本文对你的学习有帮助&#xff0c;请多多点赞、评论、收藏&#xff0c;你们的反馈是我更新最大的动力&#xff01; 创建和管理表 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数…

使用qemu搭建armv7嵌入式开发环境

目录 目录 1 概述 2 环境准备 2.1 vexpress系列开发板介绍 2.2 安装工具 2.2.1 安装交叉工具链 2.2.2 安装qemu 2.2.3 安装其他工具 3 启动uboot 3.1 uboot下载与编译 3.1.1 下载 3.1.2 编译 3.2 使用qemu启动uboot 4 启动kernel 4.1 下载和编译kernel 4.1.1 下…

数据思维的哲学思考

引言 天地合而万物生&#xff0c;阴阳接而变化起。 《荀子礼论》 数据思维的哲学基础源于唯物主义哲学。在马克思的唯物主义思想中&#xff0c;世界是物质的&#xff0c;物质是运动的&#xff0c;运动是有规律的&#xff0c;规律是客观的。 数据思维的哲学基础就是&#xff…

Dijkstra(迪杰斯特拉)最短路径算法可视化演示

Dijkstra(迪杰斯特拉)算法&#xff0c;是一种解决带权图中单源最短路径的经典算法。它由荷兰计算机科学家 Edsger Dijkstra 于1956年提出。在现实生活中&#xff0c;这个算法被广泛应用于导航系统、网络路由等场景。 比如在地图导航中&#xff0c;城市可以看作图中的节点&…