数据结构与算法学习(day4)——解决实际问题
前言
在本章的学习此前,需要复习前三章的内容,每个算法都动手敲一遍解题。宁愿学慢一点,也要对每个算法掌握基本的理解!
前面我们学习了简化版桶排序、冒泡排序和快速排序三种算法,今天我们来实践一下前面的三种算法。
本章的学习目标:
(1)回顾三个算法的基本原理,能够熟悉运用三个算法解决问题
(2)用三种不同算法解决同一个问题
题目
(1)输入有2行,第1行为一个正整数,表示有n个同学参与调查(n<=100)。第2行有n个用空格隔开的正整数,为每本图书的ISBN号(假设图书的ISBN号在1~1000)。
(2)输出也是2行。第1行为一个正整数k,表示需要买多少本书。第2行为k个用空格隔开的正整数,为从小到大已排好序的需要购买的图书的ISBN号(去重)。
例如输入:
10
20 40 32 67 40 20 89 300 400 15
则输出:
8
15 20 32 40 67 89 300 400
(3)最后,程序运行的时间限制为1s。
分析题目
我们要实现的要求有:
- 对数据按从小到大顺序排列
- 去重
方法一
我想到的第一个方法就是用简化版桶排序。
程序如下:
#include <stdio.h>
int book[1001], n;
int main()
{int i, j, k=0, t;for (i = 0; i <= 1000; i++)book[i] = 0;scanf("%d",&n);for (i = 1; i <= n; i++){scanf("%d", &t);book[t]++;if (book[t] == 1){book[t] = 2;k++;}else if (book[t] > 2){book[t] = 2;}}printf("%d\n",k);for (i = 1; i <= 1000; i++)if(book[i]==2)printf("%d ", i);
}
效果如图

我们来评价一下这个程序,毫无疑问,这个程序比较无脑,不是一个巧妙的处理方式,但是也可以实现题目要求。
- 程序运用的方法是比较简单的桶排序
- 思路是先排序(排序实际上数组已经排好了),后去重。
- 这个方法的时间复杂度就是桶排序的时间复杂度O(N+M)。
方法二
第二种方法也是先排序后去重,排序我们可以使用冒泡排序或者快速排序,这里我们用冒泡排序举例。
#include <stdio.h>
int main()
{int a[1001], i,j, n,t,k = 0;scanf("%d",&n);for (i = 0; i < n; i++)scanf("%d",&a[i]);//开始冒泡排序for (i = 0; i < n - 1; i++){for (j = 0; j < n - i - 1; j++){if (a[j] > a[j + 1]) //按从小到大的顺序排列{t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;}}}for (i = 0; i < n; i++){if (a[i] == a[i - 1]) //计算重复元素的个数k++;}printf("%d\n",n - k);for (i = 0; i < n; i++){if(a[i] != a[i-1])printf("%d ", a[i]);} return 0;
}

我们来评价一下这个程序,
- 程序运用的方法是比较简单的冒泡排序
- 思路是先排序,后去重。
- 这个方法的时间复杂度就是桶排序的时间复杂度O(N^2),冒泡排序的时间复杂度在整个程序中是大块,所以其他两个的时间复杂度不计,时间复杂度比较高。
- 如果要排序的数字数量增大,大到10万,桶排序要申请更大的数组,不现实,而冒泡排序的时间复杂度高所以耗时不少,这时候就只能用快速排序,如下;
#include <stdio.h>
/*****************
*a[101]用于存放要排序的数组
* n是要排序的个数
*****************/
int a[1001], n; //全局变量,这两个变量需要在子函数中使用
/*****************
* 函数名:quicksort
* 形参:int left, int right
* 返回值:无
* 作用:快速排序算法
* ****/
void quicksort(int left, int right) // left一直都是1
{int i, j, t, temp;if (left > right)return;temp = a[left]; //temp中存的就是基准数i = left;j = right;while (i != j) //相遇后跳出循环{//顺序很重要,要先从右往左找while (a[j] >= temp && i < j)j--;//再从左往右找while (a[i] <= temp && i < j)i++;//交换两个数再数组中的位置if (i < j) //当哨兵i和哨兵j没有相遇时{t = a[i];a[i] = a[j];a[j] = t;}}//最终将基准数归位//若相遇,一定是在一个小于基准数的数相遇,将相遇时的数作为基准数进行下一轮的“探测”a[left] = a[i];a[i] = temp;quicksort(left,i-1); //继续处理左边的,这里是一个递归的过程quicksort(i + 1, right); //继续处理右边的,这里是一个递归的过程
}
int main()
{int i,j,k = 0;scanf("%d", &n);for (i = 1; i <= n; i++)scanf("%d", &a[i]);//开始快速排序quicksort(1, n); //快速排序调用for (i = 1; i <= n; i++){if (a[i] == a[i - 1]) //计算重复元素的个数k++;}printf("%d\n", n - k);for (i = 1; i <= n; i++){if (a[i] != a[i - 1])printf("%d ", a[i]);}return 0;
}

(1)我们在写程序的时候,只要不是面试等需要现场手打程序,那我们可以利用之前写好的代码,移植到我们现在的问题上,来解决问题。
(2)所以,平时多储备知识和源码,还是很重要的,平时的积累,要求我们要掌握好知识,否则到移植的时候,半天都移植不成功。
小结
我们来回顾一下三个算法的时间复杂度。
(1)桶排序是最快的,时间复杂度为O(N+M);
(2)冒泡排序是O(N^2)
(3)快速排序是O(NlogN)
下一节,我们将进入栈、队列、链表的学习。
相关文章:
数据结构与算法学习(day4)——解决实际问题
前言 在本章的学习此前,需要复习前三章的内容,每个算法都动手敲一遍解题。宁愿学慢一点,也要对每个算法掌握基本的理解! 前面我们学习了简化版桶排序、冒泡排序和快速排序三种算法,今天我们来实践一下前面的三种算法。…...
PG库列类型转换
首先自定义两个函数,其中try_cast_numeric函数是将字符类型转成数字类型,try_cast_timestamp函数是将字符类型转成时间戳类型。 create or replace function try_cast_numeric(p_in text, p_default numeric default null)returns numeric as $$ beginb…...
vue3中的reactive赋值问题
问题 当通过方法对reactive变量修改的时候,发现页面上的值没有及时更新? 解决方法 具体原因: 上面这样赋值检测不到,因为响应式的是它的属性,而不是它自身. 方法1: 单个赋值 如下: let obj reactive({name: zha…...
thinkphp 操作远程oracle遇到的相关坑
坑一:没有内置oracle 解决方法: 1,下载think-oracle 扩展,资源很多,百度即可下载,分别放置于db下的connector 和 builder 文件夹下 2,安装oracle本地客户端,一搜一大把,核…...
流媒体之推流和拉流
推流:将直播内容推送至服务器的过程 拉流:为服务器已有直播内容,用指定地址进行拉取的过程 什么是推流? 推流,指的是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。“推流”…...
浏览器中怎样查看前后端传值
路径:F12–>Network -->Fetch/XHR,选择一个接口地址。 在payload里面是前端发送给后端的参数。也即客户端发送给服务端的请求数据,即接口地址入参。 Preview和Response里都是后端返回给前端的。Preview是格式化过的,比较容易看。Resp…...
计算机竞赛 基于深度学习的人脸表情识别
文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的人脸表情识别 该项目较…...
虹科分享 | MKA:基于先进车载网络安全解决方案的密钥协议
MKA作为MACsec的密钥协议,具有安全、高效、针对性强的特点,为您的汽车ECU通讯创建了一个安全的通信平台,可以助力您的各种汽车创新项目! 虹科方案 | 什么是基于MACsec的汽车MKA 一、MACsec在汽车行业的应用 在以往的文章中&#…...
jmeter 常数吞吐量定时器
模拟固定吞吐量的定时器。它可以控制测试计划中各个请求之间的时间间隔,以达到预期的吞吐量。 参数包括: Target Throughput:目标吞吐量(每分钟请求数)Calculate Throughput based on:吞吐量计算基准&…...
【大数据Hive】hive 加载数据常用方案使用详解
目录 一、前言 二、load 命令使用 2.1 load 概述 2.1.1 load 语法规则 2.1.2 load语法规则重要参数说明 2.2 load 数据加载操作演示 2.2.1 前置准备 2.2.2 加载本地数据 2.2.3 HDFS加载数据 2.2.4 从HDFS加载数据到分区表中并指定分区 2.3 hive3.0 load 命令新特性 …...
计及电池储能寿命损耗的微电网经济调度(matlab代码)
目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型,以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数,创新考虑储能寿命损耗约束、放电深度约束和储能循环次…...
DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件架构具体调优
一分钟速通ACPI和鲲鹏软件移植 操作系统内核鲲鹏软件移植鲲鹏软件移植流程 编译工具选择编译参数移植案例源码修改案例鲲鹏分析扫描工具 Dependency Advisor鲲鹏代码迁移工具 Porting Advisor 鲲鹏软件性能调优鲲鹏软件性能调优流程CPU与内存子系统性能调优网络子系统性能调优磁…...
4.正则提取html中的img标签的src内容
我们以百度贴吧的1吧举例 目录 1 把网页搞下来 2 收集url 3 处理url 4 空的src 5 容错 6 不使用数字作为文件名 7 并不是所有的图片都用img标签表示 8 img标签中src请求下来不一定正确 9 分页 1 把网页搞下来 搞下来之后,双击打开是这样的 2 收…...
安装对应版本pytorch和torchvision
遇见报错: ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distribution found for torch 解决方法: 1、网站找到对应torch和torchvision版本,cp对应python版本ÿ…...
酷克数据与华为合作更进一步 携手推出云数仓联合解决方案
在一起,共迎新机遇!8月25-26日,2023华为数据存储用户精英论坛在西宁召开。酷克数据作为国内云原生数据仓库的代表企业,也是华为重要的生态合作伙伴,受邀参与本次论坛,并展示了云数仓领域最新前沿技术以及联…...
若依 MyBatis改为MyBatis-Plus
主要内容:升级成mybatis-plus,代码生成也是mybatis-plus版本 跟着我一步一步来,就可完成升级! 检查:启动程序,先保证若依能启动 第一步:添加依赖 这里需要在两个地方添加,一个是最…...
docker-ubuntu
docker ps docker images 拉取ubuntu镜像 docker pull ubuntu 启动 docker start podid docker run -itd -e TZAsia/Shanghai --name ubuntu-test -v /share:/shared -d ubuntu:latest 进入bash界面 docker exec -it podid /bin/bash 安装sudo apt-get install sudo …...
Mock 基本使用
mock解决的问题 开发时,后端还没完成数据输出,前端只好写静态模拟数据。数据太长了,将数据写在js文件里,完成后挨个改url。某些逻辑复杂的代码,加入或去除模拟数据时得小心翼翼。想要尽可能还原真实的数据,…...
MySql学习笔记08——事务介绍
事务 基本概念 事务是一个完整的业务逻辑,是一个最小的工作单元,不可再分。 一个完整的业务逻辑包括一系列的操作,这些操作是整个业务逻辑中的最小单元,这些操作要么同时成功,要么同时失败。 由于只有DML语句中才会…...
AMEYA360:思瑞浦推出汽车级超低静态功耗高压LDO—TPL8031Q
聚焦高性能模拟芯片和嵌入式处理器创新研发的半导体公司——思瑞浦3PEAK(股票代码:688536),推出全新一代汽车级超低静态功耗高压线性稳压器——TPL8031Q。 TPL8031Q拥有支持3V~42V宽输入电压范围、3μA超低静态功耗、多种封装可选等性能优势,…...
MogFace人脸检测工具问题排查大全:从路径错误到权限问题的解决方案
MogFace人脸检测工具问题排查大全:从路径错误到权限问题的解决方案 1. 工具简介与常见问题概述 MogFace人脸检测工具是基于CVPR 2022发表的MogFace模型开发的本地高精度检测解决方案。它能够准确识别多尺度、多姿态以及部分遮挡的人脸,并自动标注检测框…...
S32K312实战:用AUTOSAR Icu模块测量PWM占空比与周期(基于NXP MCAL与EB Tresos)
S32K312实战:AUTOSAR Icu模块精准测量PWM信号的工程实践 在汽车电子开发中,PWM信号的精确测量是ECU功能实现的基础环节。无论是发动机控制单元中的转速信号采集,还是车身电子中的执行器状态反馈,都需要对PWM信号的周期、占空比等参…...
AMD Ryzen硬件调试指南:5分钟掌握SMUDebugTool核心功能
AMD Ryzen硬件调试指南:5分钟掌握SMUDebugTool核心功能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…...
避开原子操作坑!Keil AC5移植LwRB 3.0.0的保姆级避坑指南
避开原子操作坑!Keil AC5移植LwRB 3.0.0的保姆级避坑指南 在嵌入式开发中,环形缓冲区(Ring Buffer)是一种常见的数据结构,广泛应用于串口通信、DMA传输等场景。LwRB(Lightweight Ring Buffer)作…...
告别盲打:用GDB和Python-pwntools动态调试分析jarvisoj_level2的栈溢出漏洞
逆向工程实战:用GDB与pwntools解剖jarvisoj_level2栈溢出漏洞 在二进制安全领域,栈溢出漏洞一直是攻防演练中的经典课题。今天我们将以jarvisoj_level2这道CTF题目为蓝本,深入探讨如何通过GDB动态调试与pwntools脚本的完美配合,实…...
VMware 虚拟机 Kali Linux 光标消失?五步实操攻略轻松找回
在 VMware Workstation Pro 中运行 Kali Linux 时,不少用户会遇到 “光标隐形” 的棘手问题 —— 系统可正常操作,但光标一进入虚拟机窗口就消失。这一现象多由硬件兼容性、驱动配置或增强工具缺失导致,并非硬件故障。本文整合社区实测有效方…...
Karp的21个NPC问题:从理论到实践的经典探索
1. Karp与NPC问题的历史背景 1971年,Stephen Cook在论文《The Complexity of Theorem Proving Procedures》中首次提出了NP完全性的概念,并证明了布尔可满足性问题(SAT)属于NP完全问题。这一突破性工作为计算复杂性理论奠定了基石…...
中小企业SEO推广应该投入多少费用
<h2>中小企业SEO推广应该投入多少费用</h2> <p>在数字化时代,网络已经成为企业推广和销售的重要渠道之一。特别是对于中小企业来说,通过优化搜索引擎(SEO)来提升网站的自然流量,是非常有效且相对经济…...
CnOpenData 中国全部银行对外投资信息数据
银行是经营货币和信用业务的金融机构,通过发行信用货币、管理货币流通、调剂资金供求、办理货币存贷与结算,是商品货币经济发展到一定阶段的产物。自改革开放以来,我国的商品经济愈发活跃,银行业的规模发展十分迅速。但在如今利率…...
文脉定序详细步骤:自定义prompt模板提升BGE-m3在垂直领域表现
文脉定序详细步骤:自定义prompt模板提升BGE-m3在垂直领域表现 1. 理解文脉定序与BGE-m3的核心价值 文脉定序是一款基于BGE-m3模型的智能语义重排序系统,专门解决传统搜索引擎"搜得到但排不准"的痛点。它通过全交叉注意机制,对问题…...
