【算法设计】递归与分治算法设计——二分搜索、假币识别问题(C++实现)

news2024/12/30 2:20:39

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多算法分析与设计知识专栏:算法分析🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述


目录

  • 一、二分搜索问题
    • 问题描述
    • 算法思想和解题思路
    • C++代码
  • 二、假币识别问题
    • 问题描述
    • 算法思想和解题思路
    • C++代码

一、二分搜索问题

二分搜索解题框架见:【算法】分治法的基本思想和二分搜索的应用

问题描述

a[0:n-1]是已排好序的数组

试改写二分搜索算法,使得当搜索元素x不在数组a中时,返回小于的最大元素的位置i大于x的最小元素的位置j

当搜索元素x在数组a中时,返回x在数组中的位置,此时i和j相同

算法思想和解题思路

先将有序数组分成两部分,中间位置mid为基准值

  • 若该值等于目标值key,则直接返回

  • 若该值大于目标值,则在左半部分进行二分搜索

  • 若该值小于目标值,则在右半部分进行二分搜索

循环执行二分搜索,直到左侧low标记大于右侧high标记,跳出循环则为查找失败,此时的begin就是比x大的最小数组元素下标,end就是比x小的最大元素数组下标

二分算法运作的核心理念是将数组分割为两部分,然后根据所查找或排序的元素与中间元素的比较结果,将查找或排序的范围缩小一半

C++代码

#include <iostream>
using namespace std;
/*
二分搜索问题:设a[0:n-1]是已排好序的数组。试改写二分搜索算法,
使得当搜索元素x不在数组a中时,返回小于x的最大元素的位置i和大于x的最小元素的位置j;
当搜索元素x在数组a中时,返回x在数组中的位置,此时i和j相同。
*/
void binarySearch(int arr[],int target)
{
	int length = 7;
	int left = 0;
	int right = length - 1;
	if (target < arr[0]) {
		cout << "比x大的最小数组元素的下标是0" << endl;
		cout << "不存在比x小的数组元素" << endl;
		return;
	}
	else if (target > arr[length - 1]) {
		cout << "不存在比x大的数组元素" << endl;
		cout << "比x小的最大数组元素的下标是" << right << endl;
		return;
	}
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] == target) {
			cout << "与x相等的数据元素的下标是" << mid << endl;
			return;
		}
		else if (arr[mid] < target) {
			left = mid + 1;
		}
		else {
			right = mid - 1;
		}
	}
	cout << "比x大的最小数组元素的下标是" << left << endl;
	cout << "比x小的最大数组元素的下标是" << right << endl;
	return ;
}

int main()
{
	int a[] = { 2,3,4,5,6,8,9 };
	binarySearch(a, 7);
	binarySearch(a, 4);

	return 0;
}

在这里插入图片描述

二、假币识别问题

问题描述

一个袋子里有n个硬币,其中一枚是假币,假币和真币外观一模一样,仅凭肉眼无法区分,但是已知假币比真币轻一些

试设计识别假币的分治算法

算法思想和解题思路

先判断当前硬币数量是奇数还是偶数

  • 如果硬币数量是偶数,那么我们需要做的是检查这些硬币是否只有两枚。如果是,那么比较这两枚硬币的重量,较轻的那枚就是假币。如果没有只有两枚硬币,那么我们将这些硬币分成两堆,比较这两堆的重量,轻的那堆中会有假币。

  • 如果硬币数量是奇数,我们需要做的是取出中间的那枚硬币。然后,将剩余的硬币分成两部分。如果这两部分的重量相等,那么假币就是我们之前取出的中间那枚。如果这两部分的重量不相等,就重复到只有两个硬币比较重量,轻的一个就是假币

分治法将一个问题分解为多个子问题,并递归地解决这些子问题,最后将子问题的解合并为原问题的解

C++代码

#include <iostream>  
using namespace std;

// 判断硬币是否为假币  
bool isfake(int coin[], int n, int i) {
    for (int j = 0; j < i; j++) {
        if (coin[j] < coin[i]) {
            return true;
        }
    }
    for (int j = i + 1; j < n; j++) {
        if (coin[j] < coin[i]) {
            return true;
        }
    }
    return false;
}
// 识别假币的分治算法  
void search(int coin[], int n) {
    if (n == 2) {
        // 当硬币数量为2时,输出重量较轻的硬币  
        if (coin[0] < coin[1]) {
            cout << coin[0] << endl;
        }
        else {
            cout << coin[1] << endl;
        }
    }
    else if (n % 2 == 0) {
        // 当硬币数量为偶数时,将硬币分成两段,并比较两段的平均重量  
        int mid = n / 2;
        if (isfake(coin, n, mid)) {
            search(coin, mid);
        }
        else {
            search(coin + mid, n - mid);
        }
    }
    else {
        // 当硬币数量为奇数时,去掉中间的硬币,将剩余的硬币分成两段,并比较两段的平均重量  
        int mid = (n - 1) / 2;
        if (isfake(coin, n, mid + 1)) {
            search(coin, mid + 1);
        }
        else {
            search(coin + mid + 1, n - mid - 1);
        }
    }
}

int main() {
    int arr[4] = { 2,4,2,5 };
    search(arr, 4);
    return 0;
}

在这里插入图片描述


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

一个对接第三方会员充值平台的小程序方案

偶尔看到淘宝网上腾讯会员充值等服务卖的很火,所以在找有没有第三方平台的充值接口可以用呢,还真找到了,做简单的对接,前端VUE,后端springBoot抓取会员商品列表。 由于个人未开通支付渠道,不能进一步对接支付,分享出来,有兴趣的同学可以继续对接支付商用。 后端代码,主…

【JAVA学习一:基础语法】

记录学习过程和代码编写&#xff0c;小白纯属记录。 目录 一、运算符 二、数组 三、面向对象 一、运算符 赋值运算符 public class Demo01 { public static void main(String[] args){ System.out.println(11); System.out.println(1-1); System.out.printl…

Java8 BiConsumer<T, U> 函数接口浅析分享(含示例,来戳!)

文章目录 Java8 BiConsumer<T, U> 函数接口浅析分享&#xff08;含示例&#xff0c;来戳&#xff01;&#xff09;源码accept 方法示例示例一示例二 andThen 方法示例示例一示例二 示例相关代码类dohandler 方法student.javaStudentScore.javaStudentScoreDto.java Java8…

Redbook Chapter 7: Query Optimization翻译批注

首先说明一下redbook上的几篇文章是做什么的。这几篇文章是通过几位作者对不同方面的论文进行阅读和筛选后&#xff0c;挑出其中具备代表性或者权威的论文来做分析&#xff0c;为读者提供阅读指导和建议&#xff0c;同时&#xff0c;也是对某个方面的论文进行高度的总结&#x…

决策树完成图片分类任务

数据集要求&#xff1a; 训练集 和 验证集 &#xff08;要求分好&#xff09; 图片放置规则 &#xff1a; 一个总文件夹 放类别名称的子文件夹 其中子文件夹 为存放同一类别图片 举个例子 分类动物 则 总文件夹名称为动物 子文件夹为 猫 狗 猪猪 。。。 其中猫的文件夹里面…

关于设置图标

1. exe图标 visual studio给编译的exe程序添加程序图标的方法_vs编译的exe图标-CSDN博客 2.窗口图标和任务栏图标 setWindowIcon 3.任务管理器的图标 外部是exe的图标&#xff0c;内部是窗口图标。

更改idea的JDK版本

有时候我们需要更改 idea 的 JDK 版本&#xff0c;这里告诉大家更改的方法&#xff0c;非常简单快捷&#xff0c;而且也不需要去找 JDK 的资源 1.在 idea 的左上角找到 File 选择 Peoject Structure 2.在页面左上角找到 Project &#xff0c;点击 SDK 的框&#xff0c;选择 A…

动态规划之买卖股票全解析【通俗易懂】

文章目录 前言一、无限制数1、无限次买入卖出且无手续费2、无限次买入卖出且无手续费&#xff0c;但是有冷冻期3、无限次买入卖出但是有手续费4、只能买卖一次 二、有限制数 前言 买卖股票问题是动态规划中最经典的问题我把这一类问题分为两大类。一类是没有限制的&#xff0c…

【java源码】医院绩效考核系统源码 支持主流的“成本法”、“工作量法”、“平衡计分卡法”的绩效方案

医院绩效考核系统源码 &#xff0c;&#xff08;有项目应用案例&#xff09;可适应医院多种绩效核算方式。 医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件。系统和his系统进行对接&#xff0c;按照设定周期…

Node编写用户注册接口

目录 前言 创建服务器 编写注册接口API 创建路由对象&#xff0c;将路由对象导出去 将路由对象导出到服务器中 判断用户发起注册请求时是否输入账号或密码 验证表单数据 在数据库中创建表 在node中绑定mysql数据库 判断用户注册的账号密码是否已经被注册 密码加密 完…

Redis详细安装教程

一、Redis 的安装及启动停止 1-1 下载 redis的压缩包 wget https://download.redis.io/releases/redis-5.0.14.tar.gz1-2 开始解压 redis tar -zxvf redis-5.0.14.tar.gz1-3 执行 make 命令编译 make PREFIX/usr/redis install &#xff08;如果不加prefix 默认安装到/usr/…

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters2. 解决参考 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters …

【API篇】六、Flink输出算子Sink

文章目录 1、输出到外部系统2、输出到文件3、输出到KafKa4、输出到MySQL&#xff08;JDBC&#xff09;5、自定义Sink输出 Flink做为数据处理引擎&#xff0c;要把最终处理好的数据写入外部存储&#xff0c;为外部系统或应用提供支持。与输入算子Source相对应的&#xff0c;输出…

docker部署rabbitmq的坑

背景 今天用docker部署rabbitmq&#xff0c;启动都一起正常&#xff0c;但是当访问15672端口时&#xff0c;不能加载出页面。 排查 1.防火墙是否开启 ufw status2.ip是否能ping通 ping 192.168.x.x3.检查docker日志 docker psdocker logs -f 容器id4.进入容器&#xff0c…

Visual Studio Code (VS Code)安装教程

Visual Studio Code&#xff08;简称“VS Code”&#xff09;。 1.下载安装包 VS Code的官网&#xff1a; Visual Studio Code - Code Editing. Redefined 首先提及一下&#xff0c;vscode是不需要破解操作的&#xff1b; 第一步&#xff0c;看好版本&#xff0c;由于我的系…

性能测试连载-负载场景模型构建

业务需求 假设公司领导现在给你分配了一个性能测试需求如下&#xff1a; 1&#xff1a;公司有1000人在上班时间段会登录平台进行打卡操作&#xff0c;可能会登录打卡多次 2&#xff1a;业务高峰时间段在8:00-8:30&#xff0c;半小时 3&#xff1a;需要保证90%用户的响应时间在…

GB28181学习(十二)——报警事件通知和分发

要求 发生报警事件时&#xff0c;源设备将报警信息发送给SIP服务器&#xff1b;报警事件通知和分发使用MESSAGE方法&#xff1b;源设备包括&#xff1a; SIP设备网关SIP客户端联网系统综合接处警系统以及卡口系统 目标设备包括&#xff1a; 具有接警功能的SIP客户端联网系统综…

【斗破年番】官方终于回应,萧潇删减不属实,两线索佐证,彩鳞咖位不会降

【侵权联系删除】【文/郑尔巴金】 斗破苍穹年番动画虽然火爆&#xff0c;但是问题也很多&#xff0c;动不动就上演一出魔改&#xff0c;引发粉丝们的疯狂吐槽。先是萧炎与美杜莎女王的陨落心炎失身戏份遭删减&#xff0c;如今当萧炎回蛇人族&#xff0c;又魔改了美杜莎女王怀孕…

06、Python 序列 与 列表 与 元组 的关系和创建 和 简单使用

目录 序列元组与列表关系总结 创建元组与列表方式一创建元组注意点 创建元组与列表方式二简单使用通过索引访问元素子序列序列加法序列乘法in运算 了解Python序列 创建列表和元组 通过索引访问元素 子序列 序列运算 序列 所谓序列&#xff0c;指的是一种包含多项数据的数据结…

【面试经典150 | 链表】循环链表

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;哈希集合方法二&#xff1a;快慢指针方法三&#xff1a;计数 拓展其他语言python3 写在最后 Tag 【快慢指针】【哈希集合】【计数】【链表】 题目来源 141. 环形链表 题目解读 判断一个链表中是否存在环。 解题思路 …