数据结构三大算法(案例解析)

2023-11-10

概述

本文讲述数据结构中最常用到的三大算法:分治法动态规划法贪心算法,主要从这些算法的经典案例入手来对算法进行分析和理解。

分治法

分治法可以通俗的理解为将一条大鱼分成好几块,分别料理每一块鱼肉,然后再组成一道菜。也就是说分治法是将一个大的问题分成好多个小的问题,这些小问题解决后从而解决整个大问题,在处理过程中这些小问题的处理方法可以不尽相同。我们从下面这个案例来进行进一步的分析和理解。

问题描述

a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,ij相同,均为x在数组中的位置。

算法思路与设计

把问题简化为在n个元素的集合中找最大最小值,将这n个数分为两组,分别找出最大值和最小值。然后递归分解直到每组的个数小于等于2。利用二分搜索的思想,在数组中查找关键字xlowtop为数组头尾下标。当low<=top时,如果x等于数组中间值,则表示x在数组中,返回下标i,j;如果x大于数组中间值,则low等于中间值+1,如果x小于中间值,则top等于中间值+1,经过不断循环,直到low大于top;如果还是没找到x,则把top复制给i,low赋值给j,然后返回下标i,j。完整代码如下。

#include<stdio.h>
int search(int a[],int length, int x)
{
int i = 0, j = 0;
int s= -1;
int top = length - 1;
	int mid = 0;
	int low = 0;
	while (low <= top)
	{
		mid = (low + top) / 2;
		if (a[mid] == x)
		{
			s = mid;
		}
		if (a[mid] < x)
		{
			low = mid + 1;
		}
		else
		{
			top = mid - 1;
		}
	}	
	if (s == -1)
	{
		i = top;
		j = low;
	}
	else
	{
		i = s;
		j = i;
	}
	printf("%d %d",i,j);
	return 0;
}
int main()
{
	int arr[100];
	int x,n;
	scanf("%d %d",&n,&x);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	search(arr,n,x);
	return 0;
}

动态规划法

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。

问题描述

给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i

算法思路与设计

动态规划就是一个填表的过程。现在有1个背包,背包容量是10,有5个物品,编号为1,2,3,4,5,他们都有各自的重量和价格。要求在不超过背包容量的情况下,使背包装载物品的价值最大。我们可以吧问题拆分为五个子问题。 我们可以将1,2,3,4,5子问题的答案都存入一张表中。因为求解2子问题,需要用到1子问题的答案(2的每一步方案要与1的每一步方案比较,如何2的该步方案优于1所对应的方案。则将2的这步方案标为可行。如果不优于1的,或者不满足问题的约束条件,则舍弃该方案。继续沿用该步所对应的1的方案作为该步的方案)。求解3子问题,需要用到2子问题的答案,一直递推到求解5子问题,需要用到4子问题的答案。而5子问题就是原问题。5子问题的答案就是最终原问题的解。完整代码如下:
实验结果

输入案例:
5 10
2 6
2 3
6 5
5 4
4 6

	输出结果:15
#define EMPTY
#include<stdio.h>
#include <iostream>
using namespace std ; 
 int main()
 {
	int V ,T;
	scanf("%d %d",&T,&V);
 	int f[V+1],w[100],c[100];
 	
 	for(int m=0;m<T;m++){
	 scanf("%d",&c[m]);
 	 scanf("%d",&w[m]);
	 }
 const int INF = -66536  ;
 #ifdef EMPTY
    for(int i = 0 ; i <= V ;i++)
      f[i] = 0 ;    
 #else
    f[0] = 0 ;
    for(int i = 1 ; i <= V ;i++)
      f[i] = INF ;   
 #endif
    
    for(int i = 0 ; i < T ; i++)
    {
      for(int v = V ; v >= c[i] ;v--)
         {              
           f[v] = max(f[v-c[i]] + w[i] , f[v]);
         }                 
    }
    cout<<f[V];
    return 0;        
 }

贪心算法

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。

问题描述

有n头牛(1<=n<=50,000)要挤奶。给定每头牛挤奶的时间区间A,B。牛需要呆在畜栏里才能挤奶。一个畜栏同一时间只能容纳一头牛。问至少需要多少个畜栏,才能完成全部挤奶工作。(在同一个畜栏的两头牛,它们挤奶时间区间不能在端点重合)

算法思路与设计

我们可以把每头牛的挤奶时间按开始时间递增或者按结束时间递赠排序,求出一个最大的能兼容这些时间区间的子集,从而把这些牛安排早一个畜栏中;如果还有未安排完的奶牛,即将其时间集合再求其最大的子集,再把它们安排在这第二个畜栏中。如此一直排到安排完为止,而这些子集的个数也就是畜栏的最小个数。完整代码如下:
实验结果

输入样例:

5

1 10

2 4

3 6

5 8

4 7

输出样例:

4

//判断区间是否重叠 
bool isOverlap(int x[999][2], int i, int j,int s[]) {
	if (x[i][0] > x[j][1] || x[i][1] < x[j][0]) {
		for (int m = j + 1; m < i; m++) {
			if (s[m] == s[j] && isOverlap(x, i, m, s))
				return true;
		}
		return false;
	}
	else
		return true;
}
//贪心 
void Greedy(int x[999][2]) {
	int s[999] = { 0 };
	for (int i=0; i < 7; i++) {
		for (int j = 0; j < i; j++) {
			if (!isOverlap(x, i, j,s)) {
				s[i] = s[j];
				break;
			}
			else {
				continue;
			}
		}
		if (s[i] == 0) 
			s[i] = maxNum(s) + 1;
	}
	cout << maxNum(s)<< endl; //所需的畜栏个数
	for (int i = 0; i < 7; i++) {
		cout << s[i] << endl;//每头牛对应的畜栏
	}
}
//畜栏个数 
int maxNum(int x[]) {
	int max = x[0];
	for (int i = 1; i < 7; i++) {
		if (max < x[i]) {
			max = x[i];
		}
	}
	return max;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构三大算法(案例解析) 的相关文章

随机推荐

  • STM32F103ZET6【标准库函数开发】------17 DMA实验

    STM32F103ZET6有2个DMA控制器 DMA1有7个通道 DMA2有5个通道 各个通道对应的外设如下
  • Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed解决方法

    前言 Android Studio 升级到最新版本后 构建项目时 构建失败 出现错误 Caused by org codehaus groovy control MultipleCompilationErrorsException star
  • MySQL的null与not null

    相信很多用了mysql很久的人 对这两个字段属性的概念还不是很清楚 一般会有以下疑问 我字段类型是not null 为什么我可以插入空值 为毛not null的效率比null高 判断字段不为空的时候 到底要 select from tabl
  • IDEA报错:Cannot start compilation: the output path is not specified for module “testSvnKit“.Specify th

    IDEA报错Cannot start compilation the output path is not specified for module testSvnKit Specify the output path in the Pro
  • List分组的两种方式

    java8之前List分组 假设有个student类 有id name score属性 list集合中存放所有学生信息 现在要根据学生姓名进行分组 public Map
  • 精确径向基(matlab工具箱)

    原文地址 精确径向基 matlab工具箱 作者 神经网络之家 作者 梁小h 日期 2015 10 26 09 30 47 0 lt 文档仅供查阅和简单了解 深入了解请关注神经网络之家发布的 神经网络教学视频 gt 精确径向基神经网络在mat
  • HTML详解连载(5)

    HTML详解连载 5 专栏链接 link http t csdn cn xF0H3 下面进行专栏介绍 开始喽 行高 设置多行文本的间距 属性名 属性值 行高的测量方法 行高 垂直居中 技巧 字体族 属性名 属性值 示例 扩展 font 复合
  • 学期总结-2018年上

    从现在开始 我需要养成一个写作的好习惯 之所以培养这个习惯 是因为 我开始发现我的一个重大缺陷 语言表达能力的欠缺 这种能力 在一般生活中并不会有太大的作用 而且很多时候 大部分人都体会不到其所带来的 破坏 这种破坏 会让你的交际陷入阻塞
  • 不能向服务器考文件,如何往云服务器考文件

    如何往云服务器考文件 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 无法正常使用Cloud init 弹性云服务器获取M
  • 关于python爬虫逆向RPC的基础使用

    makeRequest function a b c d rpc使用的代码 function 防止重复创建websocket if window flagLX else window weiboLX makeRequest var ws n
  • egg初始化搭建swagger项目

    步骤 安装node 安装你喜欢的编辑器 初始化项目 输入安装 egg 命令 输入安装 egg dev 命令 修改 package json 基本目录结构 需手动创建 输入安装 egg sequelize 命令 数据库选择 配置 sequel
  • Android移动开发-调用摄像头进行拍照的实现

    现在Android智能手机的像素都会提供照相的功能 大部分的手机的摄像头的像素都在1000万以上的像素 有的甚至会更高 它们大多都会支持光学变焦 曝光以及快门等等 下面的程序Demo实例示范了使用Camera v2来进行拍照 当用户按下拍照
  • Windows修改MySQL数据库密码(修改或忘记密码)

    今天练习远程访问数据库时 为了方便访问 就想着把数据库密码改为统一的 以后我们也会经常遇到MySQL需要修改密码的情况 比如密码太简单 忘记密码等等 在这里我就借鉴其他人的方法总结几种修改MySQL密码的方法 我就以实际操作修改root密码
  • Android:安卓学习笔记之MVP模式的简单理解和使用

    Android MVP模式的简单理解和使用 MVP模式 1 为什么使用MVP模式 1 1 实例说明 2 一步步让你理解MVP 2 1 MVP实现第一步 将页面拆分为M V P三个模块 2 2 MVP实现第2步 使用接口通信 进一步解耦 2
  • 高并发中的惊群问题

    目录 1 惊群效应是什么 2 惊群效应消耗了什么 3 惊群的几种情况 3 1 accept惊群 新版内核已解决 3 2 epoll create 在 fork 之前创建 3 3 epoll create 在 fork 之后创建 4 Linu
  • caffe-fast-rcnn 错误解决途径

    CAFFE深度学习交流群 532629018 root ubuntu usr local fast rcnn caffe fast rcnn make j16 CXX src caffe syncedmem cpp CXX src caff
  • Altium Designer修改3D视图时PCB板的颜色

    首先切换到PCB文件下 打开3D预览视图 快捷键为数字3 或者依次点击 视图 切换到3维模式 之后点击 拖拽进度条 或从选颜色即可
  • listbox控件用法详解

    http blog sina com cn s blog 61e2b6280100svtp html 1 属性列表 SelectionMode 组件中条目的选择类型 即多选 Multiple 单选 Single Rows 列表框中显示总共多
  • 数据库系统原理实验(实习)报告——单表查询

    一 实验目的 1 掌握select语句的基本语法和查询条件表示方法 2 掌握数据汇总方法 3 掌握group by子句的作用和使用方法 4 掌握having子句的作用和使用方法 5 掌握order by子句的作用和使用方法 二 实验内容与步
  • 数据结构三大算法(案例解析)

    概述 本文讲述数据结构中最常用到的三大算法 分治法 动态规划法和贪心算法 主要从这些算法的经典案例入手来对算法进行分析和理解 分治法 分治法可以通俗的理解为将一条大鱼分成好几块 分别料理每一块鱼肉 然后再组成一道菜 也就是说分治法是将一个大