当前位置: 首页 > news >正文

C++ 数据结构算法 学习笔记(33) -查找算法及企业级应用

C++ 数据结构算法 学习笔记(33) -查找算法及企业级应用

数组和索引

日常生活中,我们经常会在电话号码簿中查阅“某人”的电话号码,按姓查询或者按字母排 序查询;在字典中查阅“某个词”的读音和含义等等。在这里,“电话号码簿”和“字典”都可 看作一张查找表,而按“姓”或者“字母”查询则是按索引查询!

在这里插入图片描述

索引把线性表分成若干块,每一块中的元素存储顺序是任意的,但是块与块间必须按关键字 大小按顺序排列。即前一块中的最大关键字值小于后一块中的最小关键字值。 分块以后,为了快速定义块,还需要建立一个索引表,索引表中的一项对应于线性表中的一 块,索引项由键域和链域组成。键域存放相应关键字的键值,链域存放指向本块第一个节点和最 后一个节点的指针,索引表按关键字由小到大的顺序排列!

数组是特殊的块索引(一个块一个元素):

在这里插入图片描述

哈希表是非常经典的块索引!

在这里插入图片描述

分块查找的算法分两步进行,首先确定所查找的节点属于哪一块,即在索引表中查找其所在的块, 然后在块内查找待查询的数据。由于索引表是递增有序的,可采用二分查找,而块内元素是无序 的,只能采用顺序查找。(块内元素较少,则不会对执行速度有太大的影响

二分查找

二分查找法实质上是不断地将有序数据集进行对半分割,并检查每个分区的中间元素。再重 复根据中间数确定目标范围并递归实行对半分割,直到中间数等于待查找的值或是目标数不在搜 索范围之内!

#include <iostream>
#include <string>using namespace std;int int_compare(const void* key1, const void* key2)
{const int* ch1 = (const int*) key1;const int* ch2 = (const int*) key2;return (*ch1 - *ch2);
}int char_compare(const void* key1, const void* key2)
{const char* ch1 = (const char*)key1;const char* ch2 = (const char*)key2;return (*ch1 - *ch2);
}int BinarySearch(void* sorted, int len, int elemSize, void* search, int (*compare)(const void *key1, const void *key2))
{int left = 0; int right = 0;int middle = 0;left = 0;right = len - 1;while (left <= right){int ret = 0;middle = (left + right) / 2;ret = compare(static_cast<char *>(sorted)+(elemSize*middle), search);if (ret ==0){return middle;}else if (ret >0){right = middle - 1;}else{left = middle + 1;}}return -1;
}int main()
{ int arr[] = { 1,3,7,9,11 };int search[] = {0,1,7,2,11,12};for (int i = 0; i < sizeof(search) / sizeof(search[0]); i++){int index = BinarySearch(arr, sizeof(arr) / sizeof(arr[0]),sizeof(int), & search[i], &int_compare);cout << "The result is: " << index << endl;}char arr1[] = { 'a','c','d','f','j' };char search1[] = {'0','a','e','j','z'};cout << endl;cout << "Char searching..." << endl;for (int i = 0; i < sizeof(search1) / sizeof(search1[0]); i++){int index = BinarySearch(arr1, sizeof(arr1) / sizeof(arr1[0]),sizeof(char), & search1[i], &char_compare);cout << "The result is: " << index << endl;}system("pause");return 0;
}

穷举搜索

有20枚硬币,可能包括4种类型:1元、5角、1角和5分。

已知20枚硬币的总价值为10元,求各种硬币的数量。 例如:4、11、5、0就是一种方案。

而8、2、10、0是另一个可能的方案,显然方案并不是 唯一的,请编写程序求出类似这样的不同的方案一共有多少种?

(1)编程思路。 直接对四种类型的硬币的个数进行穷举。其中,1元最多10枚、5角最多20枚、1角最多 20枚、5分最多20枚。

如果以元为单位,则5角、1角、5分会化成浮点型数据,容易计算出错。可以将1 元、5角、1角、5分变成100分、50分、10分和5分,从而全部采用整型数据处理。

#include <iostream>
#include <string>using namespace std;int main()
{int a100 = 0; //one dollar coinint a50 = 0;int a10 = 0;int a5 = 0;int cnt = 0;for (a100 = 0; a100 <= 10; a100++){for (a50 = 0; a50 <=(1000-a100*100)/50; a50++){for (a10 = 0; a10 <= (1000-a100*100-a50*50)/10; a10++){for (a5 = 0; a5 <= (1000 - a100 * 100 - a50 * 50 - a10*10) / 5; a5++){if ((a100 * 100 + a50 * 50 + a10 * 10 + a5 * 5) == 1000 && (a100 + a50 + a10 + a5) == 20){cout << a100 << "," << a50 << "," << a10 << "," << a5 << "," << endl;cnt++;}}}}}cout << "The total method to have the $10 dollar with 20 coin is: " << cnt << endl;system("pause");return 0;
}

穷举法(枚举法)的基本思想是:列举出所有可能的情况,逐个判断有哪些是符合问题所要求 的条件,从而得到问题的全部解答。 它利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检 查,从中找出符合要求的答案。

用穷举算法解决问题,通常可以从两个方面进行分析:

(1)问题所涉及的情况:问题所涉及的情况有哪些,情况的种数必须可以确定。把它描述 出来。应用穷举时对问题所涉及的有限种情形必须一一列举,既不能重复,也不能遗漏。重复列 举直接引发增解,影响解的准确性;而列举的遗漏可能导致问题解的遗漏。

(2)答案需要满足的条件:分析出来的这些情况,需要满足什么条件,才成为问题的答案。 把这些条件描述出来。

并行搜索

并发的基本概念

所谓并发是在同一实体上的多个事件同时发生。并发编程是指在在同一台计算机上“同时” 处理多个任务。

在这里插入图片描述

要理解并发编程,我们必须要理解如下一些基本概念: 计算机就像一座工厂,时刻在运行,为人类服务。它的核心是CPU,它承担了所有的计算任 务,就像工厂的一个现场指挥官。

在这里插入图片描述

进程就像工厂里的车间,承担“工厂”里的各项具体的“生产任务”,通常每个进程对应一 个在运行中的执行程序,比如,QQ和微信运行的时候,他们分别是不同的进程。

因为特殊原因,现场指挥官人才短缺,整个工厂只有一个指挥官,一次只能指导一个车间生 产,而所有的车间都必须要有现场指挥官在场才能生产。也就是说,一个车间开工的时候, 其他车间都必须停工。

背后的含义:任一时刻,单个CPU一次只能运行一个进程,此时其他进程处于非运行状态。

在这里插入图片描述

一个车间(进程)可以包括多条生产线,线程就好比车间(进程)里的生产线。所有生产线 (设备和人)都属于同一车间的资源,受车间统一调度和调配,并共享车间所有资源(如空 间或洗手间)。

背后的含义:一个进程可以拥有多个线程,每个线程可以可以独立并行执行,多个线程共 享同一进程的资源,受进程管理。

在这里插入图片描述

理解了以上这些概念后,我们接下来再继续讲解并行搜索的概念: 假设我们要从很大的一个无序的数据集中进行搜索,

假设我们的机器可以一次性容纳这么多 数据。从理论上讲,对于无序数据,如果不考虑排序,已经很难从算法层面优化了。而利用 上面我们提到的并行处理思想,我们可以很轻松地将检索效率提升多倍。具体实现思路如下: 将数据分成N个块,每个块由一个线程来并行搜索。

#include <iostream>
#include <string>
#include <Windows.h>
#include <time.h>using namespace std;#define TEST_SIZE	(1024*1024*200)
#define NUMBER	20typedef struct _search 
{int* data;size_t start;size_t end;size_t count;
}search;//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 < 10; j++)
//	{
//		for (int i = 0; i < TEST_SIZE; i++)
//		{
//			if (data[i] == NUMBER)
//			{
//				count++;
//			}
//		}
//	}
//
//	time(&end);
//	cout << "The time used for the search function is: " << end - start << endl;
//	system("pause");
//	return 0;
//}DWORD WINAPI ThreadProc(void* lpParam)
{search* s = (search*)lpParam;time_t start, end;cout << "The new thread is executing..." << endl;time(&start);for (int j = 0; j < 10; j++){for (size_t i = s->start; i < s->end; i++){if (s->data[i] == NUMBER){s->count++;}}}time(&end);cout << "The required time to searching the data is: " << end - start << endl;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; //Thread 1 identityHANDLE hThread1; //Thread 1 handleDWORD threadID2; //Thread 2 identityHANDLE hThread2; //Thread 2 handlecout << "Creating the threads..." << endl;hThread1 = CreateThread(NULL, 0, ThreadProc, &s1, 0, &threadID1); //Creating first threadhThread2 = CreateThread(NULL, 0, ThreadProc, &s2, 0, &threadID2); // Creating second threadWaitForSingleObject(hThread1, INFINITE);WaitForSingleObject(hThread2, INFINITE);cout << "The process is waiting the thread to return..." << endl;cout << "The total count for the search value is: " << s1.count + s2.count << endl;system("pause");return 0;
}

相关文章:

C++ 数据结构算法 学习笔记(33) -查找算法及企业级应用

C 数据结构算法 学习笔记(33) -查找算法及企业级应用 数组和索引 日常生活中&#xff0c;我们经常会在电话号码簿中查阅“某人”的电话号码&#xff0c;按姓查询或者按字母排 序查询&#xff1b;在字典中查阅“某个词”的读音和含义等等。在这里&#xff0c;“电话号码簿”和…...

【Linux】在Ubuntu 16.04上安装Gerrit + PostgreSQL + Apache服务

Gerrit是一个基于Git版本控制系统的运行于Web浏览器上的Code Review工具&#xff0c;本文叙述如何在Ubuntu 16.04上安装Gerrit服务。&#xff08;当然安装Gerrit的方法有很多&#xff0c;本文只是其中之一&#xff09; 文章目录 前提安装PostgreSQL数据库并创建用户下载、配置和…...

数据倾斜那些事儿

目录 一、什么是数据倾斜&#xff1f; 二、预判与预防 三、躲闪策略 四、硬刚策略 一、什么是数据倾斜&#xff1f; 之前在大厂当了好几年的sqlboy&#xff0c;数据倾斜这个“小烦人精”确实经常在工作中出没。用简单的话来说&#xff0c;数据倾斜就像是“贫富差距”在数据…...

python考试成绩管理与分析:从列表到方差

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、考试成绩的输入与列表管理 二、成绩的总分与平均成绩计算 三、成绩方差的计算 四、成…...

Excel某列中有不连续的数据,怎么提取数据到新的列?

这里演示使用高级筛选的例子&#xff1a; 1.设置筛选条件 在D2单元格输入公式&#xff1a;COUNTA(A4)>0 这里有两个注意事项&#xff1a; *. 公式是设置在D2单元格&#xff0c;D1单元格保持为空&#xff0c; **. 为什么公式中选A4单元格&#xff0c;A列的第一个数据在A3…...

翻译《The Old New Thing》- What does it mean when a display change is temporary?

What does it mean when a display change is temporary? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080104-00/?p23923 Raymond Chen 2008年01月04日 什么叫临时性的显示设置变更&#xff1f; 当您调用ChangeDisplaySettings函数时…...

【C语言】char,short char,long char分别是多少字节,多少位,多少bit

一&#xff0c;char&#xff0c;short char&#xff0c;long char分别是多少字节 在 C 语言中&#xff0c;char、short、int、long 这些数据类型的大小是平台相关的&#xff0c;它们的大小取决于编译器和操作系统的实现。然而&#xff0c;它们的大小通常遵循以下规则&#xff…...

新V 系首批订单交付!苏州金龙助新疆游骏文旅集团打造旅运新标杆

热播剧集《我的阿勒泰》收官不久&#xff0c;6月新疆旅游旺季将至。 2024年5月下旬&#xff0c;苏州金龙海格客车新V系首批30辆正式交付新疆客户&#xff01; 作为苏州金龙海格客车新V系首批用户&#xff0c;新疆游骏文旅集团董事长王红强表示&#xff1a;“海格新V系从外观、…...

【Django】从零开始学Django【2】

五. CBV视图 Django植入了视图类这一功能&#xff0c;该功能封装了视图开发常用的代码&#xff0c;无须编写大量代码即可快速完成数据视图的开发&#xff0c;这种以类的形式实现响应与请求处理称为CBV(Class Base Views)。 1. 数据显示视图 数据显示视图是将后台的数据展示…...

【leetcode--383赎金信(使用Counter一行代码结束战斗)】

magazine中的字母组成一封赎金信&#xff0c;一个字母只能被用一次&#xff0c;看是否能完成制定赎金信 灵神思路&#xff1a;使用python内置Counter def canConstruct(self, ransomNote: str, magazine: str) -> bool:return Counter(ransomNote) < Counter(magazine) …...

pdf打开方式怎么设置默认?分享这几种设置方法

pdf打开方式怎么设置默认&#xff1f;你是否曾遇到过打开PDF文档时&#xff0c;默认的打开程序并非你所需要的&#xff0c;从而影响了工作效率&#xff1f;别担心&#xff0c;本文将为你详细解读如何设置PDF的默认打开方式&#xff0c;让你的工作更加高效便捷。 首先&#xff0…...

杂谈|RestFul和http的区别

前言 今天和我一组的小伙伴&#xff0c;在对接一个接口时&#xff0c;客户将DELETED请求设置了body参数&#xff0c;导致一个功能反复搞了半天&#xff0c;今天就来说下这两者的区别 1.HTTP概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;是一种用于从WWW&…...

Nginx的Sub模块

Nginx 是一款高性能的 Web 服务器和反向代理服务器,其灵活的模块化设计使其成为许多开发者和运维人员的首选。其中,Sub 模块作为 Nginx 的一部分,提供了强大的字符串替换和正则匹配功能,本文将深入探讨 Sub 模块的用途、示例以及使用中需要注意的事项。 1. Sub 模块的用途…...

使用大模型做应用的一些问题

使用了一段时间的大模型应用&#xff0c;遇到一些问题&#xff0c;分享给大家。 使用大模型的基本情况 使用了下面三种大模型&#xff1a; 百度 ERNIE-3 kimi 大模型 chatGPT3.5 使用的大模型应用架构&#xff1a; langchainlangchain RAGlangchain Agentvector 数据…...

2024 前端面试每日1小时

三日 1. 如何理解Vue的模板编译原理 Vue的模板编译实际就是将模板字符串通过解析、优化和代码生成等步骤转换为渲染函数的过程。这个过程中&#xff0c;AST扮演了非常重要的角色&#xff0c;它用树形结构描述了模板的内容和结构&#xff0c;是编译过程的核心数据结构&#xff…...

2024.05.22学习记录

1、面经复习&#xff1a; Vue组件通讯、vuex、js严格模式、options请求、vue3 Setup 语法糖、React hook 2、代码随想录刷题&#xff1a;动态规划 3、rosebush组件库 完成Alert和Alert测试 Menu组件初步开发...

Redis与数据库同步指南:订阅Binlog实现数据一致性

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是29岁的小米,一名积极活泼、热爱分享技术的开发者。今天,我们来聊聊分布式系统中的一个重要话题——分布式一致性,特别是数据库和R…...

Spring MVC+mybatis 项目入门:旅游网(二) dispatcher与controller与Spring MVC

个人博客&#xff1a;Spring MVCmybatis 项目入门:旅游网&#xff08;二&#xff09;dispatcher与controller与Spring MVC | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代…...

深入了解数据库与Java数据类型映射

在数据库开发和Java编程中&#xff0c;理解不同数据类型之间的映射关系对于开发高效且可靠的应用程序至关重要。数据库和Java都有各自的一套数据类型系统&#xff0c;能够正确地映射这些数据类型有助于避免数据丢失、性能问题以及其他潜在的错误。本文将详细探讨常见的数据库数…...

深刻解析 volatile 关键字和线程本地存储ThreadLocal

1.volatile关键字在Java多线程编程中的重要性 在多线程编程中&#xff0c;volatile关键字扮演着至关重要的角色&#xff0c;它确保了变量在多个线程间的可见性&#xff0c;并且能防止指令重排序&#xff0c;从而达到线程安全的目的。 1.1 保证多线程环境下变量的可见性 在Ja…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...