【基础算法】分治算法 & C++实现

简介: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。下面的硬币问题就是分治算法的一种典型算法题。

简要介绍:


       分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。下面的硬币问题就是分治算法的一种典型算法题。


●硬币问题


       在下面我们将硬币分为1和0两个值,1为真硬币,0为假硬币。找偶数枚硬币和奇数枚硬币将其随机排成一列,其中有一个假硬币,用分治算法寻找出这枚假硬币所在的位置。如下两图所示:


当硬币个数为偶数时(10枚):

a97c4e4ce3335ad80ea6256860d479d1_c98c1b0a6ad84168a195efba835a4dbd.png

当硬币个数为奇数时(13枚):

1ac08754c04a78c002bd62e4dd1a5cd2_9e0abdc0a8364362a112b82553da0221.png

代码实现:

#include<iostream>
using namespace std;
#define maxsize 20
class fenzhi {
public:
  int falsecoin(int low, int high);
  void showresult();
  int num;
  int coin[maxsize];
  int result;
};
int fenzhi::falsecoin(int low, int high)
{
  int sum1=0;
  int sum2=0;
  int sum3=0;
  if (low + 1 == high)  //只有两枚硬币
  {
  if (coin[low] < coin[high])
  {
    result = low + 1;
    return result;
  }
  else
  {
    result = high + 1;
    return result;
  }
  } 
  //分治算法
  if((high-low+1)%2==0)  //n是偶数
  { 
  for (int i = low; i <= low+(high-low)/2; i++)
  {
    sum1 += coin[i];//前半段和
  }
  for (int j = low + (high - low) / 2+1; j <= high; j++)
  {
    sum2 += coin[j];//后半段和
  }
  if (sum1 > sum2)
  {
    result = falsecoin(low + (high - low) / 2 + 1, high); //递推后半段
    return result;
  }
  else if(sum1 < sum2)
  {
    result = falsecoin(low, low + (high - low) / 2); //递推前半段
    return result;
  }
  }
  else  //n是奇数
  {
  for (int i = low;i<=low+(high-low)/2-1;i++)
  {
    sum1 += coin[i];   //中位数的前半段和
  }
  for (int j = low + (high - low) / 2+1; j <= high; j++)
  {
    sum2 += coin[j];   //中位数的后半段和
  }
  sum3 = coin[low + (high - low) / 2];   //中位数
  if (sum1 > sum2)      //前半段和大于后半段和
  {
    result = falsecoin(low + (high - low) / 2 + 1, high);//递推后半段
    return result;
  }
  else if (sum1 < sum2)   //前半段和小于后半段和
  {
    result = falsecoin(low, low + (high - low) / 2 - 1);//递推前半段
    return result;
  }
  if (sum1 + sum3 == sum2 + sum3)    //前半段和加中位数等于后半段和加中位数,所以中位数为目标寻找值
  {
    result = low + (high - low) / 2+1;
    return result;
  }
  }
}
void fenzhi::showresult()
{
  cout << "假币所在的位置:" << this->result << endl;
}
void text()
{
  fenzhi fz;
  cout << "输入硬币的总数目:" << endl;
  cin >> fz.num;
  cout << "请输入硬币的真假(1真/0假):" << endl;
  for (int i = 0; i < fz.num; i++)
  {
  cin >> fz.coin[i];
  }
  fz.falsecoin(0, fz.num - 1);
  fz.showresult();
}
int main()
{
  text();
}

ae37b88c97841913d7aeef0503643991_ad8961e3d0a74333bfba4bc5baec10c9.png

目录
相关文章
|
2月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
72 1
|
4月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
117 15
|
4月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
2月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
87 17
|
5月前
|
算法 搜索推荐 Java
算法系列之分治算法
分治算法(Divide and Conquer)是一种解决复杂问题的非常实用的策略,广泛应用于计算机科学中的各个领域。它的核心思想是将一个复杂的问题分解成若干个相同或相似的子问题,递归地解决这些子问题,然后将子问题的解合并,最终得到原问题的解。分治算法的典型应用包括归并排序、快速排序、二分查找等。
170 72
 算法系列之分治算法
|
1月前
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
37 0
|
3月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
82 4
|
4月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
77 8
|
5月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
77 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
6月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
210 2