初级1 题目一 时间复杂度及示例

2023-11-12

1. 什么是时间复杂度?

        常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。        
        一个算法流程中,常数操作数量的指标(就是常数操作在算法里总共有多少次)称为时间复杂度。常用O(读作big O)来表示。具体来说,在常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果记为 f(N),那么时间复杂度为 O(f(N))。
        评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是常数项时间

2. 时间复杂度的例子

        一个有序数组A,另一个无序数组B,请打印B中的所有不在A中的数,A数组长度为N,B数组长度为M。

算法流程1:对于数组B中的每一个数,都在A中通过遍历的方式找一下;
算法流程2:对于数组B中的每一个数,都在A中通过二分的方式找一下;
算法流程3:先把数组B排序,然后用类似外排的方式打印所有不在A中出现的数;
三个流程,三种时间复杂度的表达...
1)打印 B中的所有不在A中的数,意思就是在B数组中,与A数组不相同的数,都将其打印出来;第一个流程简单明了,每次B数组取出一个数,去和A数组全部的元素都对比一下,这样如果B数组取出的数和A数组全部元素都没有相同的,那么将这个元素打印出来,B数组M个数,A数组N个数,这样操作下来总共要执行 MN 次,所以时间复杂度 O(MN)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

// 想要的功能,给定范围,给定个数,生成一个带有随机数的数组
void Generate(int **ptr, int length, int high){
	
	*ptr = malloc(sizeof(int)*length); 
	if(*ptr){
		int rand_num;
		for(int i=0;i<length;i++){
			rand_num = rand() % high; // 生成[0,high)的随机数
			*(*ptr+i) = rand_num;    // *ptr是首地址
		}
	}
	else{
		printf("Application for space failed!");
	}
}

// 交换两块内存中的值
void Swap(void *first, void *second, size_t size){
	
	// 得到传进来的类型,利用其开辟一块相同大小的空间
	void *temp = malloc(sizeof(void *)*size);
	
	// 然后将值复制到那块空间中,执行交换操作
	if(temp){
		memcpy(temp,first,size);  // 目的地,源,复制多少块内存
		memcpy(first,second,size);
		memcpy(second,temp,size);
	}
	else{
		puts("Application for space failed!");
	}
}

// 冒泡排序
void BubbleSort(int *array, int length){
	int i,j;
	
	for(i=length-1;i>0;i--){
		for(j=0;j<i;j++){
			if(*(array+j) > *(array+j+1)){
				Swap(array+j, array+j+1, 1);
			}
		}
	}
} 

// 找到B中的所有不在A的元素
void FindDifferenceFirst(int *arrayA, int *arrayB,int length_a, int length_b){
	int i,j;
	for(i=0;i<length_b;i++){
		for(j=0;j<length_a;j++){
			if(*(arrayB+i) == *(arrayA+j)){ // 如果B中元素在A中找到了,直接跳转到B数组中下一个元素
				break;
			}else if(j==length_a-1){  // 如果遍历到A数组最后一个元素,而且两者还不相等
				printf("%d " ,*(arrayB+i));
			}
		}
	}
}

int main()
{
    srand(time(NULL));  // 每次随机出来的数不一样
	
	int length_a = 10;
	int high_a = 20;
	
	int *arrayA;    // 创建数组A
	Generate(&arrayA, length_a, high_a);
	BubbleSort(arrayA, length_a);  // A数组有序
	
	int length_b = 15;
	int high_b = 20;
	int *arrayB;    // 创建数组B,无序数组
	Generate(&arrayB, length_b, high_b); 
	
	int i;
	// 打印A数组
	printf("A数组:\n");
	for(i=0;i<length_a;i++){
		printf("%d ", *(arrayA+i));
	}
		
	// 打印B数组
	printf("\nB数组:\n");
	for(i=0;i<length_b;i++){
		printf("%d ", *(arrayB+i));
	}
	
	printf("\nB中所有不在A的元素:\n");
	FindDifferenceFirst(arrayA,arrayB,length_a,length_b);
	
	return 0;
}

2)第二种算法流程的提出是因为 A 是有序数组,有序数组二分查找的时间复杂度是 O(logn)(所有A查找一遍的复杂度是 O(logN) ),遍历数组 B 的时间复杂度为 O(M),所有总的时间复杂度是 O(MlogN)

// 二分查找
int BinarySearch(int number, int *array, int length){
	int low = 0;
	int high = length-1;

	while(low <= high){
		int middle = low + (high-low)/2;
		
		if(number < *(array+middle)){
			high = middle-1;
		}else if(number > *(array+middle)){
			low = middle+1;
		}else{
			return *(array+middle);
		}
	}
	return -1;
}

void FindDifferenceSecond(int *arrayA, int *arrayB,int length_a, int length_b){
	int i,j;
	for(i=0;i<length_b;i++){
		int result = BinarySearch(*(arrayB+i), arrayA, length_a);
		if(result == -1){ // 等于-1代表A中没有这个数
			printf("%d, ", *(arrayB+i));
		}
	}
}

int main()
{
    srand(time(NULL));  // 每次随机出来的数不一样
	
	int length_a = 10;
	int high_a = 20;
	
	int *arrayA;    // 创建数组A
	Generate(&arrayA, length_a, high_a);
	BubbleSort(arrayA, length_a);  // A数组有序
	
	int length_b = 15;
	int high_b = 20;
	int *arrayB;    // 创建数组B,无序数组
	Generate(&arrayB, length_b, high_b); 
	
	int i;
	// 打印A数组
	printf("A数组:\n");
	for(i=0;i<length_a;i++){
		printf("%d ", *(arrayA+i));
	}
		
	// 打印B数组
	printf("\nB数组:\n");
	for(i=0;i<length_b;i++){
		printf("%d ", *(arrayB+i));
	}
	
	printf("\nB中所有不在A的元素:\n");
	\\ FindDifferenceFirst(arrayA,arrayB,length_a,length_b);
	
	printf("\n");
	FindDifferenceSecond(arrayA,arrayB,length_a,length_b);
	
	
	return 0;
}

3)算法流程3,首先 B 数组排序就是 O(MlogM) 的时间复杂度,其次,利用类似外排的方式意思就是,设置两个指标,分别指向 A、B 数组的起始位置,然后逐一比对,哪个数组的元素小,哪个数组的指标就向后移,在移动的过程中进行判断:如果 A 数组中元素比 B 数组元素小,A 数组的指标 ++;如果 B 数组的元素比 A 数组元素相等,B 数组指标 ++;如果 B 数组元素比 A 数组元素小,那么打印该元素,并且 B 数组指标 ++,因为这证明 B 数组之前就没有和 A 数组元素相等的时候;最后判断一下 B 数组是否遍历完毕,因为如果 A 数组值都小于 B 数组,B 数组的指标是没办法移动的,至于 A 数组遍历完毕无所谓,只要 B 中元素都和 A 比较过就行。这样比较下来的时间复杂度是 O(M+N),所以总时间复杂度为 O(MlogM) + O(M+N)

void FindDifferenceThird(int *arrayA, int *arrayB, int length_a, int length_b){
	
	// 首先将B数组排序
	BubbleSort(arrayB,length_b);
	
	int i=0,j=0;
	while(i<length_a && j<length_b){
		if(*(arrayA+i) < *(arrayB+j)){  // 如果A的元素小
			i++;
		}else if(*(arrayA+i) == *(arrayB+j)){
			j++;
		}else if(*(arrayA+i) > *(arrayB+j)){
			printf("%d ", *(arrayB+j));
			j++;
		}
	}
	// 还要判断一下B数组有没有遍历完,没遍历完说明A数组元素都太小了
	while(j<length_b){
		printf("%d ", *(arrayB+j));
		j++;
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初级1 题目一 时间复杂度及示例 的相关文章

  • 下载LAMBDA Group的代码

    LAMBDA Group 的文章在其主页有公布代码和数据集 具体在其 主页 gt 数据与代码 下面的 代码 栏列了文章 比如点开第一篇 AcMR 里面有个下载代码的链接 code 但点开会发现 无法链接到服务器 根据杨嘉祺的邮件回复 在网址
  • Google前工程经理王忻:如何准备软件工程师的面试

    2010 10 20 10 48 4639次阅读 来源 伯乐在线 职场博客 已有0条评论 发表评论 关键词 Google 软件工程师 面试 作者 人力资源 收藏这篇资讯 导读 原文作者王忻 Google前工程经理 2003年月加入Googl
  • 【华为OD机试真题2023B卷 JAVA&JS】人气最高的店铺

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 人气最高的店铺 知识点贪心排序 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 某购物城有m个商铺 现决定举办一场活动选出人气最高店铺 活动共有n位市民参与 每位市民只能

随机推荐

  • 微信小程序Token登录验证

    上图是微信开发文档提供的图 最近开发一款小程序 看了许久的微信文档 这里来记录一下其中的登录与授权过程 总体流程 前端执行wx login 获取code传给后端 后端通过微信官方的登录凭证校验接口获取到session key与openid
  • 使用PHP语言实现ETH 及 token转账

    以太坊转账 废话不多说直接上代码 代码下载地址 https download csdn net download u012841825 11021920 github代码 用你们可爱的小手 点一下星星 https github com zc
  • Angular 模态框 入坑记

    今天用到了ui bootstrap中的modal 觉得用起来还不错 也比较简单 博主以前用个ngDialog做的模态框 虽然不知道对不对 但这个插件也还可以 这貌似是我目前为止用过最简单的功能了 所以博客内容也很简单 大家一看就能懂 因为博
  • Qt中布局管理使用总结

    目录 1 五大布局 1 1 QVBoxLayout垂直布局 1 2 QHBoxLayout水平布局 1 3 QGridLayout网格布局 1 4 QFormLayout表单布局 1 5 QStackedLayout分组布局 1 6 五大布
  • linux下多线程:经典生产者和消费者示例

    生产者和消费者典型案例 include
  • 使用db doctor批量更新库

    之前旧版本的封装库 在更新candence软件后 需要使用db doctor对其进行更新 但是一个一个更新太慢 搜了半天 没有找到如何批处理更新 直接硬钢 于是将放置封装库文件目录下任意类型文件全部设置 将原来选中的文件名和后缀替换为 点击
  • Mac远程Win桌面官方工具——Microsoft Remote Desktop for mac

    微软官方专门为Mac用户提供了一款类Windows mstsc的远程桌面工具 Microsoft Remote Desktop for mac 专门用于远程控制Windows桌面 但是 苹果Appstore中国区无法搜索到该软件 不知道什么
  • 简单几步升级Spring security4.x升级到5.x

    本次升级源自一次安全漏洞提醒 Spring Security 身份认证绕过漏洞 CVE 2022 22978 现将漏洞相关详情下发 如系统使用了受影响版本软件 请参照处置建议及时完成处理 风险名称 Spring Security 身份认证绕
  • oracle自动生成uuid的实现方法

    oracle自动生成uuid方法 1 创建一个表 1 create table t user id varchar2 200 name varchar2 200 2 生成uuid的语句 1 2 alter table t user modi
  • Android Studio出现ERROR: AdbHostServer.cpp:102: Unable to connect to adb daemon on port: 5037问题

    打开android studio自带模拟机出现问题 原因是adb exe因为被阻止不能启动 具体错误代码如下 Emulator emulator ERROR AdbHostServer cpp 102 Unable to connect t
  • 性能不输 x265!国产开源 AVS2 高清实时编码器 xAVS2

    2018 年 1 月 31 日 北京大学数字视频编解码技术国家工程实验室视频编码算法研究室 PKU VCL 开源了 AVS2 高清实时编码器 xAVS2 V1 0 AVS2 是我国新一代视频编码国家标准 和第一代 AVS 视频编码标准相比
  • jenkins添加网页链接方法

    代码 li 外网页测试链接 a href http www baidu com 百度 a li li 本地网页测试链接 a href http 192 168 0 236 8080 seed package index html 我的本地h
  • 高德地图实现点聚合功能的详细步骤加截取地图图片 (附源码)

    目录 介绍 准备工作 1 注册并登录高德地图开放平台 申请密钥 2 在Vue项目中安装高德地图的相关库 插件 一 点聚合 1 引入高德地图API font color purple initializeMap font color purp
  • Codeforces ZeptoLab Code Rush 2015

    Codeforces ZeptoLab Code Rush 2015 比赛链接 http codeforces com contest 526 A King of Thieves time limit per test 1 second m
  • python不能创建字典的是_python字典key不能是可以是啥类型

    python中字典的key不能是可变类型 字典可存储任意类型对象 其中值可以取任何数据类型 但键必须是不可变的 如字符串 数字或元组 语法格式 d key1 value1 key2 value2 字典是另一种可变容器模型 且可存储任意类型对
  • c++的类与对象(下)

    1 初始化列表 在创建对象时 编译器通过调用构造函数 给对象中各个成员变量一个合适的初始值 构造函数体中的语句只能将其称作为赋初值 而不能称作初始化 因为初始化只能初始化一次 初始化的本质就是只能初始化一次 而构造函数体内可以多次赋值 以一
  • 漫话算法[二分查找]:不用背你也能写出漂亮的二分查找框架并秒杀至少5道题!

    快来和叮当学习算法吧 B站同步更新 同步到开源项目Github传送门 Easy Programming及微信公众号 CVBear 项目内含Leetcode五杀刷题指南 致力于通过5个问题带你入门掌握算法套路 漫话算法 二分查找 算法模板 一
  • VT系列二:检测是否支持虚拟化

    本文只是学习此视频后的一些总结 不当之处还请指出 视频作者 小宝来了 视频连接 http bbs pediy com showthread php t 211973 约定 本文中出现的名词 虚拟机 客户机 GUEST 都是被监控的操作系统或
  • Python第一课:print()函数、变量与赋值

    Python第一课 print 函数 变量与赋值 所有的符号输入 必须是英文状态 一 print 函数的用法 单刀赴会 不带引号 数据 黄袍加身 单引号 双引号 三引号 单引号与双引号效果一致 当括号内有的语句有单引号或双引号时 三引号可以
  • 初级1 题目一 时间复杂度及示例

    1 什么是时间复杂度 常数时间的操作 一个操作如果和数据量没有关系 每次都是固定时间内完成的操作 叫做常数操作 一个算法流程中 常数操作数量的指标 就是常数操作在算法里总共有多少次 称为时间复杂度 常用O 读作big O 来表示 具体来说