【数据结构与算法】并行搜索

news2024/11/15 18:04:28

并行搜索目录

  • 一.并行的基础知识
    • 1.进程
    • 2.线程
  • 二.正常遍历搜索
  • 三.线程并发搜索
    • 1.线程身份证和句柄
    • 2.创建线程
    • 3.搜索结构体
    • 4.处理函数实现
  • 四.完整代码

一.并行的基础知识

1.进程

说的简单点,进程就是计算机中的多个程序,就相当于多个软件.
比如我同时打开QQ和WX,那么这个就叫做并发.
像现在的计算机一般都是多CUP.
可以并发处理程序,速度非常快.
像以前只有一个CPU的时候,要想处理多个软件时,只能通过时间片,来处理,就是这个CPU一会处理这个软件,一会处理那个软件,只不过速度太快,我们没有反应过来,以为是同时进行的.

2.线程

一个进程也就是一个软件,同时也有着多个线程,每个线程可以独立并行执行,多个线程共享同一进程资源,受进程管理.
那么并行搜索就是在此基础上实现的.

二.正常遍历搜索

咱们定义这个大数组,在里面找NUMBER这个值.
在这里插入图片描述
因为搜索太快了,都不到1秒,所以我又重新遍历了50遍.

int main()
{
	int* data = NULL;
	int count = 0;//记录的数量
	data = new int[TEST_SIZE];
	
	for (int i = 0; i < TEST_SIZE; i++)
	{
		data[i] = i;
	}
	
	time_t start=0, end=0;//记录开始和结束的时间搓
	time(&start);
	for (int j = 0; j < 50; j++)
	{
		for (int i = 0; i < TEST_SIZE; i++)
		{
			if (data[i] == NUMBER)
			{
				count++;
			}
		}
	}
	time(&end);
	printf("查找所花的时间:%lld\n", end - start);

	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

三.线程并发搜索

我们现在来创建两个线程来帮我们打工,数组分成两部分同时进行遍历.

1.线程身份证和句柄

每个线程都有自己的ID.
在这里插入图片描述

2.创建线程

CreateThread函数返回的是HANDLE.
创建线程的目的就是要去处理某些事情,那么在程序中就是函数.
ThreadProc是我们要处理的自定义函数.
&s1就是自定义处理函数的参数
最后一个参数就是是那个线程.
在这里插入图片描述

3.搜索结构体

我们将搜索范围定义成了结构体.
在这里插入图片描述
将两部分位置初始化给search结构体.
在这里插入图片描述

4.处理函数实现

线程的函数,我圈的地方是固定的.
void*需要强制类型才能使用.
在这里插入图片描述
运行结果:
在这里插入图片描述
线程是同时进行的,所以完成搜索只用了6秒,刚刚普通的是用了9秒.

四.完整代码

#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <time.h>

#define TEST_SIZE (1024*1024*200)
#define NUMBER 20

typedef struct _search
{
	int* data;//搜索的数据集
	size_t start;//搜索的开始位置
	size_t end;//搜索的终止位置
	size_t count;//搜索的结结果
}search;

DWORD WINAPI ThreadProc(void* lpParam)
{
	search* s = (search*)lpParam;
	time_t start, end;
	printf("新的线程开始了...\n");
	time(&start);
	for (int j = 0; j < 50; j++)
	{
		for (size_t i = s->start; i < s->end; i++)
		{
			if (s->data[i] == NUMBER)
			{
				s->count++;
			}
		}
	}
	time(&end);
	printf("查找所花的时间:%lld\n", end - start);

	return 0;
}

int main()
{
	int* data = NULL;
	int count = 0;
	int mid = 0;
	search s1, s2;
	data = new int[TEST_SIZE];
	for (int i = 0; i < TEST_SIZE; i++)
	{
		data[i] = i;
	}
	mid = TEST_SIZE / 2;
	s1.data = data;
	s1.start = 0;
	s1.end = mid;
	s1.count = 0;

	s2.data = data;
	s2.start = mid + 1;
	s2.end = TEST_SIZE - 1;
	s2.count = 0;


	DWORD threadID1;//线程1的身份证
	HANDLE hThread1;//线程1的句柄

	DWORD threadID2;//线程2的身份证
	HANDLE hThread2;//线程2的句柄

	printf("创建线程......\n");
	//创建线程1
	hThread1 = CreateThread(NULL, 0, ThreadProc, &s1, 0, &threadID1);

	//创建线程2
	hThread2 = CreateThread(NULL, 0, ThreadProc, &s2, 0, &threadID2);

	WaitForSingleObject(hThread1, INFINITE);
	WaitForSingleObject(hThread2, INFINITE);

	printf("线程完毕!count:%d\n",s1.count+s2.count);
	system("pause");
	return 0;
}


int main1()
{
	int* data = NULL;
	int count = 0;//记录的数量
	data = new int[TEST_SIZE];
	
	for (int i = 0; i < TEST_SIZE; i++)
	{
		data[i] = i;
	}
	
	time_t start=0, end=0;//记录开始和结束的时间搓
	time(&start);
	for (int j = 0; j < 50; j++)
	{
		for (int i = 0; i < TEST_SIZE; i++)
		{
			if (data[i] == NUMBER)
			{
				count++;
			}
		}
	}
	time(&end);
	printf("查找所花的时间:%lld\n", end - start);

	system("pause");
	return 0;
}

这个是等待线程的结束,INFINITE是一直等待,int类型的最大值.
不加这个的话,main函数会先执行完.
就是进程和线程是同时进行的,加了这个进程会等待线程完成才进行往下走.
在这里插入图片描述

2024年8月21日11:28:29

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

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

相关文章

基于yolov5 人体行为检测 对 跌倒 站立 蹲下 坐下 跑 五种行为检测目标检测

该项目使用YOLOv5深度学习框架来检测图像或视频中人体的五种基本行为&#xff1a;跌倒、站立、蹲下、坐下和跑步。YOLOv5&#xff08;You Only Look Once v5&#xff09;是一种高效的物体检测模型&#xff0c;能够快速准确地识别出图像中的目标。本项目具有以下特点&#xff1a…

秋招力扣Hot100刷题总结——动态规划

一、01背包 01背包问题中&#xff0c;遍历顺序可以是先物品后背包&#xff0c;也可以是先背包后物品&#xff0c;但是背包要倒序遍历。 1. 等和子集 题目要求&#xff1a;给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使…

【芯智雲城】星宸科技Sigmastar SSD101芯片_高清显示解决方案

一、方案描述&#xff1a; Sigmastar SSD101是高度集成高性能的display controller,支持模拟的NTSC/PAL/SECAM CVBS和S-video信号输入,可自动检测视频信号源和模式&#xff0c;可自如地切换不同的信号源,内置2D梳状滤波器和AGC,支持6-bit/8-bit TTL/TCON显示屏。芯片LQFP 64pi…

基于大型语言模型的应急人机协同救援关键技术

源自&#xff1a;指挥与控制学报 作者&#xff1a;石响 王天乐 夏乾臣 陈善广 注&#xff1a;若出现显示不完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 人工智能、大数据、多模态大模型、计算机视觉、自然语言处理、数字孪生、深度强化学习 课程…

大屏畅玩游戏,小米SU7迎来大升级,可连接蓝牙游戏手柄

嘿&#xff0c;朋友们&#xff01;今天我要和你们分享一个令人兴奋的消息。 小米SU7汽车迎来了一次重大升级&#xff0c;这不仅仅是技术上的飞跃&#xff0c;更是为驾驶体验带来了革命性的变化。想象一下&#xff0c;在宽敞的车内&#xff0c;通过连接蓝牙游戏手柄&#xff0c…

R语言绘图系列专栏 | 更新中

关于**《R语言绘图专栏》**&#xff0c;此专栏基于R语言绘制图形。每个图形我们会提供对应的R代码、数据和文本文档。此系列将会是一个长期更新的系列。 本系列教程&#xff0c;我们计划发表及收录使用R语言绘制50科研中常用图形。这是个长期的过程&#xff0c;计划花费3-4个的…

graphrag论文

目录 摘要1 介绍2 图 RAG 方法与流程2.1 源文档 → 文本块2.2 文本块 → 元素实例2.3 元素实例 → 元素摘要2.4 元素摘要 → 图社区2.5 图社区 → 社区摘要2.6 社区摘要 → 社区答案 → 全局答案 3 评估3.1 数据集3.2 查询3.3 条件3.4 指标3.5 配置3.6 结果 4 相关工作4.1 RAG …

深度解析DeepMind乒乓球AI:从AlphaGo到AlphaPingPong的进化之路

引言 谷歌DeepMind在AI研究领域再次取得重大突破&#xff0c;最新推出的乒乓球AI机器人已经能够击败人类选手。这一成就标志着AI从单纯的智力游戏&#xff08;如AlphaGo&#xff09;向物理运动竞技场的转移&#xff0c;充分展示了AI在体育竞技中的潜力。这款AI机器人不仅在击败…

【无标题】Image-to-Image Translation 图像风格迁移中的成对图像拼接代码

引 言 在图像风格迁移任务中&#xff0c;近几年比较火热的Generative Adversarial Nets (GAN)模型以及各种变体深受视觉研究团体的青睐&#xff0c;在具体任务中取得比较不错的实验表现。在有监督图像风格迁移任务迁移中&#xff0c;需要输入给模型成对的图片&#xff08;一个来…

中国气膜技术蓬勃发展:专业公司脱颖而出

气膜技术最早起源于美国&#xff0c;凭借其低造价、快速安装、可移动、可重复使用等独特优势&#xff0c;迅速成为体育、仓储、展览、会议、传媒等行业的首选临时或简易室内空间解决方案。21世纪以来&#xff0c;中国逐步引进并发展了膜结构技术&#xff0c;包括骨架膜、张拉膜…

Spire.PDF for .NET【文档操作】演示:创建 PDF 组合

PDF 作品集是一组文件&#xff0c;其中可以包含文本文档、电子表格、电子邮件、图像、PowerPoint 演示文稿和绘图。尽管 PDF 作品集将不同类型的文件组合成一个单元&#xff0c;但其中的每个文件都保留了其原始格式、分辨率和大小。在本文中&#xff0c;您将学习如何使用Spire.…

音频分割软件有什么?最方便的音频分割软件分享给你

一段长音频就像是一本厚重的百科全书&#xff0c;而音频剪辑师的任务&#xff0c;就是要将这本书拆分成数个章节&#xff0c;每章都有其独立的主题和内容&#xff0c;这非常考验剪辑师们的音频分割技巧。 幸运的是&#xff0c;随着技术的发展&#xff0c;市面上出现了许多优秀…

Dell Precision3591 自带RTX2000 Ada + 雷索坞外界3090显卡

问题&#xff1a; 插上雷索坞之后会自动安装驱动&#xff0c;但是自带的驱动可能跟当前的操作系统不兼容&#xff0c;所以安装失败&#xff0c;同时把自带的独立显卡的驱动给搞坏 解决办法&#xff1a; 先把自带的Ada 显卡驱动disable 然后找到跟系统匹配的驱动 GeForce Ga…

考研交流平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

上交2024最新-《动手学大模型》实战教程及ppt分享!

本课介绍 今天分享一个上海交大的免费的大模型课程&#xff0c;有相关教程文档和Slides&#xff0c;目前是2.2K星标&#xff0c;还是挺火的&#xff01; 《动手学大模型》系列编程实践教程&#xff0c;由上海交通大学2024年春季《人工智能安全技术》课程&#xff08;NIS3353&…

使用IDEA开发Java Web项目

下载Tomcat 首先&#xff0c;下载Apache Tomcat并解压到本地计算机&#xff0c;可存放于任何位置。 另外&#xff0c;需要在系统中环境JRE_HOME环境变量&#xff0c;以保证Tomcat可以正常启动&#xff0c;具体配置方式请参考其它教程。 创建Java Web项目 在IntelliJ IDEA的欢…

Swift 数据类型之可选值类型(Optional)详解

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

其实很多数据资产平台建设,没有抓住本质

其实很多企业都有建设所谓的数据资产管理平台&#xff0c;但本质没有抓住&#xff0c;叫数据管理平台可能更为贴切。原因就是大部分企业谈数据资产&#xff0c;都是泛泛而谈&#xff0c;什么是数据资产都没有弄明白&#xff0c;就先把功能开发好&#xff0c;设计出来。这种本末…

《黑神话·悟空》提高了多少游戏人的热情

《黑神话&#xff1a;悟空》的发布极大地提振了游戏人的热情&#xff0c;不管是国内游戏的带动&#xff0c;还是全球国产游戏的崛起&#xff0c;开启了国产3A游戏元年&#xff0c;下面我从主要两个大点来分析下。 玩家层面&#xff1a; 高度热情加强力追捧&#xff1a;从 202…

如何在算家云搭建模型MimicMotion(运动模仿)

MimicMotion &#xff08;运动模仿&#xff09;是具有置信感知姿势指导的高质量人体运动视频生成模型。只需要上传一张人物照片&#xff0c;然后再上传一段人物的舞蹈或者动作视频&#xff0c;就可以生成以照片中人物为原型的动作或者舞蹈视频。它可以在任何运动引导下生成任意…